@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.
Files changed (77) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE.md +5 -0
  3. package/README.md +71 -0
  4. package/config.schema.json +246 -0
  5. package/dist/config.d.ts +423 -0
  6. package/dist/config.d.ts.map +1 -0
  7. package/dist/config.js +343 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/errors.d.ts +32 -0
  10. package/dist/errors.d.ts.map +1 -0
  11. package/dist/errors.js +41 -0
  12. package/dist/errors.js.map +1 -0
  13. package/dist/extraction-worker.d.ts +2 -0
  14. package/dist/extraction-worker.d.ts.map +1 -0
  15. package/dist/extraction-worker.js +38 -0
  16. package/dist/extraction-worker.js.map +1 -0
  17. package/dist/fetcher.d.ts +5 -0
  18. package/dist/fetcher.d.ts.map +1 -0
  19. package/dist/fetcher.js +173 -0
  20. package/dist/fetcher.js.map +1 -0
  21. package/dist/http.d.ts +54 -0
  22. package/dist/http.d.ts.map +1 -0
  23. package/dist/http.js +372 -0
  24. package/dist/http.js.map +1 -0
  25. package/dist/index.d.ts +14 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +14 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/migration-worker.d.ts +2 -0
  30. package/dist/migration-worker.d.ts.map +1 -0
  31. package/dist/migration-worker.js +60 -0
  32. package/dist/migration-worker.js.map +1 -0
  33. package/dist/migration.d.ts +19 -0
  34. package/dist/migration.d.ts.map +1 -0
  35. package/dist/migration.js +221 -0
  36. package/dist/migration.js.map +1 -0
  37. package/dist/providers.d.ts +9 -0
  38. package/dist/providers.d.ts.map +1 -0
  39. package/dist/providers.js +210 -0
  40. package/dist/providers.js.map +1 -0
  41. package/dist/redaction.d.ts +9 -0
  42. package/dist/redaction.d.ts.map +1 -0
  43. package/dist/redaction.js +161 -0
  44. package/dist/redaction.js.map +1 -0
  45. package/dist/runtime.d.ts +20 -0
  46. package/dist/runtime.d.ts.map +1 -0
  47. package/dist/runtime.js +205 -0
  48. package/dist/runtime.js.map +1 -0
  49. package/dist/schemas.d.ts +49 -0
  50. package/dist/schemas.d.ts.map +1 -0
  51. package/dist/schemas.js +64 -0
  52. package/dist/schemas.js.map +1 -0
  53. package/dist/services.d.ts +20 -0
  54. package/dist/services.d.ts.map +1 -0
  55. package/dist/services.js +2 -0
  56. package/dist/services.js.map +1 -0
  57. package/dist/stash.d.ts +65 -0
  58. package/dist/stash.d.ts.map +1 -0
  59. package/dist/stash.js +490 -0
  60. package/dist/stash.js.map +1 -0
  61. package/dist/tool-contracts.d.ts +104 -0
  62. package/dist/tool-contracts.d.ts.map +1 -0
  63. package/dist/tool-contracts.js +71 -0
  64. package/dist/tool-contracts.js.map +1 -0
  65. package/dist/tools.d.ts +23 -0
  66. package/dist/tools.d.ts.map +1 -0
  67. package/dist/tools.js +134 -0
  68. package/dist/tools.js.map +1 -0
  69. package/dist/utf8.d.ts +2 -0
  70. package/dist/utf8.d.ts.map +1 -0
  71. package/dist/utf8.js +14 -0
  72. package/dist/utf8.js.map +1 -0
  73. package/dist/worker.d.ts +12 -0
  74. package/dist/worker.d.ts.map +1 -0
  75. package/dist/worker.js +45 -0
  76. package/dist/worker.js.map +1 -0
  77. package/package.json +63 -0
package/dist/config.js ADDED
@@ -0,0 +1,343 @@
1
+ import { join, resolve } from 'node:path';
2
+ import { ConfigResolutionError, createCacheConfigPatchSchema, createCacheConfigSchema, createConfigRegistry, defineConfigContribution, resolveConfig, } from '@neottia/config';
3
+ import { z } from 'zod';
4
+ import { SearchableError } from './errors.js';
5
+ import { searchableEndpointUrlSchema } from './schemas.js';
6
+ export const SEARCHABLE_CONFIG_FILE_ENV = 'NEOTTIA_CONFIG_FILE';
7
+ export const SEARCHABLE_MODULE_CONFIG_FILE_ENV = 'NEOTTIA_SEARCHABLE_CONFIG_FILE';
8
+ export const SEARCHABLE_SHARD_PATH_ENV = 'NEOTTIA_CONFIG_SEARCHABLE_PATH';
9
+ export const DEFAULT_SEARCHABLE_SHARD_PATH = 'skills.searchable';
10
+ export const DEFAULT_SEARCHABLE_CONFIG_FILE = '.neottia/config.yml';
11
+ const CREDENTIAL_REFERENCE = /^\$\{[A-Za-z_][A-Za-z0-9_]*\}$/u;
12
+ const SAFE_RELATIVE_PATH = /^(?!\.{1,2}(?:\/|$))(?!.*(?:^|\/)\.{1,2}(?:\/|$))(?!\/)(?![A-Za-z]:)[^\\\0\r\n]+$/u;
13
+ const nonblank = z.string().trim().min(1).regex(/\S/u, 'must not be blank');
14
+ const credentialValue = z.string().min(1);
15
+ const credentialReference = z.string().regex(CREDENTIAL_REFERENCE, 'must be an exact ${ENV_VAR} reference');
16
+ const positiveIntegerAtMost = (maximum) => z.number().int().positive().max(maximum);
17
+ const fetchStrategies = z
18
+ .array(z.enum(['direct', 'jina', 'wayback']))
19
+ .min(1)
20
+ .max(3)
21
+ .refine((values) => new Set(values).size === values.length, 'strategies must be unique')
22
+ .meta({ uniqueItems: true });
23
+ function createSearchableConfigSchema(credential) {
24
+ return z
25
+ .object({
26
+ enabled: z.boolean().default(false),
27
+ root: z.string().min(1).max(1024).regex(SAFE_RELATIVE_PATH).default('.neottia/searchable'),
28
+ search: z
29
+ .object({
30
+ provider: z.enum(['duckduckgo', 'google', 'bing', 'brave']).default('duckduckgo'),
31
+ limit: z.number().int().min(1).max(100).default(5),
32
+ timeout_ms: z.number().int().positive().max(300_000).default(10_000),
33
+ credentials: z
34
+ .object({
35
+ google_api_key: credential.optional(),
36
+ google_cse_id: credential.optional(),
37
+ bing_api_key: credential.optional(),
38
+ brave_api_key: credential.optional(),
39
+ })
40
+ .strict()
41
+ .prefault({}),
42
+ bing_api_endpoint: searchableEndpointUrlSchema.default('https://api.bing.microsoft.com/v7.0/search'),
43
+ })
44
+ .strict()
45
+ .prefault({}),
46
+ fetch: z
47
+ .object({
48
+ strategies: fetchStrategies.default(['direct', 'jina', 'wayback']),
49
+ timeout_ms: positiveIntegerAtMost(300_000).default(10_000),
50
+ overall_timeout_ms: positiveIntegerAtMost(600_000).default(20_000),
51
+ max_response_bytes: positiveIntegerAtMost(10 * 1024 * 1024).default(10 * 1024 * 1024),
52
+ })
53
+ .strict()
54
+ .prefault({}),
55
+ grep: z
56
+ .object({
57
+ limit: z.number().int().min(1).max(100).default(5),
58
+ snippet_bytes: z.number().int().min(64).max(16_384).default(512),
59
+ })
60
+ .strict()
61
+ .prefault({}),
62
+ ask: z
63
+ .object({
64
+ limit: z.number().int().min(1).max(100).default(3),
65
+ context_bytes: z
66
+ .number()
67
+ .int()
68
+ .min(256)
69
+ .max(4 * 1024 * 1024)
70
+ .default(128 * 1024),
71
+ })
72
+ .strict()
73
+ .prefault({}),
74
+ ollama: z
75
+ .object({
76
+ endpoint: searchableEndpointUrlSchema.default('http://localhost:11434'),
77
+ model: nonblank.default('llama3'),
78
+ timeout_ms: positiveIntegerAtMost(600_000).default(60_000),
79
+ })
80
+ .strict()
81
+ .prefault({}),
82
+ cache: createCacheConfigSchema(),
83
+ security: z
84
+ .object({
85
+ limits: z
86
+ .object({
87
+ max_query_bytes: positiveIntegerAtMost(16 * 1024).default(16 * 1024),
88
+ max_url_bytes: positiveIntegerAtMost(8 * 1024).default(8 * 1024),
89
+ max_title_bytes: positiveIntegerAtMost(4 * 1024).default(4 * 1024),
90
+ max_content_bytes: positiveIntegerAtMost(10 * 1024 * 1024).default(10 * 1024 * 1024),
91
+ max_results: positiveIntegerAtMost(100).default(100),
92
+ max_result_bytes: positiveIntegerAtMost(4 * 1024 * 1024).default(4 * 1024 * 1024),
93
+ max_storage_bytes: positiveIntegerAtMost(256 * 1024 * 1024).default(256 * 1024 * 1024),
94
+ })
95
+ .strict()
96
+ .prefault({}),
97
+ })
98
+ .strict()
99
+ .prefault({}),
100
+ })
101
+ .strict();
102
+ }
103
+ function createSearchableConfigPatchSchema(credential) {
104
+ return z
105
+ .object({
106
+ enabled: z.boolean().optional(),
107
+ root: z.string().min(1).max(1024).regex(SAFE_RELATIVE_PATH).optional(),
108
+ search: z
109
+ .object({
110
+ provider: z.enum(['duckduckgo', 'google', 'bing', 'brave']).optional(),
111
+ limit: z.number().int().min(1).max(100).optional(),
112
+ timeout_ms: z.number().int().positive().max(300_000).optional(),
113
+ credentials: z
114
+ .object({
115
+ google_api_key: credential.optional(),
116
+ google_cse_id: credential.optional(),
117
+ bing_api_key: credential.optional(),
118
+ brave_api_key: credential.optional(),
119
+ })
120
+ .strict()
121
+ .optional(),
122
+ bing_api_endpoint: searchableEndpointUrlSchema.optional(),
123
+ })
124
+ .strict()
125
+ .optional(),
126
+ fetch: z
127
+ .object({
128
+ strategies: fetchStrategies.optional(),
129
+ timeout_ms: positiveIntegerAtMost(300_000).optional(),
130
+ overall_timeout_ms: positiveIntegerAtMost(600_000).optional(),
131
+ max_response_bytes: positiveIntegerAtMost(10 * 1024 * 1024).optional(),
132
+ })
133
+ .strict()
134
+ .optional(),
135
+ grep: z
136
+ .object({
137
+ limit: z.number().int().min(1).max(100).optional(),
138
+ snippet_bytes: z.number().int().min(64).max(16_384).optional(),
139
+ })
140
+ .strict()
141
+ .optional(),
142
+ ask: z
143
+ .object({
144
+ limit: z.number().int().min(1).max(100).optional(),
145
+ context_bytes: z
146
+ .number()
147
+ .int()
148
+ .min(256)
149
+ .max(4 * 1024 * 1024)
150
+ .optional(),
151
+ })
152
+ .strict()
153
+ .optional(),
154
+ ollama: z
155
+ .object({
156
+ endpoint: searchableEndpointUrlSchema.optional(),
157
+ model: nonblank.optional(),
158
+ timeout_ms: positiveIntegerAtMost(600_000).optional(),
159
+ })
160
+ .strict()
161
+ .optional(),
162
+ cache: createCacheConfigPatchSchema(),
163
+ security: z
164
+ .object({
165
+ limits: z
166
+ .object({
167
+ max_query_bytes: positiveIntegerAtMost(16 * 1024).optional(),
168
+ max_url_bytes: positiveIntegerAtMost(8 * 1024).optional(),
169
+ max_title_bytes: positiveIntegerAtMost(4 * 1024).optional(),
170
+ max_content_bytes: positiveIntegerAtMost(10 * 1024 * 1024).optional(),
171
+ max_results: positiveIntegerAtMost(100).optional(),
172
+ max_result_bytes: positiveIntegerAtMost(4 * 1024 * 1024).optional(),
173
+ max_storage_bytes: positiveIntegerAtMost(256 * 1024 * 1024).optional(),
174
+ })
175
+ .strict()
176
+ .optional(),
177
+ })
178
+ .strict()
179
+ .optional(),
180
+ })
181
+ .strict();
182
+ }
183
+ export const searchableConfigSchema = createSearchableConfigSchema(credentialValue);
184
+ export const searchableConfigFileSchema = createSearchableConfigSchema(credentialReference);
185
+ export const searchableConfigFilePatchSchema = createSearchableConfigPatchSchema(credentialReference);
186
+ export const searchableConfigRuntimePatchSchema = createSearchableConfigPatchSchema(credentialValue);
187
+ export const SEARCHABLE_ENV_BINDINGS = [
188
+ { path: 'enabled', names: ['NEOTTIA_SEARCHABLE_ENABLED'], kind: 'boolean' },
189
+ { path: 'root', names: ['NEOTTIA_SEARCHABLE_ROOT'], kind: 'string' },
190
+ { path: 'search.provider', names: ['NEOTTIA_SEARCHABLE_PROVIDER'], kind: 'string' },
191
+ { path: 'search.limit', names: ['NEOTTIA_SEARCHABLE_SEARCH_LIMIT'], kind: 'integer' },
192
+ { path: 'search.timeout_ms', names: ['NEOTTIA_SEARCHABLE_SEARCH_TIMEOUT_MS'], kind: 'integer' },
193
+ {
194
+ path: 'search.credentials.google_api_key',
195
+ names: ['NEOTTIA_SEARCHABLE_GOOGLE_API_KEY', 'GOOGLE_API_KEY'],
196
+ kind: 'string',
197
+ },
198
+ {
199
+ path: 'search.credentials.google_cse_id',
200
+ names: ['NEOTTIA_SEARCHABLE_GOOGLE_CSE_ID', 'GOOGLE_CSE_ID'],
201
+ kind: 'string',
202
+ },
203
+ {
204
+ path: 'search.credentials.bing_api_key',
205
+ names: ['NEOTTIA_SEARCHABLE_BING_API_KEY', 'BING_API_KEY'],
206
+ kind: 'string',
207
+ },
208
+ {
209
+ path: 'search.credentials.brave_api_key',
210
+ names: ['NEOTTIA_SEARCHABLE_BRAVE_API_KEY', 'BRAVE_API_KEY'],
211
+ kind: 'string',
212
+ },
213
+ {
214
+ path: 'search.bing_api_endpoint',
215
+ names: ['NEOTTIA_SEARCHABLE_BING_API_ENDPOINT', 'BING_API_ENDPOINT'],
216
+ kind: 'string',
217
+ },
218
+ { path: 'grep.limit', names: ['NEOTTIA_SEARCHABLE_GREP_LIMIT'], kind: 'integer' },
219
+ { path: 'ask.limit', names: ['NEOTTIA_SEARCHABLE_ASK_LIMIT'], kind: 'integer' },
220
+ { path: 'ollama.endpoint', names: ['NEOTTIA_SEARCHABLE_OLLAMA_URL', 'OLLAMA_URL'], kind: 'string' },
221
+ { path: 'ollama.model', names: ['NEOTTIA_SEARCHABLE_OLLAMA_MODEL', 'OLLAMA_MODEL'], kind: 'string' },
222
+ ];
223
+ const SEARCHABLE_SECRET_PATHS = [
224
+ ['search', 'credentials', 'google_api_key'],
225
+ ['search', 'credentials', 'google_cse_id'],
226
+ ['search', 'credentials', 'bing_api_key'],
227
+ ['search', 'credentials', 'brave_api_key'],
228
+ ];
229
+ const SEARCHABLE_CONFIG_DEFAULTS = searchableConfigSchema.parse({});
230
+ export const searchableConfigContribution = defineConfigContribution({
231
+ id: 'searchable',
232
+ path: ['modules', 'searchable'],
233
+ legacyPaths: [['skills', 'searchable']],
234
+ filePatchSchema: searchableConfigFilePatchSchema,
235
+ runtimePatchSchema: searchableConfigRuntimePatchSchema,
236
+ resolvedSchema: searchableConfigSchema,
237
+ defaults: SEARCHABLE_CONFIG_DEFAULTS,
238
+ environment: [
239
+ ...SEARCHABLE_ENV_BINDINGS.map(({ path, names, kind }) => ({
240
+ kind,
241
+ names: names,
242
+ path: path.split('.'),
243
+ })),
244
+ {
245
+ kind: 'boolean',
246
+ names: ['NEOTTIA_SEARCHABLE_FETCH_FALLBACK', 'WEB_FETCH_FALLBACK'],
247
+ path: ['fetch', 'strategies'],
248
+ parse: parseFetchFallback,
249
+ },
250
+ ],
251
+ secrets: SEARCHABLE_SECRET_PATHS.map((path) => ({ path })),
252
+ });
253
+ export function loadSearchableConfig(cwd, options = {}) {
254
+ const env = options.env ?? process.env;
255
+ const contribution = compatibilityContribution(env);
256
+ const registry = createConfigRegistry([contribution]);
257
+ const { env: _envOption, ...searchableOverrides } = options;
258
+ void _envOption;
259
+ try {
260
+ const snapshot = resolveConfig(registry, {
261
+ compatibility: {
262
+ ignoreUnregisteredPaths: true,
263
+ resolveOverrideSecretReferences: true,
264
+ },
265
+ cwd,
266
+ env,
267
+ overrides: { modules: { searchable: searchableOverrides } },
268
+ projectFile: env[SEARCHABLE_CONFIG_FILE_ENV] === undefined && env[SEARCHABLE_MODULE_CONFIG_FILE_ENV] !== undefined
269
+ ? resolveConfigFile(cwd, env)
270
+ : undefined,
271
+ });
272
+ return snapshot.get(contribution);
273
+ }
274
+ catch (error) {
275
+ if (!(error instanceof ConfigResolutionError))
276
+ throw error;
277
+ throw translateResolutionError(error);
278
+ }
279
+ }
280
+ export function resolveConfigFile(cwd, env = process.env) {
281
+ const configured = env[SEARCHABLE_CONFIG_FILE_ENV] ?? env[SEARCHABLE_MODULE_CONFIG_FILE_ENV];
282
+ return configured ? resolve(cwd, configured) : join(cwd, DEFAULT_SEARCHABLE_CONFIG_FILE);
283
+ }
284
+ export function resolveShardPath(env = process.env) {
285
+ const path = env[SEARCHABLE_SHARD_PATH_ENV] ?? DEFAULT_SEARCHABLE_SHARD_PATH;
286
+ if (!path.trim() || path.split('.').some((part) => !part)) {
287
+ throw new SearchableError('configuration', 'CONFIG_SHARD_INVALID', `${SEARCHABLE_SHARD_PATH_ENV} must be a dot-path.`);
288
+ }
289
+ return path;
290
+ }
291
+ function compatibilityContribution(env) {
292
+ const shardPath = resolveShardPath(env).split('.');
293
+ if (pathsEqual(shardPath, searchableConfigContribution.path) ||
294
+ searchableConfigContribution.legacyPaths?.some((path) => pathsEqual(path, shardPath)) === true) {
295
+ return searchableConfigContribution;
296
+ }
297
+ return defineConfigContribution({
298
+ ...searchableConfigContribution,
299
+ legacyPaths: [shardPath],
300
+ });
301
+ }
302
+ function parseFetchFallback(value) {
303
+ const normalized = value.trim().toLowerCase();
304
+ if (normalized === 'true' || normalized === '1')
305
+ return ['direct', 'jina', 'wayback'];
306
+ if (normalized === 'false' || normalized === '0')
307
+ return ['direct'];
308
+ throw new Error('invalid fetch fallback boolean');
309
+ }
310
+ function translateResolutionError(error) {
311
+ const first = error.diagnostics[0];
312
+ const messages = error.diagnostics.map((diagnostic) => {
313
+ const path = diagnostic.path === undefined ? '' : ` at ${diagnostic.path.join('.')}`;
314
+ const environment = diagnostic.source?.environment === undefined ? '' : ` (${diagnostic.source.environment})`;
315
+ const file = diagnostic.source?.file === undefined ? '' : ` in ${diagnostic.source.file}`;
316
+ return `${diagnostic.message}${path}${environment}${file}`;
317
+ });
318
+ return new SearchableError('configuration', resolutionSearchableCode(first?.code), `Invalid Searchable config: ${messages.join('; ')}`, error.diagnostics.flatMap((diagnostic) => (diagnostic.path === undefined ? [] : [diagnostic.path.join('.')])), {
319
+ diagnostics: error.diagnostics.map((diagnostic) => ({
320
+ code: diagnostic.code,
321
+ ...(diagnostic.path === undefined ? {} : { path: diagnostic.path.join('.') }),
322
+ })),
323
+ });
324
+ }
325
+ function resolutionSearchableCode(code) {
326
+ if (code === 'IO')
327
+ return 'CONFIG_READ_FAILED';
328
+ if (code === 'YAML')
329
+ return 'CONFIG_YAML_INVALID';
330
+ if (code === 'VERSION')
331
+ return 'CONFIG_VERSION_INVALID';
332
+ if (code === 'PATH' || code === 'MERGE')
333
+ return 'CONFIG_SHARD_INVALID';
334
+ if (code === 'ENVIRONMENT')
335
+ return 'CONFIG_ENV_INVALID';
336
+ if (code === 'SECRET')
337
+ return 'CREDENTIAL_REFERENCE_UNSET';
338
+ return 'CONFIG_SCHEMA_INVALID';
339
+ }
340
+ function pathsEqual(left, right) {
341
+ return left.length === right.length && left.every((segment, index) => segment === right[index]);
342
+ }
343
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { z } from 'zod';
2
+ export declare const searchableErrorCategorySchema: z.ZodEnum<{
3
+ configuration: "configuration";
4
+ validation: "validation";
5
+ resource_limit: "resource_limit";
6
+ cancelled: "cancelled";
7
+ service: "service";
8
+ }>;
9
+ export declare const searchableErrorSchema: z.ZodObject<{
10
+ category: z.ZodEnum<{
11
+ configuration: "configuration";
12
+ validation: "validation";
13
+ resource_limit: "resource_limit";
14
+ cancelled: "cancelled";
15
+ service: "service";
16
+ }>;
17
+ code: z.ZodString;
18
+ message: z.ZodString;
19
+ paths: z.ZodArray<z.ZodString>;
20
+ details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
21
+ }, z.core.$strict>;
22
+ export type SearchableErrorCategory = z.infer<typeof searchableErrorCategorySchema>;
23
+ export type SearchableErrorData = z.infer<typeof searchableErrorSchema>;
24
+ export declare class SearchableError extends Error {
25
+ readonly category: SearchableErrorCategory;
26
+ readonly code: string;
27
+ readonly paths: readonly string[];
28
+ readonly details?: Readonly<Record<string, unknown>> | undefined;
29
+ constructor(category: SearchableErrorCategory, code: string, message: string, paths?: readonly string[], details?: Readonly<Record<string, unknown>> | undefined);
30
+ }
31
+ export declare function serializeSearchableError(error: SearchableError): SearchableErrorData;
32
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,6BAA6B;;;;;;EAMxC,CAAC;AAGH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;kBAQvB,CAAC;AAEZ,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACpF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAGxE,qBAAa,eAAgB,SAAQ,KAAK;aAEtB,QAAQ,EAAE,uBAAuB;aACjC,IAAI,EAAE,MAAM;aAEZ,KAAK,EAAE,SAAS,MAAM,EAAE;aACxB,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAJ3C,QAAQ,EAAE,uBAAuB,EACjC,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,KAAK,GAAE,SAAS,MAAM,EAAO,EAC7B,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,YAAA;CAK9D;AAGD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,eAAe,GAAG,mBAAmB,CAQpF"}
package/dist/errors.js ADDED
@@ -0,0 +1,41 @@
1
+ import { z } from 'zod';
2
+ export const searchableErrorCategorySchema = z.enum([
3
+ 'configuration',
4
+ 'validation',
5
+ 'resource_limit',
6
+ 'cancelled',
7
+ 'service',
8
+ ]);
9
+ export const searchableErrorSchema = z
10
+ .object({
11
+ category: searchableErrorCategorySchema,
12
+ code: z.string().min(1),
13
+ message: z.string().min(1),
14
+ paths: z.array(z.string()),
15
+ details: z.record(z.string(), z.unknown()).optional(),
16
+ })
17
+ .strict();
18
+ export class SearchableError extends Error {
19
+ category;
20
+ code;
21
+ paths;
22
+ details;
23
+ constructor(category, code, message, paths = [], details) {
24
+ super(message);
25
+ this.category = category;
26
+ this.code = code;
27
+ this.paths = paths;
28
+ this.details = details;
29
+ this.name = 'SearchableError';
30
+ }
31
+ }
32
+ export function serializeSearchableError(error) {
33
+ return searchableErrorSchema.parse({
34
+ category: error.category,
35
+ code: error.code,
36
+ message: error.message,
37
+ paths: [...error.paths],
38
+ ...(error.details === undefined ? {} : { details: error.details }),
39
+ });
40
+ }
41
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC,IAAI,CAAC;IAClD,eAAe;IACf,YAAY;IACZ,gBAAgB;IAChB,WAAW;IACX,SAAS;CACV,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC;KACnC,MAAM,CAAC;IACN,QAAQ,EAAE,6BAA6B;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;CACtD,CAAC;KACD,MAAM,EAAE,CAAC;AAMZ,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAEtB;IACA;IAEA;IACA;IALlB,YACkB,QAAiC,EACjC,IAAY,EAC5B,OAAe,EACC,QAA2B,EAAE,EAC7B,OAA2C;QAE3D,KAAK,CAAC,OAAO,CAAC,CAAC;QANC,aAAQ,GAAR,QAAQ,CAAyB;QACjC,SAAI,GAAJ,IAAI,CAAQ;QAEZ,UAAK,GAAL,KAAK,CAAwB;QAC7B,YAAO,GAAP,OAAO,CAAoC;QAG3D,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAGD,MAAM,UAAU,wBAAwB,CAAC,KAAsB;IAC7D,OAAO,qBAAqB,CAAC,KAAK,CAAC;QACjC,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;QACvB,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;KACnE,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=extraction-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extraction-worker.d.ts","sourceRoot":"","sources":["../src/extraction-worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ import { parentPort, workerData } from 'node:worker_threads';
2
+ import { Readability } from '@mozilla/readability';
3
+ import { JSDOM } from 'jsdom';
4
+ import TurndownService from 'turndown';
5
+ function extract(job) {
6
+ const dom = new JSDOM(job.html, { url: job.finalUrl });
7
+ try {
8
+ const article = new Readability(dom.window.document).parse();
9
+ if (!article?.content)
10
+ throw new Error('EXTRACTION_FAILED');
11
+ const turndown = new TurndownService({ headingStyle: 'atx', codeBlockStyle: 'fenced' });
12
+ const content = turndown.turndown(article.content).trim();
13
+ if (!content)
14
+ throw new Error('EXTRACTION_FAILED');
15
+ if (Buffer.byteLength(content, 'utf8') > job.maximumContentBytes)
16
+ throw new Error('EXTRACTED_CONTENT_TOO_LARGE');
17
+ const requested = new URL(job.requestedUrl);
18
+ return {
19
+ title: (article.title || dom.window.document.title || requested.hostname).trim(),
20
+ content,
21
+ url: requested.href,
22
+ ...(article.excerpt ? { excerpt: article.excerpt } : {}),
23
+ ...(article.siteName ? { siteName: article.siteName } : {}),
24
+ source: job.source,
25
+ };
26
+ }
27
+ finally {
28
+ dom.window.close();
29
+ }
30
+ }
31
+ try {
32
+ parentPort?.postMessage({ result: extract(workerData) });
33
+ }
34
+ catch (error) {
35
+ const code = error instanceof Error ? error.message : 'EXTRACTION_FAILED';
36
+ parentPort?.postMessage({ error: code });
37
+ }
38
+ //# sourceMappingURL=extraction-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extraction-worker.js","sourceRoot":"","sources":["../src/extraction-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,eAAe,MAAM,UAAU,CAAC;AAoBvC,SAAS,OAAO,CAAC,GAAkB;IACjC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7D,IAAI,CAAC,OAAO,EAAE,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxF,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1D,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACnD,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,mBAAmB;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC5C,OAAO;YACL,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE;YAChF,OAAO;YACP,GAAG,EAAE,SAAS,CAAC,IAAI;YACnB,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,MAAM,EAAE,GAAG,CAAC,MAAM;SACnB,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED,IAAI,CAAC;IACH,UAAU,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,UAA2B,CAAC,EAAE,CAAC,CAAC;AAC5E,CAAC;AAAC,OAAO,KAAc,EAAE,CAAC;IACxB,MAAM,IAAI,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;IAC1E,UAAU,EAAE,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { type SearchableHttpTransport } from './http.js';
2
+ import type { SearchableOperationContext } from './services.js';
3
+ import type { SearchableToolOutput } from './tool-contracts.js';
4
+ export declare function fetchPage(transport: SearchableHttpTransport, requested: URL, context: SearchableOperationContext): Promise<SearchableToolOutput<'web_fetch'>>;
5
+ //# sourceMappingURL=fetcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../src/fetcher.ts"],"names":[],"mappings":"AAIA,OAAO,EAQL,KAAK,uBAAuB,EAC7B,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAIhE,wBAAsB,SAAS,CAC7B,SAAS,EAAE,uBAAuB,EAClC,SAAS,EAAE,GAAG,EACd,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAwB5C"}