@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.
- package/NOTICE +0 -8
- package/README.md +131 -79
- package/dist/boundary.d.ts +1 -3
- package/dist/boundary.d.ts.map +1 -1
- package/dist/boundary.js +1 -19
- package/dist/boundary.js.map +1 -1
- package/dist/config.d.ts +4 -10
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +82 -36
- package/dist/config.js.map +1 -1
- package/dist/content-find.d.ts +19 -10
- package/dist/content-find.d.ts.map +1 -1
- package/dist/content-find.js +104 -70
- package/dist/content-find.js.map +1 -1
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +12 -6
- package/dist/credentials.js.map +1 -1
- package/dist/extract.d.ts +7 -7
- package/dist/extract.d.ts.map +1 -1
- package/dist/extract.js +237 -84
- package/dist/extract.js.map +1 -1
- package/dist/http.d.ts +3 -3
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +19 -5
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +444 -477
- package/dist/index.js.map +1 -1
- package/dist/pdf-service.d.ts +22 -0
- package/dist/pdf-service.d.ts.map +1 -0
- package/dist/pdf-service.js +61 -0
- package/dist/pdf-service.js.map +1 -0
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +191 -171
- package/dist/providers.js.map +1 -1
- package/dist/ssrf.d.ts +1 -0
- package/dist/ssrf.d.ts.map +1 -1
- package/dist/ssrf.js +36 -6
- package/dist/ssrf.js.map +1 -1
- package/dist/types.d.ts +5 -84
- package/dist/types.d.ts.map +1 -1
- package/dist/url.d.ts +2 -0
- package/dist/url.d.ts.map +1 -0
- package/dist/url.js +15 -0
- package/dist/url.js.map +1 -0
- package/package.json +7 -8
- package/dist/github.d.ts +0 -14
- package/dist/github.d.ts.map +0 -1
- package/dist/github.js +0 -374
- package/dist/github.js.map +0 -1
- package/dist/source-check.d.ts +0 -21
- package/dist/source-check.d.ts.map +0 -1
- package/dist/source-check.js +0 -136
- package/dist/source-check.js.map +0 -1
- package/dist/storage.d.ts +0 -19
- package/dist/storage.d.ts.map +0 -1
- package/dist/storage.js +0 -466
- package/dist/storage.js.map +0 -1
package/dist/content-find.d.ts
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
|
|
1
|
+
export declare const MAX_MERGED_SNIPPET_BYTES = 4000;
|
|
2
|
+
export interface ContentMatch {
|
|
3
|
+
start: number;
|
|
4
|
+
end: number;
|
|
5
|
+
contextStart: number;
|
|
6
|
+
contextEnd: number;
|
|
7
|
+
snippet: string;
|
|
8
|
+
}
|
|
9
|
+
export interface QueryMatches {
|
|
10
|
+
matches: ContentMatch[];
|
|
4
11
|
matchCount: number;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
+
truncated: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface MergedContentMatch {
|
|
15
|
+
queryIndexes: number[];
|
|
16
|
+
matchCount: number;
|
|
17
|
+
snippet: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function findContentMatches(text: string, queries: string[]): QueryMatches[];
|
|
20
|
+
export declare function mergeContentMatches(text: string, queryMatches: QueryMatches[]): MergedContentMatch[];
|
|
12
21
|
//# sourceMappingURL=content-find.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-find.d.ts","sourceRoot":"","sources":["../src/content-find.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"content-find.d.ts","sourceRoot":"","sources":["../src/content-find.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,wBAAwB,OAAQ,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAOD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,CA2BlF;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,kBAAkB,EAAE,CAgDpG"}
|
package/dist/content-find.js
CHANGED
|
@@ -1,80 +1,114 @@
|
|
|
1
|
-
const CONTEXT_CHARACTERS =
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
query
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
1
|
+
const CONTEXT_CHARACTERS = 160;
|
|
2
|
+
const MAX_MATCHES_PER_QUERY = 100;
|
|
3
|
+
const MAX_IDENTIFIER_QUERY_CHARACTERS = 500;
|
|
4
|
+
const MAX_IDENTIFIER_TOKENS = 32;
|
|
5
|
+
const IDENTIFIER_SEPARATOR_PATTERN = '[ _.\\/:\\-]{1,8}';
|
|
6
|
+
export const MAX_MERGED_SNIPPET_BYTES = 4_000;
|
|
7
|
+
export function findContentMatches(text, queries) {
|
|
8
|
+
return queries.map((query) => {
|
|
9
|
+
if (!query)
|
|
10
|
+
return { matches: [], matchCount: 0, truncated: false };
|
|
11
|
+
const scans = matchingExpressions(query).map((expression) => scanMatches(text, expression));
|
|
12
|
+
const unique = new Map();
|
|
13
|
+
for (const scan of scans) {
|
|
14
|
+
for (const match of scan.matches)
|
|
15
|
+
unique.set(`${match.start}:${match.end}`, match);
|
|
16
|
+
}
|
|
17
|
+
const located = [...unique.values()].sort((left, right) => left.start - right.start || left.end - right.end);
|
|
18
|
+
const matches = located.slice(0, MAX_MATCHES_PER_QUERY).map((match) => {
|
|
19
|
+
const index = match.start;
|
|
20
|
+
const start = Math.max(0, index - CONTEXT_CHARACTERS);
|
|
21
|
+
const end = Math.min(text.length, match.end + CONTEXT_CHARACTERS);
|
|
22
|
+
return {
|
|
23
|
+
start: index,
|
|
24
|
+
end: match.end,
|
|
25
|
+
contextStart: start,
|
|
26
|
+
contextEnd: end,
|
|
27
|
+
snippet: snippetForRange(text, start, end),
|
|
28
|
+
};
|
|
29
|
+
});
|
|
30
|
+
return {
|
|
31
|
+
matches,
|
|
32
|
+
matchCount: matches.length,
|
|
33
|
+
truncated: located.length > MAX_MATCHES_PER_QUERY || scans.some((scan) => scan.truncated),
|
|
34
|
+
};
|
|
35
|
+
});
|
|
26
36
|
}
|
|
27
|
-
function
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
37
|
+
export function mergeContentMatches(text, queryMatches) {
|
|
38
|
+
const ordered = queryMatches
|
|
39
|
+
.flatMap((result, queryIndex) => result.matches.map((match) => ({ ...match, queryIndex })))
|
|
40
|
+
.sort((left, right) => left.contextStart - right.contextStart
|
|
41
|
+
|| left.contextEnd - right.contextEnd
|
|
42
|
+
|| left.queryIndex - right.queryIndex);
|
|
43
|
+
const ranges = [];
|
|
44
|
+
for (const match of ordered) {
|
|
45
|
+
const current = ranges.at(-1);
|
|
46
|
+
if (current && match.contextStart <= current.contextEnd) {
|
|
47
|
+
const contextEnd = Math.max(current.contextEnd, match.contextEnd);
|
|
48
|
+
const snippetBytes = Buffer.byteLength(snippetForRange(text, current.contextStart, contextEnd), 'utf8');
|
|
49
|
+
if (snippetBytes <= MAX_MERGED_SNIPPET_BYTES) {
|
|
50
|
+
current.contextEnd = contextEnd;
|
|
51
|
+
current.queryIndexes.add(match.queryIndex);
|
|
52
|
+
current.matchCount += 1;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
ranges.push({
|
|
57
|
+
contextStart: match.contextStart,
|
|
58
|
+
contextEnd: match.contextEnd,
|
|
59
|
+
queryIndexes: new Set([match.queryIndex]),
|
|
60
|
+
matchCount: 1,
|
|
61
|
+
});
|
|
33
62
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
for (const paragraph of text.matchAll(/[^\n]+(?:\n(?!\n)[^\n]+)*/gu)) {
|
|
42
|
-
if (paragraph.index === undefined)
|
|
43
|
-
continue;
|
|
44
|
-
const tokens = [...paragraph[0].matchAll(/[\p{L}\p{N}]+/gu)];
|
|
45
|
-
const matched = queryTokens.filter((queryToken) => tokens.some((token) => {
|
|
46
|
-
const candidate = normalize(token[0]);
|
|
47
|
-
const maximum = queryToken.length >= 9 ? 2 : queryToken.length >= 5 ? 1 : 0;
|
|
48
|
-
return editDistanceWithin(queryToken, candidate, maximum);
|
|
49
|
-
}));
|
|
50
|
-
const required = queryTokens.length === 1 ? 1 : Math.ceil(queryTokens.length * 0.6);
|
|
51
|
-
if (matched.length < required)
|
|
63
|
+
const deduplicated = new Map();
|
|
64
|
+
for (const range of ranges) {
|
|
65
|
+
const snippet = snippetForRange(text, range.contextStart, range.contextEnd);
|
|
66
|
+
const existing = deduplicated.get(snippet);
|
|
67
|
+
if (existing) {
|
|
68
|
+
existing.queryIndexes = [...new Set([...existing.queryIndexes, ...range.queryIndexes])].sort((a, b) => a - b);
|
|
69
|
+
existing.matchCount += range.matchCount;
|
|
52
70
|
continue;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
71
|
+
}
|
|
72
|
+
deduplicated.set(snippet, {
|
|
73
|
+
queryIndexes: [...range.queryIndexes].sort((a, b) => a - b),
|
|
74
|
+
matchCount: range.matchCount,
|
|
75
|
+
snippet,
|
|
76
|
+
});
|
|
56
77
|
}
|
|
57
|
-
return
|
|
78
|
+
return [...deduplicated.values()];
|
|
79
|
+
}
|
|
80
|
+
function matchingExpressions(query) {
|
|
81
|
+
const variantPattern = separatorAwareIdentifierPattern(query);
|
|
82
|
+
if (variantPattern === null)
|
|
83
|
+
return [new RegExp(escapeRegExp(query), 'giu')];
|
|
84
|
+
const leftBoundary = '(?<![\\p{L}\\p{N}])(?<![\\p{L}\\p{N}][_.\\/:\\-])';
|
|
85
|
+
const rightBoundary = '(?![\\p{L}\\p{N}])(?!(?:[_.\\/:\\-][\\p{L}\\p{N}]))';
|
|
86
|
+
return [escapeRegExp(query), variantPattern].map((pattern) => (new RegExp(`${leftBoundary}${pattern}${rightBoundary}`, 'giu')));
|
|
58
87
|
}
|
|
59
|
-
function
|
|
60
|
-
|
|
88
|
+
function separatorAwareIdentifierPattern(query) {
|
|
89
|
+
if (query.length > MAX_IDENTIFIER_QUERY_CHARACTERS || !/[_.\/\-:]/u.test(query))
|
|
90
|
+
return null;
|
|
91
|
+
const tokens = query.split(/[_.\/\-:]+/u);
|
|
92
|
+
if (tokens.length < 2 || tokens.length > MAX_IDENTIFIER_TOKENS
|
|
93
|
+
|| tokens.some((token) => !/^[\p{L}\p{N}]+$/u.test(token))) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
return tokens.map(escapeRegExp).join(IDENTIFIER_SEPARATOR_PATTERN);
|
|
61
97
|
}
|
|
62
|
-
function
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
let rowMinimum = leftIndex;
|
|
69
|
-
for (let rightIndex = 1; rightIndex <= right.length; rightIndex += 1) {
|
|
70
|
-
const value = Math.min(previous[rightIndex] + 1, current[rightIndex - 1] + 1, previous[rightIndex - 1] + (left[leftIndex - 1] === right[rightIndex - 1] ? 0 : 1));
|
|
71
|
-
current[rightIndex] = value;
|
|
72
|
-
rowMinimum = Math.min(rowMinimum, value);
|
|
98
|
+
function scanMatches(text, expression) {
|
|
99
|
+
const matches = [];
|
|
100
|
+
for (const result of text.matchAll(expression)) {
|
|
101
|
+
matches.push({ start: result.index, end: result.index + result[0].length });
|
|
102
|
+
if (matches.length > MAX_MATCHES_PER_QUERY) {
|
|
103
|
+
return { matches, truncated: true };
|
|
73
104
|
}
|
|
74
|
-
if (rowMinimum > maximum)
|
|
75
|
-
return false;
|
|
76
|
-
previous = current;
|
|
77
105
|
}
|
|
78
|
-
return
|
|
106
|
+
return { matches, truncated: false };
|
|
107
|
+
}
|
|
108
|
+
function snippetForRange(text, start, end) {
|
|
109
|
+
return `${start > 0 ? '…' : ''}${text.slice(start, end).replace(/\s+/gu, ' ').trim()}${end < text.length ? '…' : ''}`;
|
|
110
|
+
}
|
|
111
|
+
function escapeRegExp(value) {
|
|
112
|
+
return value.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
|
|
79
113
|
}
|
|
80
114
|
//# sourceMappingURL=content-find.js.map
|
package/dist/content-find.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-find.js","sourceRoot":"","sources":["../src/content-find.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"content-find.js","sourceRoot":"","sources":["../src/content-find.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAqBzD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,wBAAgB,mBAAmB,CAAC,eAAe,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAE9F;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAqBzD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,wBAAgB,mBAAmB,CAAC,eAAe,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAE9F;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA2C/F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEtF"}
|
package/dist/credentials.js
CHANGED
|
@@ -28,22 +28,25 @@ export async function resolveCredential(options) {
|
|
|
28
28
|
if (!command)
|
|
29
29
|
throw new Error(`${options.provider} credential source is empty`);
|
|
30
30
|
const environment = commandEnvironment(process.env);
|
|
31
|
-
const
|
|
31
|
+
const isolatedCommand = [
|
|
32
|
+
'env',
|
|
32
33
|
'-i',
|
|
33
|
-
...Object.entries(environment).map(([name, value]) => `${name}=${value}`),
|
|
34
|
+
...Object.entries(environment).map(([name, value]) => `${name}=${shellQuote(value)}`),
|
|
34
35
|
'/bin/sh',
|
|
35
36
|
'-lc',
|
|
36
|
-
command,
|
|
37
|
-
];
|
|
38
|
-
const result = await options.runtime.
|
|
37
|
+
shellQuote(command),
|
|
38
|
+
].join(' ');
|
|
39
|
+
const result = await options.runtime.shell(isolatedCommand, {
|
|
39
40
|
...(options.signal ? { signal: options.signal } : {}),
|
|
41
|
+
maxOutputBytes: MAX_CREDENTIAL_BYTES,
|
|
42
|
+
shellFlavor: 'posix',
|
|
40
43
|
timeout: COMMAND_TIMEOUT_MS,
|
|
41
44
|
});
|
|
42
45
|
if (options.signal?.aborted || result.killed)
|
|
43
46
|
throw new Error(`${options.provider} credential command was aborted`);
|
|
44
47
|
if (result.code !== 0)
|
|
45
48
|
throw new Error(`${options.provider} credential command failed`);
|
|
46
|
-
if (Buffer.byteLength(result.stdout, 'utf8') > MAX_CREDENTIAL_BYTES) {
|
|
49
|
+
if (result.truncated || Buffer.byteLength(result.stdout, 'utf8') > MAX_CREDENTIAL_BYTES) {
|
|
47
50
|
throw new Error(`${options.provider} credential command output is too large`);
|
|
48
51
|
}
|
|
49
52
|
const value = result.stdout.trim();
|
|
@@ -71,6 +74,9 @@ export function redactCredential(value, credential) {
|
|
|
71
74
|
function normalize(value) {
|
|
72
75
|
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
73
76
|
}
|
|
77
|
+
function shellQuote(value) {
|
|
78
|
+
return `'${value.replaceAll("'", `'"'"'`)}'`;
|
|
79
|
+
}
|
|
74
80
|
function commandEnvironment(source) {
|
|
75
81
|
const environment = {};
|
|
76
82
|
for (const name of COMMAND_ENVIRONMENT_NAMES) {
|
package/dist/credentials.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAG,gEAAgE,CAAC;AACpF,MAAM,oBAAoB,GAAG,MAAM,CAAC;AACpC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACjC,MAAM,yBAAyB,GAAG;IAChC,MAAM;IACN,MAAM;IACN,SAAS;IACT,MAAM;IACN,MAAM;IACN,QAAQ;IACR,UAAU;IACV,MAAM;IACN,QAAQ;IACR,iBAAiB;IACjB,iBAAiB;IACjB,0BAA0B;IAC1B,eAAe;CACP,CAAC;AAUX,MAAM,UAAU,mBAAmB,CAAC,eAAwB,EAAE,eAAuB;IACnF,OAAO,SAAS,CAAC,eAAe,CAAC,KAAK,SAAS,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,KAAK,SAAS,CAAC;AAC3G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAA0B;IAChE,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACtD,IAAI,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE7F,IAAI,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,QAAQ,6BAA6B,CAAC,CAAC;QAChF,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpD,MAAM,
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
|
package/dist/extract.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type { AgentRuntime } from '@felan-ai/agent-core';
|
|
2
1
|
import { type WebAccessConfig } from './config.js';
|
|
2
|
+
import { type PdfConversionEvents } from './pdf-service.js';
|
|
3
3
|
import type { ExtractedContent } from './types.js';
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
export type LlmsTxtProbeMap = Map<string, Promise<ExtractedContent | undefined>>;
|
|
5
|
+
export interface ExtractContentOptions {
|
|
6
|
+
ignoreLlmsTxt?: boolean;
|
|
7
|
+
llmsTxtProbes?: LlmsTxtProbeMap;
|
|
8
8
|
}
|
|
9
|
-
export declare function extractContent(rawUrl: string,
|
|
10
|
-
export declare function fetchWithConcurrency(urls: string[], concurrency: number, fetchOne: (url: string) => Promise<ExtractedContent>,
|
|
9
|
+
export declare function extractContent(rawUrl: string, config: WebAccessConfig, pdfEvents?: PdfConversionEvents, signal?: AbortSignal, timeoutMs?: number, options?: ExtractContentOptions): Promise<ExtractedContent>;
|
|
10
|
+
export declare function fetchWithConcurrency(urls: string[], concurrency: number, fetchOne: (url: string) => Promise<ExtractedContent>, signal?: AbortSignal): Promise<ExtractedContent[]>;
|
|
11
11
|
//# sourceMappingURL=extract.d.ts.map
|
package/dist/extract.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EAKL,KAAK,mBAAmB,EACzB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAQnD,MAAM,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC,CAAC;AAEjF,MAAM,WAAW,qBAAqB;IACpC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,eAAe,CAAC;CACjC;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,eAAe,EACvB,SAAS,CAAC,EAAE,mBAAmB,EAC/B,MAAM,CAAC,EAAE,WAAW,EACpB,SAAS,SAAkB,EAC3B,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,gBAAgB,CAAC,CAwF3B;AAwID,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EAAE,EACd,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,EACpD,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAqB7B"}
|