@felan-ai/ext-web-access 0.4.2 → 0.5.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 (58) hide show
  1. package/NOTICE +0 -8
  2. package/README.md +131 -79
  3. package/dist/boundary.d.ts +1 -3
  4. package/dist/boundary.d.ts.map +1 -1
  5. package/dist/boundary.js +1 -19
  6. package/dist/boundary.js.map +1 -1
  7. package/dist/config.d.ts +4 -10
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +82 -36
  10. package/dist/config.js.map +1 -1
  11. package/dist/content-find.d.ts +19 -10
  12. package/dist/content-find.d.ts.map +1 -1
  13. package/dist/content-find.js +104 -70
  14. package/dist/content-find.js.map +1 -1
  15. package/dist/credentials.d.ts.map +1 -1
  16. package/dist/credentials.js +12 -6
  17. package/dist/credentials.js.map +1 -1
  18. package/dist/extract.d.ts +7 -7
  19. package/dist/extract.d.ts.map +1 -1
  20. package/dist/extract.js +237 -84
  21. package/dist/extract.js.map +1 -1
  22. package/dist/http.d.ts +3 -3
  23. package/dist/http.d.ts.map +1 -1
  24. package/dist/http.js +19 -5
  25. package/dist/http.js.map +1 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +444 -477
  28. package/dist/index.js.map +1 -1
  29. package/dist/pdf-service.d.ts +22 -0
  30. package/dist/pdf-service.d.ts.map +1 -0
  31. package/dist/pdf-service.js +61 -0
  32. package/dist/pdf-service.js.map +1 -0
  33. package/dist/providers.d.ts.map +1 -1
  34. package/dist/providers.js +191 -171
  35. package/dist/providers.js.map +1 -1
  36. package/dist/ssrf.d.ts +1 -0
  37. package/dist/ssrf.d.ts.map +1 -1
  38. package/dist/ssrf.js +36 -6
  39. package/dist/ssrf.js.map +1 -1
  40. package/dist/types.d.ts +5 -84
  41. package/dist/types.d.ts.map +1 -1
  42. package/dist/url.d.ts +2 -0
  43. package/dist/url.d.ts.map +1 -0
  44. package/dist/url.js +15 -0
  45. package/dist/url.js.map +1 -0
  46. package/package.json +7 -8
  47. package/dist/github.d.ts +0 -14
  48. package/dist/github.d.ts.map +0 -1
  49. package/dist/github.js +0 -374
  50. package/dist/github.js.map +0 -1
  51. package/dist/source-check.d.ts +0 -21
  52. package/dist/source-check.d.ts.map +0 -1
  53. package/dist/source-check.js +0 -136
  54. package/dist/source-check.js.map +0 -1
  55. package/dist/storage.d.ts +0 -19
  56. package/dist/storage.d.ts.map +0 -1
  57. package/dist/storage.js +0 -466
  58. package/dist/storage.js.map +0 -1
package/dist/github.js DELETED
@@ -1,374 +0,0 @@
1
- import { createHash } from 'node:crypto';
2
- import { join, posix } from 'node:path';
3
- import { positiveInteger, positiveNumber } from './config.js';
4
- import { combinedSignal, readJsonResponse } from './http.js';
5
- import { endpointSsrfSettings, fetchRemoteUrl } from './ssrf.js';
6
- const MAX_FILES = 200;
7
- const MAX_FILE_CHARACTERS = 100_000;
8
- const MAX_TOTAL_CHARACTERS = 750_000;
9
- const MAX_API_RESPONSE_BYTES = 8 * 1024 * 1024;
10
- const MAX_API_TREE_ENTRIES = 200;
11
- const FULL_COMMIT_SHA = /^[0-9a-f]{40}$/iu;
12
- const clonePromises = new Map();
13
- const checkoutAccess = new Map();
14
- const textDecoder = new TextDecoder('utf8', { fatal: true });
15
- const BINARY_EXTENSIONS = new Set([
16
- '.7z', '.avi', '.bin', '.bmp', '.class', '.dll', '.doc', '.docx', '.dylib', '.exe', '.gif', '.gz',
17
- '.ico', '.jar', '.jpeg', '.jpg', '.lockb', '.mov', '.mp3', '.mp4', '.o', '.otf', '.pdf', '.png',
18
- '.pyc', '.so', '.tar', '.ttf', '.wav', '.webm', '.webp', '.woff', '.woff2', '.xls', '.xlsx', '.zip',
19
- ]);
20
- const NOISE_DIRECTORIES = new Set(['.git', '.next', '.turbo', 'build', 'coverage', 'dist', 'node_modules', 'target', 'vendor']);
21
- export function parseGitHubUrl(rawUrl) {
22
- let url;
23
- try {
24
- url = new URL(rawUrl);
25
- }
26
- catch {
27
- return undefined;
28
- }
29
- if (url.hostname.toLowerCase() !== 'github.com')
30
- return undefined;
31
- let segments;
32
- try {
33
- segments = url.pathname.split('/').filter(Boolean).map((segment) => decodeURIComponent(segment));
34
- }
35
- catch {
36
- return undefined;
37
- }
38
- const [owner, rawRepo, kind, ref, ...path] = segments;
39
- const repo = rawRepo?.replace(/\.git$/u, '');
40
- if (!owner || !repo || !validSegment(owner) || !validSegment(repo))
41
- return undefined;
42
- if (kind !== undefined && kind !== 'tree' && kind !== 'blob')
43
- return undefined;
44
- if (kind && (!ref || !validSegment(ref) || path.some((segment) => !validPathSegment(segment))))
45
- return undefined;
46
- return {
47
- owner,
48
- repo,
49
- type: kind ?? 'root',
50
- ...(ref ? { ref } : {}),
51
- ...(path.length > 0 ? { path: path.join('/') } : {}),
52
- };
53
- }
54
- export async function extractGitHubRepository(url, info, runtime, config, signal, forceClone = false) {
55
- if (config.githubClone?.enabled === false)
56
- throw new Error('GitHub repository extraction is disabled');
57
- if (runtime.kind !== 'host')
58
- return fetchGitHubApiView(url, info, config, signal);
59
- const maximumRepoSizeMb = positiveNumber(config.githubClone?.maxRepoSizeMB, 350, 2_000);
60
- const timeoutMs = positiveNumber(config.githubClone?.cloneTimeoutSeconds, 30, 300) * 1_000;
61
- if (!forceClone) {
62
- const sizeMb = await githubRepositorySizeMb(info, config, signal);
63
- if (sizeMb > maximumRepoSizeMb) {
64
- throw new Error(`GitHub repository is ${Math.ceil(sizeMb)} MB; pass forceClone: true to exceed the configured ${maximumRepoSizeMb} MB threshold`);
65
- }
66
- }
67
- const storage = runtime.storage('session');
68
- const key = createHash('sha256').update(`${info.owner}/${info.repo}@${info.ref ?? 'HEAD'}`).digest('hex').slice(0, 20);
69
- const repositoryPath = join(storage.root, 'web-access', 'repos', key);
70
- await storage.mkdir(join(storage.root, 'web-access', 'repos'), { recursive: true });
71
- let clone;
72
- if (forceClone) {
73
- clone = clonePromises.get(repositoryPath);
74
- if (clone)
75
- await clone;
76
- try {
77
- await storage.remove(repositoryPath, { recursive: true });
78
- }
79
- catch {
80
- // A missing clone is already in the requested state.
81
- }
82
- }
83
- if (!await hasClone(storage, repositoryPath)) {
84
- clone = clonePromises.get(repositoryPath);
85
- if (!clone) {
86
- clone = cloneRepository(runtime, repositoryPath, info, timeoutMs, signal);
87
- clonePromises.set(repositoryPath, clone);
88
- }
89
- try {
90
- await clone;
91
- }
92
- finally {
93
- clonePromises.delete(repositoryPath);
94
- }
95
- }
96
- const commit = clone
97
- ? await clone
98
- : await readHead(runtime, repositoryPath, timeoutMs, signal);
99
- checkoutAccess.set(repositoryPath, Date.now());
100
- await enforceCheckoutLimit(storage, repositoryPath, config);
101
- const files = (await storage.listFiles(repositoryPath, { recursive: true, limit: MAX_FILES + 1 }))
102
- .filter(isUsefulFile)
103
- .filter((path) => info.type === 'root' || !info.path || path === info.path || path.startsWith(`${info.path}/`));
104
- if (info.type === 'blob' && info.path && !files.includes(info.path))
105
- throw new Error(`GitHub repository path not found: ${info.path}`);
106
- const sections = [`# ${info.owner}/${info.repo}`, '', `Source: ${url}`, `Commit: ${commit}`, ''];
107
- let repositoryTruncated = files.length > MAX_FILES;
108
- if (info.type === 'blob' && info.path) {
109
- const text = textDecoder.decode(await storage.readFile(join(repositoryPath, info.path)));
110
- sections.push(`## ${info.path}`, '', '```' + languageFor(info.path), boundedText(text, MAX_FILE_CHARACTERS), '```');
111
- }
112
- else {
113
- sections.push('## Structure', '', files.slice(0, MAX_FILES).join('\n'));
114
- const readme = files.find((file) => /^(?:README(?:\.md)?|readme)$/iu.test(posix.basename(file)));
115
- if (readme) {
116
- const text = textDecoder.decode(await storage.readFile(join(repositoryPath, readme)));
117
- sections.push('', '## README.md', '', boundedText(text, 8_192));
118
- }
119
- }
120
- return {
121
- url,
122
- title: info.path ? `${info.owner}/${info.repo} - ${info.path}` : `${info.owner}/${info.repo}`,
123
- content: sections.join('\n'),
124
- error: null,
125
- contentType: 'text/markdown',
126
- repository: {
127
- owner: info.owner,
128
- repo: info.repo,
129
- mode: 'local-checkout',
130
- commit,
131
- ...(info.ref ? { requestedRef: info.ref } : {}),
132
- checkoutPath: repositoryPath,
133
- },
134
- ...(repositoryTruncated ? { truncated: true } : {}),
135
- };
136
- }
137
- export async function cleanupGitHubRepositories(runtime) {
138
- const storage = runtime.storage('session');
139
- const repositories = join(storage.root, 'web-access', 'repos');
140
- try {
141
- await storage.remove(repositories, { recursive: true });
142
- }
143
- catch {
144
- // A session may not have created any repositories.
145
- }
146
- for (const path of checkoutAccess.keys()) {
147
- if (path.startsWith(`${repositories}/`))
148
- checkoutAccess.delete(path);
149
- }
150
- }
151
- async function enforceCheckoutLimit(storage, currentPath, config) {
152
- const maximum = positiveInteger(config.githubClone?.maxCheckouts, 4, 100);
153
- const root = join(storage.root, 'web-access', 'repos');
154
- let entries;
155
- try {
156
- entries = await storage.listFiles(root, { includeDirectories: true, recursive: false });
157
- }
158
- catch {
159
- return;
160
- }
161
- const paths = entries
162
- .filter((entry) => /^[a-f0-9]{20}$/u.test(posix.basename(entry)) && !entry.includes('/'))
163
- .map((entry) => join(root, entry));
164
- if (paths.length <= maximum)
165
- return;
166
- const candidates = paths
167
- .filter((path) => path !== currentPath && !clonePromises.has(path))
168
- .sort((left, right) => (checkoutAccess.get(left) ?? 0) - (checkoutAccess.get(right) ?? 0));
169
- for (const path of candidates.slice(0, Math.max(0, paths.length - maximum))) {
170
- try {
171
- await storage.remove(path, { recursive: true });
172
- }
173
- catch {
174
- // Cleanup is best effort; the next checkout can retry eviction.
175
- }
176
- checkoutAccess.delete(path);
177
- }
178
- }
179
- async function cloneRepository(runtime, destination, info, timeoutMs, signal) {
180
- const args = ['clone', '--depth', '1', '--filter=blob:none'];
181
- const fullSha = info.ref !== undefined && FULL_COMMIT_SHA.test(info.ref);
182
- if (info.ref && !fullSha)
183
- args.push('--branch', info.ref);
184
- args.push(`https://github.com/${info.owner}/${info.repo}.git`, destination);
185
- try {
186
- const result = await runtime.exec('git', args, { ...(signal ? { signal } : {}), timeout: timeoutMs });
187
- if (signal?.aborted || result.killed)
188
- throw new Error('GitHub clone was aborted');
189
- if (result.code !== 0)
190
- throw new Error('GitHub repository clone failed');
191
- if (fullSha) {
192
- await runGit(runtime, ['-C', destination, 'fetch', '--depth', '1', 'origin', info.ref], timeoutMs, signal, 'GitHub commit fetch failed');
193
- await runGit(runtime, ['-C', destination, 'checkout', '--detach', info.ref], timeoutMs, signal, 'GitHub commit checkout failed');
194
- }
195
- return await readHead(runtime, destination, timeoutMs, signal, info.ref);
196
- }
197
- catch (error) {
198
- try {
199
- await runtime.remove(destination, { recursive: true });
200
- }
201
- catch {
202
- // The destination may not have been created.
203
- }
204
- throw error;
205
- }
206
- }
207
- async function readHead(runtime, repositoryPath, timeoutMs, signal, expected) {
208
- const result = await runGit(runtime, ['-C', repositoryPath, 'rev-parse', 'HEAD'], timeoutMs, signal, 'GitHub checkout verification failed');
209
- const commit = result.stdout.trim().toLowerCase();
210
- if (!FULL_COMMIT_SHA.test(commit) || (expected && commit !== expected.toLowerCase())) {
211
- throw new Error('GitHub checkout returned an invalid or unexpected commit SHA');
212
- }
213
- return commit;
214
- }
215
- async function runGit(runtime, args, timeoutMs, signal, failure) {
216
- const result = await runtime.exec('git', args, { ...(signal ? { signal } : {}), timeout: timeoutMs, maxOutputBytes: 1_024 });
217
- if (signal?.aborted || result.killed)
218
- throw new Error('GitHub checkout was aborted');
219
- if (result.code !== 0)
220
- throw new Error(failure);
221
- return { stdout: result.stdout };
222
- }
223
- async function githubRepositorySizeMb(info, config, signal) {
224
- const response = await fetchRemoteUrl(`https://api.github.com/repos/${info.owner}/${info.repo}`, {
225
- headers: { Accept: 'application/vnd.github+json', 'User-Agent': 'felan-web-access' },
226
- signal: combinedSignal(signal, 15_000),
227
- }, endpointSsrfSettings(config), { allowCrossOriginRedirects: false });
228
- if (!response.ok)
229
- throw new Error(`GitHub API request failed with HTTP ${response.status}`);
230
- const data = await readJsonResponse(response, 512 * 1024, 'GitHub API');
231
- if (typeof data.size !== 'number' || !Number.isFinite(data.size) || data.size < 0) {
232
- throw new Error('GitHub API response did not include a valid repository size');
233
- }
234
- return data.size / 1_024;
235
- }
236
- async function fetchGitHubApiView(url, info, config, signal) {
237
- const settings = endpointSsrfSettings(config);
238
- const metadata = await githubApiJson(`https://api.github.com/repos/${info.owner}/${info.repo}`, settings, signal, 'GitHub repository API');
239
- const ref = info.ref ?? (typeof metadata.default_branch === 'string' ? metadata.default_branch : undefined);
240
- if (!ref)
241
- throw new Error('GitHub API did not provide a default branch');
242
- const commit = FULL_COMMIT_SHA.test(ref)
243
- ? ref.toLowerCase()
244
- : await resolveGitHubCommit(info.owner, info.repo, ref, settings, signal);
245
- const provenance = {
246
- owner: info.owner,
247
- repo: info.repo,
248
- mode: 'github-api',
249
- commit,
250
- ...(info.ref ? { requestedRef: info.ref } : {}),
251
- };
252
- const lines = [`# ${info.owner}/${info.repo}`, '', `Source: ${url}`, `Commit: ${commit}`, '', ''];
253
- let repositoryTruncated = false;
254
- if (info.type === 'blob' && info.path) {
255
- const content = await githubFileContent(info.owner, info.repo, info.path, commit, settings, signal);
256
- lines.push(`## ${info.path}`, '', '```', boundedText(content, MAX_FILE_CHARACTERS), '```');
257
- }
258
- else {
259
- const tree = await githubTree(info.owner, info.repo, commit, settings, signal);
260
- const paths = tree.entries
261
- .filter((entry) => entry.type === 'blob' && isUsefulFile(entry.path))
262
- .map((entry) => entry.path);
263
- const selected = info.type === 'tree' && info.path
264
- ? paths.filter((path) => path === info.path || path.startsWith(`${info.path}/`))
265
- : paths;
266
- if (info.type === 'tree' && info.path && selected.length === 0) {
267
- throw new Error(`GitHub repository path not found: ${info.path}`);
268
- }
269
- lines.push('## Structure', '', selected.slice(0, MAX_API_TREE_ENTRIES).join('\n'));
270
- repositoryTruncated = tree.truncated || selected.length > MAX_API_TREE_ENTRIES;
271
- if (repositoryTruncated)
272
- lines.push('', '[Tree truncated]');
273
- const readme = await githubReadme(info.owner, info.repo, commit, settings, signal);
274
- if (readme)
275
- lines.push('', '## README.md', '', boundedText(readme, 8_192));
276
- }
277
- return {
278
- url,
279
- title: info.path ? `${info.owner}/${info.repo} - ${info.path}` : `${info.owner}/${info.repo}`,
280
- content: lines.join('\n'),
281
- error: null,
282
- contentType: 'text/markdown',
283
- repository: provenance,
284
- ...(repositoryTruncated ? { truncated: true } : {}),
285
- };
286
- }
287
- async function resolveGitHubCommit(owner, repo, ref, settings, signal) {
288
- const data = await githubApiJson(`https://api.github.com/repos/${owner}/${repo}/commits/${encodeURIComponent(ref)}`, settings, signal, 'GitHub commit API');
289
- if (typeof data.sha !== 'string' || !FULL_COMMIT_SHA.test(data.sha))
290
- throw new Error('GitHub API returned an invalid commit SHA');
291
- return data.sha.toLowerCase();
292
- }
293
- async function githubTree(owner, repo, commit, settings, signal) {
294
- const data = await githubApiJson(`https://api.github.com/repos/${owner}/${repo}/git/trees/${commit}?recursive=1`, settings, signal, 'GitHub tree API');
295
- if (!Array.isArray(data.tree))
296
- throw new Error('GitHub API returned an invalid tree');
297
- const entries = data.tree.flatMap((entry) => {
298
- if (!isRecord(entry) || typeof entry.path !== 'string' || !validRepositoryPath(entry.path))
299
- return [];
300
- return [{ path: entry.path, ...(typeof entry.type === 'string' ? { type: entry.type } : {}) }];
301
- });
302
- return { entries, truncated: data.truncated === true };
303
- }
304
- async function githubReadme(owner, repo, commit, settings, signal) {
305
- try {
306
- const data = await githubApiJson(`https://api.github.com/repos/${owner}/${repo}/readme?ref=${encodeURIComponent(commit)}`, settings, signal, 'GitHub README API');
307
- return decodeGitHubContent(data);
308
- }
309
- catch (error) {
310
- if (error instanceof Error && /HTTP 404\b/u.test(error.message))
311
- return undefined;
312
- throw error;
313
- }
314
- }
315
- async function githubFileContent(owner, repo, path, commit, settings, signal) {
316
- const encodedPath = path.split('/').map(encodeURIComponent).join('/');
317
- const data = await githubApiJson(`https://api.github.com/repos/${owner}/${repo}/contents/${encodedPath}?ref=${encodeURIComponent(commit)}`, settings, signal, 'GitHub file API');
318
- return decodeGitHubContent(data);
319
- }
320
- async function githubApiJson(url, settings, signal, label) {
321
- const response = await fetchRemoteUrl(url, {
322
- headers: { Accept: 'application/vnd.github+json', 'User-Agent': 'felan-web-access' },
323
- signal: combinedSignal(signal, 15_000),
324
- }, settings, { allowCrossOriginRedirects: false });
325
- if (!response.ok)
326
- throw new Error(`${label} failed with HTTP ${response.status}`);
327
- return readJsonResponse(response, MAX_API_RESPONSE_BYTES, label);
328
- }
329
- function decodeGitHubContent(data) {
330
- if (typeof data.content !== 'string' || (data.encoding !== undefined && data.encoding !== 'base64')) {
331
- throw new Error('GitHub API returned unsupported file content');
332
- }
333
- try {
334
- return Buffer.from(data.content.replace(/\s/gu, ''), 'base64').toString('utf8');
335
- }
336
- catch {
337
- throw new Error('GitHub API returned invalid file content');
338
- }
339
- }
340
- function boundedText(text, maximum) {
341
- return text.length > maximum ? `${text.slice(0, maximum)}\n[File truncated]` : text;
342
- }
343
- function validRepositoryPath(path) {
344
- return path.split('/').every((segment) => validPathSegment(segment) && !segment.includes('\\'));
345
- }
346
- function isRecord(value) {
347
- return typeof value === 'object' && value !== null && !Array.isArray(value);
348
- }
349
- async function hasClone(storage, path) {
350
- try {
351
- return (await storage.listFiles(path, { recursive: false })).length > 0
352
- || (await storage.listFiles(join(path, '.git'), { recursive: false })).length > 0;
353
- }
354
- catch {
355
- return false;
356
- }
357
- }
358
- function isUsefulFile(path) {
359
- const normalized = path.replace(/\\/gu, '/');
360
- if (normalized.split('/').some((segment) => NOISE_DIRECTORIES.has(segment)))
361
- return false;
362
- const extension = posix.extname(normalized).toLowerCase();
363
- return !BINARY_EXTENSIONS.has(extension);
364
- }
365
- function languageFor(path) {
366
- return posix.extname(path).slice(1).replace(/[^a-z0-9_+-]/giu, '');
367
- }
368
- function validSegment(value) {
369
- return /^[A-Za-z0-9_.-]+$/u.test(value) && value !== '.' && value !== '..';
370
- }
371
- function validPathSegment(value) {
372
- return value !== '' && value !== '.' && value !== '..' && !value.includes('\0') && !value.includes('/') && !value.includes('\\');
373
- }
374
- //# sourceMappingURL=github.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"github.js","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- import type { ExtractedContent, RecencyFilter, ResearchArtifact, SearchResult } from './types.js';
2
- export interface BuildResearchArtifactOptions {
3
- id: string;
4
- claim: string;
5
- provider: string;
6
- results: SearchResult[];
7
- summaries: Array<{
8
- provider: ResearchArtifact['summaries'][number]['provider'];
9
- text: string;
10
- }>;
11
- fetched: ExtractedContent[];
12
- recencyFilter?: RecencyFilter;
13
- domainFilter?: string[];
14
- errors: Array<{
15
- query: string;
16
- error: string;
17
- }>;
18
- }
19
- export declare function buildResearchArtifact(options: BuildResearchArtifactOptions): ResearchArtifact;
20
- export declare function hashContent(text: string): string;
21
- //# sourceMappingURL=source-check.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"source-check.d.ts","sourceRoot":"","sources":["../src/source-check.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAEhB,YAAY,EACb,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChG,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,gBAAgB,CAgD7F;AA2DD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD"}
@@ -1,136 +0,0 @@
1
- import { createHash } from 'node:crypto';
2
- const MAX_SOURCES = 20;
3
- const MAX_PASSAGES = 40;
4
- const MAX_PASSAGE_CHARACTERS = 400;
5
- export function buildResearchArtifact(options) {
6
- const fetchedByUrl = new Map(options.fetched.map((page) => [page.url, page]));
7
- const seen = new Set();
8
- const uniqueResults = options.results.filter((result) => {
9
- if (seen.has(result.url))
10
- return false;
11
- seen.add(result.url);
12
- return true;
13
- }).slice(0, MAX_SOURCES);
14
- const sources = uniqueResults.map((result, index) => {
15
- const page = fetchedByUrl.get(result.url);
16
- return {
17
- rank: index + 1,
18
- url: result.url,
19
- title: result.title,
20
- snippet: result.snippet,
21
- quality: classifySource(result.url),
22
- fetched: Boolean(page && !page.error),
23
- ...(page?.error ? { fetchError: page.error } : {}),
24
- ...(page && !page.error ? { contentHash: hashContent(page.content) } : {}),
25
- };
26
- });
27
- const passages = buildPassages(options.claim, sources, fetchedByUrl).slice(0, MAX_PASSAGES);
28
- const assessment = assessClaim(passages);
29
- const filters = options.domainFilter ?? [];
30
- return {
31
- id: options.id,
32
- type: 'research',
33
- timestamp: Date.now(),
34
- claim: options.claim,
35
- provider: options.provider,
36
- status: assessment.status,
37
- confidence: assessment.confidence,
38
- rationale: assessment.rationale,
39
- summaries: options.summaries.slice(0, 16).map((summary) => ({
40
- provider: summary.provider,
41
- text: summary.text.slice(0, 5_000),
42
- })),
43
- sources,
44
- passages,
45
- supportingPassages: assessment.supporting,
46
- contradictingPassages: assessment.contradicting,
47
- filters: {
48
- ...(options.recencyFilter ? { recency: options.recencyFilter } : {}),
49
- domainInclude: filters.filter((domain) => !domain.startsWith('-')),
50
- domainExclude: filters.filter((domain) => domain.startsWith('-')).map((domain) => domain.slice(1)),
51
- },
52
- errors: options.errors,
53
- };
54
- }
55
- function buildPassages(claim, sources, fetched) {
56
- const passages = [];
57
- const terms = tokens(claim);
58
- for (const source of sources) {
59
- const page = fetched.get(source.url);
60
- if (!page || page.error || !page.content)
61
- continue;
62
- for (const [index, span] of relevantSpans(page.content, terms).entries()) {
63
- passages.push({
64
- passageId: `p-${source.rank}-${index + 1}`,
65
- sourceUrl: source.url,
66
- sourceRank: source.rank,
67
- text: span.text,
68
- extractionSpan: { start: span.start, end: span.end },
69
- contentHash: hashContent(span.text),
70
- });
71
- }
72
- }
73
- return passages;
74
- }
75
- function relevantSpans(content, terms) {
76
- if (terms.length === 0)
77
- return [];
78
- const spans = [];
79
- for (const match of content.matchAll(/[^.!?\n]+(?:[.!?]+(?=\s|$)|$)/gu)) {
80
- if (match.index === undefined)
81
- continue;
82
- const raw = match[0];
83
- const text = raw.trim();
84
- if (!text || text.length > MAX_PASSAGE_CHARACTERS)
85
- continue;
86
- const score = terms.filter((term) => text.toLocaleLowerCase().includes(term)).length;
87
- if (score === 0)
88
- continue;
89
- const start = match.index + raw.indexOf(text);
90
- spans.push({ text, start, end: start + text.length, score });
91
- }
92
- return spans.sort((left, right) => right.score - left.score || left.start - right.start).slice(0, 3).map(({ score: _score, ...span }) => span);
93
- }
94
- function assessClaim(passages) {
95
- if (passages.length === 0)
96
- return {
97
- status: 'missing-evidence',
98
- confidence: 0,
99
- rationale: 'No exact fetched passages were available.',
100
- supporting: [],
101
- contradicting: [],
102
- };
103
- return {
104
- status: 'unclear',
105
- confidence: 0,
106
- rationale: 'Exact passages were extracted; semantic review is required.',
107
- supporting: [],
108
- contradicting: [],
109
- };
110
- }
111
- export function hashContent(text) {
112
- return `sha256:${createHash('sha256').update(text, 'utf8').digest('hex')}`;
113
- }
114
- function tokens(value) {
115
- return [...new Set(value.toLocaleLowerCase().split(/[^\p{L}\p{N}]+/u).filter((term) => term.length > 3))];
116
- }
117
- function classifySource(rawUrl) {
118
- try {
119
- const url = new URL(rawUrl);
120
- if (/\/(issues|pull|pulls)\//iu.test(url.pathname))
121
- return 'repo_issue';
122
- if (/^(developers\.|docs\.|learn\.|reference\.)|\.github\.io$/iu.test(url.hostname) || /\/(docs?|reference)(\/|$)/iu.test(url.pathname))
123
- return 'official_docs';
124
- if (/(stackoverflow\.com|serverfault\.com|discourse\.|community\.)/iu.test(url.hostname))
125
- return 'forum';
126
- if (/(reuters\.com|bloomberg\.com|techcrunch\.com|theverge\.com|arstechnica\.com|wired\.com)/iu.test(url.hostname))
127
- return 'news';
128
- if (/(medium\.com|substack\.com|dev\.to|hashnode\.)/iu.test(url.hostname) || /\/blog(s)?\//iu.test(url.pathname))
129
- return 'blog';
130
- return 'unknown';
131
- }
132
- catch {
133
- return 'unknown';
134
- }
135
- }
136
- //# sourceMappingURL=source-check.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"source-check.js","sourceRoot":"","sources":["../src/source-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AASzC,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAcnC,MAAM,UAAU,qBAAqB,CAAC,OAAqC;IACzE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;QACtD,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAClD,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1C,OAAO;YACL,IAAI,EAAE,KAAK,GAAG,CAAC;YACf,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC;YACnC,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YACrC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3E,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC5F,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;IAC3C,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,IAAI,EAAE,UAAU;QAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC1D,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;SACnC,CAAC,CAAC;QACH,OAAO;QACP,QAAQ;QACR,kBAAkB,EAAE,UAAU,CAAC,UAAU;QACzC,qBAAqB,EAAE,UAAU,CAAC,aAAa;QAC/C,OAAO,EAAE;YACP,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpE,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAClE,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACnG;QACD,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,KAAa,EACb,OAAoC,EACpC,OAAsC;IAEtC,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,SAAS;QACnD,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YACzE,QAAQ,CAAC,IAAI,CAAC;gBACZ,SAAS,EAAE,KAAK,MAAM,CAAC,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE;gBAC1C,SAAS,EAAE,MAAM,CAAC,GAAG;gBACrB,UAAU,EAAE,MAAM,CAAC,IAAI;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,cAAc,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;gBACpD,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;aACpC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,aAAa,CAAC,OAAe,EAAE,KAAe;IACrD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,KAAK,GAAuE,EAAE,CAAC;IACrF,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,CAAC;QACxE,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,SAAS;QACxC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,sBAAsB;YAAE,SAAS;QAC5D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QACrF,IAAI,KAAK,KAAK,CAAC;YAAE,SAAS;QAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;AACjJ,CAAC;AAED,SAAS,WAAW,CAAC,QAA2B;IAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;YAChC,MAAM,EAAE,kBAA2B;YACnC,UAAU,EAAE,CAAC;YACb,SAAS,EAAE,2CAA2C;YACtD,UAAU,EAAE,EAAE;YACd,aAAa,EAAE,EAAE;SAClB,CAAC;IACF,OAAO;QACL,MAAM,EAAE,SAAkB;QAC1B,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,6DAA6D;QACxE,UAAU,EAAE,EAAE;QACd,aAAa,EAAE,EAAE;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5G,CAAC;AAED,SAAS,cAAc,CAAC,MAAc;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,2BAA2B,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,YAAY,CAAC;QACxE,IAAI,4DAA4D,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,6BAA6B,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,eAAe,CAAC;QAChK,IAAI,iEAAiE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,OAAO,CAAC;QACzG,IAAI,2FAA2F,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,MAAM,CAAC;QAClI,IAAI,kDAAkD,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,MAAM,CAAC;QAChI,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
package/dist/storage.d.ts DELETED
@@ -1,19 +0,0 @@
1
- import type { AgentRuntime, ExtensionContext, FelanExtensionAPI } from '@felan-ai/agent-core';
2
- import { type StoredResult } from './types.js';
3
- export interface StoreLimits {
4
- maxEntries: number;
5
- maxItemBytes: number;
6
- maxTotalBytes: number;
7
- maxLegacyInlineBytes: number;
8
- }
9
- export declare class ResultStore {
10
- #private;
11
- private readonly appendEntry;
12
- constructor(runtime: AgentRuntime, appendEntry: FelanExtensionAPI['appendEntry'], limits?: Partial<StoreLimits>);
13
- restore(ctx: ExtensionContext): Promise<void>;
14
- put(value: StoredResult): Promise<void>;
15
- get(id: string): Promise<StoredResult | undefined>;
16
- clear(): Promise<void>;
17
- }
18
- export declare function generateResponseId(): string;
19
- //# sourceMappingURL=storage.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EAEZ,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAgB/D,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAgCD,qBAAa,WAAW;;IAUpB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAD5B,OAAO,EAAE,YAAY,EACJ,WAAW,EAAE,iBAAiB,CAAC,aAAa,CAAC,EAC9D,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM;IAO7B,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqC7C,GAAG,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAmDvC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAQlD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAsI7B;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}