@expandai/sdk 0.19.0 → 0.20.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/README.md +130 -4
- package/build/dts/AppendixMarkers.d.ts +30 -0
- package/build/dts/AppendixMarkers.d.ts.map +1 -0
- package/build/dts/Client.d.ts +41 -6
- package/build/dts/Client.d.ts.map +1 -1
- package/build/dts/Crawls.d.ts +568 -0
- package/build/dts/Crawls.d.ts.map +1 -0
- package/build/dts/EnvProxyHttpClient.d.ts +28 -0
- package/build/dts/EnvProxyHttpClient.d.ts.map +1 -0
- package/build/dts/FetchJson.d.ts +444 -37
- package/build/dts/FetchJson.d.ts.map +1 -1
- package/build/dts/Generated.d.ts +1545 -788
- package/build/dts/Generated.d.ts.map +1 -1
- package/build/dts/HttpClientHelpers.d.ts +13 -0
- package/build/dts/HttpClientHelpers.d.ts.map +1 -1
- package/build/dts/Internal.d.ts +6 -4
- package/build/dts/Internal.d.ts.map +1 -1
- package/build/dts/ParseErrorBody.d.ts +26 -0
- package/build/dts/ParseErrorBody.d.ts.map +1 -0
- package/build/dts/Playground.d.ts +20 -0
- package/build/dts/Playground.d.ts.map +1 -1
- package/build/dts/RetryAfter.d.ts +40 -0
- package/build/dts/RetryAfter.d.ts.map +1 -0
- package/build/dts/Service.d.ts +94 -45
- package/build/dts/Service.d.ts.map +1 -1
- package/build/dts/StreamPage.d.ts +10 -0
- package/build/dts/StreamPage.d.ts.map +1 -0
- package/build/dts/index.d.ts +9 -2
- package/build/dts/index.d.ts.map +1 -1
- package/build/esm/AppendixMarkers.js +307 -0
- package/build/esm/AppendixMarkers.js.map +1 -0
- package/build/esm/Client.js +96 -15
- package/build/esm/Client.js.map +1 -1
- package/build/esm/Crawls.js +786 -0
- package/build/esm/Crawls.js.map +1 -0
- package/build/esm/EnvProxyHttpClient.js +55 -0
- package/build/esm/EnvProxyHttpClient.js.map +1 -0
- package/build/esm/FetchJson.js +48 -22
- package/build/esm/FetchJson.js.map +1 -1
- package/build/esm/Generated.js +540 -112
- package/build/esm/Generated.js.map +1 -1
- package/build/esm/HttpClientHelpers.js +36 -1
- package/build/esm/HttpClientHelpers.js.map +1 -1
- package/build/esm/Internal.js +140 -33
- package/build/esm/Internal.js.map +1 -1
- package/build/esm/ParseErrorBody.js +41 -0
- package/build/esm/ParseErrorBody.js.map +1 -0
- package/build/esm/Playground.js +38 -0
- package/build/esm/Playground.js.map +1 -1
- package/build/esm/RetryAfter.js +104 -0
- package/build/esm/RetryAfter.js.map +1 -0
- package/build/esm/Service.js +96 -17
- package/build/esm/Service.js.map +1 -1
- package/build/esm/StreamPage.js +46 -0
- package/build/esm/StreamPage.js.map +1 -0
- package/build/esm/index.js +5 -1
- package/build/esm/index.js.map +1 -1
- package/package.json +8 -2
- package/src/AppendixMarkers.ts +370 -0
- package/src/Client.ts +131 -16
- package/src/Crawls.ts +1387 -0
- package/src/EnvProxyHttpClient.ts +71 -0
- package/src/FetchJson.ts +63 -25
- package/src/Generated.ts +738 -162
- package/src/HttpClientHelpers.ts +48 -1
- package/src/Internal.ts +163 -105
- package/src/ParseErrorBody.ts +42 -0
- package/src/Playground.ts +48 -0
- package/src/RetryAfter.ts +138 -0
- package/src/Service.ts +208 -25
- package/src/StreamPage.ts +47 -0
- package/src/index.ts +29 -3
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
// Appendix omission markers as they appear in Fetch Markdown.
|
|
2
|
+
//
|
|
3
|
+
// Mirrors `packages/core/src/Fetch/AppendixMarkers.ts` (the SDK cannot depend
|
|
4
|
+
// on core). Keep the grammar in sync with the Rust emitter in
|
|
5
|
+
// `native/expand-snapshot/src/markdown/pruner/appendix_markers.rs`.
|
|
6
|
+
//
|
|
7
|
+
// A marker is placed wherever block content renders, so it can arrive with a
|
|
8
|
+
// blockquote or list-item prefix (`> [appendix omitted: …]`). Marker-shaped
|
|
9
|
+
// lines inside fenced code are page text, not markers, and are left alone.
|
|
10
|
+
//
|
|
11
|
+
// [appendix omitted: 14 links · ~320 tokens] {612}
|
|
12
|
+
// [appendix omitted: navigation — Home, News, Sport, +11 more · 14 links · ~320 tokens] {612}
|
|
13
|
+
// [appendix omitted: 7 more blocks · 41 links · ~2100 tokens] (trailing fold; id is the first folded block when bound)
|
|
14
|
+
import { Schema } from 'effect';
|
|
15
|
+
export const APPENDIX_MARKER_PREFIX = '[appendix omitted: ';
|
|
16
|
+
export const AppendixMarkerLevel = Schema.Literal('off', 'compact', 'detailed');
|
|
17
|
+
const MARKER_LINE = /^\[appendix omitted: (?:(?<more>\d+) more blocks? · |(?<label>[a-z]+)(?: — (?<preview>.+?))? · )?(?<links>\d+) links? · ~(?<tokens>\d+) tokens\](?: \{(?<id>\d+)\})?$/u;
|
|
18
|
+
/** One blockquote or list-item prefix, as Markdown renders it. */
|
|
19
|
+
const CONTAINER_PREFIX = /^(?:> ?|[*+-][ \t]|\d+[.)][ \t])/u;
|
|
20
|
+
const FENCE_LINE = /^(`{3,}|~{3,})/u;
|
|
21
|
+
/** A list bullet or ordered-list number introducing an item. */
|
|
22
|
+
const LIST_MARKER = /^(?:[*+-]|\d+[.)])(?=[ \t]|$)/u;
|
|
23
|
+
/**
|
|
24
|
+
* A marker rendered inside a blockquote or a list item carries that container's
|
|
25
|
+
* prefix (`> `, `- `, `1. `, and nestings of those). The Rust emitter places
|
|
26
|
+
* markers wherever block content renders, so consumers have to see through
|
|
27
|
+
* those prefixes or the marker reads as page content.
|
|
28
|
+
*/
|
|
29
|
+
function markerBody(line) {
|
|
30
|
+
let rest = line.trimStart();
|
|
31
|
+
while (!rest.startsWith(APPENDIX_MARKER_PREFIX)) {
|
|
32
|
+
const prefix = CONTAINER_PREFIX.exec(rest);
|
|
33
|
+
if (!prefix)
|
|
34
|
+
return rest;
|
|
35
|
+
rest = rest.slice(prefix[0].length).trimStart();
|
|
36
|
+
}
|
|
37
|
+
return rest;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The container markers a line opens with, and where they leave it.
|
|
41
|
+
*
|
|
42
|
+
* Blockquotes and list items nest in either order (`- > ```rust`), so the two
|
|
43
|
+
* are stripped in turn rather than one after the other. A `>` takes one
|
|
44
|
+
* optional space with it, which is the quote marker rather than indentation.
|
|
45
|
+
* A closing delimiter is read with `allowListMarkers` false: a bullet on a line
|
|
46
|
+
* *inside* a block is code, and reading it as container syntax ends the block.
|
|
47
|
+
*/
|
|
48
|
+
function containerPrefix(line, allowListMarkers) {
|
|
49
|
+
const rawIndent = leadingIndent(line, 0).columns;
|
|
50
|
+
let rest = line;
|
|
51
|
+
let depth = 0;
|
|
52
|
+
let column = 0;
|
|
53
|
+
let markerColumn = Number.MAX_SAFE_INTEGER;
|
|
54
|
+
let afterMarkers;
|
|
55
|
+
const openedItems = [];
|
|
56
|
+
let sawListMarker = false;
|
|
57
|
+
for (;;) {
|
|
58
|
+
const { bytes, columns } = leadingIndent(rest, column);
|
|
59
|
+
rest = rest.slice(bytes);
|
|
60
|
+
column += columns;
|
|
61
|
+
if (rest.startsWith('>')) {
|
|
62
|
+
depth += 1;
|
|
63
|
+
const after = rest.slice(1).startsWith(' ') ? rest.slice(2) : rest.slice(1);
|
|
64
|
+
column += rest.length - after.length;
|
|
65
|
+
rest = after;
|
|
66
|
+
afterMarkers = column;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const { width, content } = allowListMarkers ? listMarkerWidth(rest, column) : { width: 0, content: rest };
|
|
70
|
+
if (width > 0) {
|
|
71
|
+
sawListMarker = true;
|
|
72
|
+
markerColumn = Math.min(markerColumn, column);
|
|
73
|
+
column += width;
|
|
74
|
+
rest = content;
|
|
75
|
+
afterMarkers = column;
|
|
76
|
+
openedItems.push({ depth, column });
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
return { depth, rawIndent, afterMarkers, markerColumn, openedItems, column, sawListMarker, rest };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The column a line begins at for container purposes: its own list marker when
|
|
84
|
+
* it opens an item, otherwise its content.
|
|
85
|
+
*/
|
|
86
|
+
function startsAt(prefix) {
|
|
87
|
+
return prefix.sawListMarker ? prefix.markerColumn : prefix.column;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Whether a line's content is an indented code block — four columns past
|
|
91
|
+
* whatever contains it. That is either the enclosing list item, for the
|
|
92
|
+
* indentation before this line's own markers, or the innermost marker this line
|
|
93
|
+
* opens, for the indentation after them.
|
|
94
|
+
*/
|
|
95
|
+
function isIndentedCode(prefix, contentColumn) {
|
|
96
|
+
const inside = Math.max(contentColumn, prefix.afterMarkers ?? 0);
|
|
97
|
+
return prefix.rawIndent >= contentColumn + 4 || prefix.column >= inside + 4;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Bytes and columns taken by leading whitespace. A tab advances to the next
|
|
101
|
+
* four-column stop, as CommonMark counts it — code bodies are full of them, and
|
|
102
|
+
* reading one as no indentation puts a line outside its own block.
|
|
103
|
+
*/
|
|
104
|
+
function leadingIndent(rest, startColumn) {
|
|
105
|
+
let bytes = 0;
|
|
106
|
+
let column = startColumn;
|
|
107
|
+
for (const character of rest) {
|
|
108
|
+
if (character === ' ')
|
|
109
|
+
column += 1;
|
|
110
|
+
// A tab stop is measured from where the line already is, not from the
|
|
111
|
+
// start of the run.
|
|
112
|
+
else if (character === '\t')
|
|
113
|
+
column += 4 - (column % 4);
|
|
114
|
+
else
|
|
115
|
+
break;
|
|
116
|
+
bytes += 1;
|
|
117
|
+
}
|
|
118
|
+
return { bytes, columns: column - startColumn };
|
|
119
|
+
}
|
|
120
|
+
/** A run of three or more backticks or tildes at the start of `content`. */
|
|
121
|
+
function fenceRun(content) {
|
|
122
|
+
const match = FENCE_LINE.exec(content)?.[1];
|
|
123
|
+
return match === undefined ? undefined : { fenceChar: match[0], run: match.length };
|
|
124
|
+
}
|
|
125
|
+
/** Columns taken by a leading list marker, and the content after it. */
|
|
126
|
+
function listMarkerWidth(rest, startColumn) {
|
|
127
|
+
const marker = LIST_MARKER.exec(rest)?.[0];
|
|
128
|
+
if (marker === undefined)
|
|
129
|
+
return { width: 0, content: rest };
|
|
130
|
+
const afterMarker = rest.slice(marker.length);
|
|
131
|
+
const padding = leadingIndent(afterMarker, startColumn + marker.length);
|
|
132
|
+
// More than four columns of padding is an indented code block inside the
|
|
133
|
+
// item, not a wider marker: the item's content starts one column past it.
|
|
134
|
+
if (padding.columns > 4)
|
|
135
|
+
return { width: marker.length, content: afterMarker };
|
|
136
|
+
return { width: marker.length + padding.columns, content: rest.slice(marker.length + padding.bytes) };
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* The fence a line opens, if any. The caller has already established that the
|
|
140
|
+
* line is not indented code.
|
|
141
|
+
*/
|
|
142
|
+
function opensFence(prefix, itemContentColumn) {
|
|
143
|
+
const run = fenceRun(prefix.rest);
|
|
144
|
+
if (run === undefined)
|
|
145
|
+
return undefined;
|
|
146
|
+
// A backtick fence's info string may not contain a backtick, so ``` `` ``` is
|
|
147
|
+
// a paragraph with inline code in it, not a block that swallows what follows.
|
|
148
|
+
if (run.fenceChar === '`' && prefix.rest.slice(run.run).includes('`'))
|
|
149
|
+
return undefined;
|
|
150
|
+
return { depth: prefix.depth, indent: prefix.column, itemContentColumn, ...run };
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* A fence closes on a run of the same character, at least as long as the open,
|
|
154
|
+
* at the same blockquote depth and no more than three columns further in, with
|
|
155
|
+
* nothing but whitespace after it. Everything else inside the block — an info
|
|
156
|
+
* string, a `>`, a list bullet — is code.
|
|
157
|
+
*/
|
|
158
|
+
function closesFence(line, open) {
|
|
159
|
+
const prefix = containerPrefix(line, false);
|
|
160
|
+
if (prefix.depth !== open.depth || prefix.column > open.indent + 3)
|
|
161
|
+
return false;
|
|
162
|
+
const run = fenceRun(prefix.rest);
|
|
163
|
+
if (run === undefined || run.fenceChar !== open.fenceChar || run.run < open.run)
|
|
164
|
+
return false;
|
|
165
|
+
return prefix.rest.slice(run.run).trim() === '';
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Whether a line has stepped out of the list item a fence opened inside, which
|
|
169
|
+
* ends the block whether or not a closing delimiter ever arrived.
|
|
170
|
+
*/
|
|
171
|
+
function leavesFenceContainer(line, open) {
|
|
172
|
+
if (open.itemContentColumn === 0 && open.depth === 0)
|
|
173
|
+
return false;
|
|
174
|
+
const prefix = containerPrefix(line, true);
|
|
175
|
+
if (prefix.rest.trim() === '' && !prefix.sawListMarker)
|
|
176
|
+
return false;
|
|
177
|
+
return prefix.depth < open.depth || startsAt(prefix) < open.itemContentColumn;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Walk a body's lines, reporting each with the marker it carries, if any.
|
|
181
|
+
*
|
|
182
|
+
* The list items a line sits inside are tracked as a stack of their content
|
|
183
|
+
* columns, because that is the whole difference between four spaces meaning an
|
|
184
|
+
* indented code block and four spaces meaning ordinary item content — and a
|
|
185
|
+
* delimiter that is a fence in one is code in the other.
|
|
186
|
+
*/
|
|
187
|
+
function eachLine(markdown, visit) {
|
|
188
|
+
// Blockquote depth and content column of each open item, outermost first. The
|
|
189
|
+
// depth matters because an item inside a quote ends when the quote does,
|
|
190
|
+
// however its columns compare.
|
|
191
|
+
const openItems = [];
|
|
192
|
+
let fence;
|
|
193
|
+
for (const raw of markdown.split('\n')) {
|
|
194
|
+
// `lines()` in the Rust twin drops the carriage return; a body captured
|
|
195
|
+
// with CRLF must classify the same either way.
|
|
196
|
+
const line = raw.endsWith('\r') ? raw.slice(0, -1) : raw;
|
|
197
|
+
if (fence !== undefined) {
|
|
198
|
+
// A line that steps out of the fence's list item is not part of the
|
|
199
|
+
// block — the block ended above it — so it still has to be read.
|
|
200
|
+
if (leavesFenceContainer(line, fence)) {
|
|
201
|
+
fence = undefined;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
const closing = closesFence(line, fence);
|
|
205
|
+
if (closing)
|
|
206
|
+
fence = undefined;
|
|
207
|
+
// The delimiters belong to the document; only the body between them
|
|
208
|
+
// is code a consumer may drop.
|
|
209
|
+
visit(raw, undefined, !closing);
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
const prefix = containerPrefix(line, true);
|
|
214
|
+
// A blank line neither opens nor closes a container, and the items it sits
|
|
215
|
+
// inside continue after it. An empty list item (`10.` with its content on a
|
|
216
|
+
// later line) looks blank once its marker is stripped, and is not.
|
|
217
|
+
if (prefix.rest.trim() === '' && !prefix.sawListMarker) {
|
|
218
|
+
visit(raw, undefined, false);
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
while (openItems.length > 0) {
|
|
222
|
+
const innermost = openItems[openItems.length - 1];
|
|
223
|
+
if (innermost.depth <= prefix.depth && startsAt(prefix) >= innermost.column)
|
|
224
|
+
break;
|
|
225
|
+
openItems.pop();
|
|
226
|
+
}
|
|
227
|
+
const contentColumn = openItems[openItems.length - 1]?.column ?? 0;
|
|
228
|
+
// An indented code block is not a list item, not a fence, and not a
|
|
229
|
+
// marker — it is code, whatever it looks like.
|
|
230
|
+
if (isIndentedCode(prefix, contentColumn)) {
|
|
231
|
+
visit(raw, undefined, false);
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
for (const opened of prefix.openedItems)
|
|
235
|
+
openItems.push(opened);
|
|
236
|
+
const opening = opensFence(prefix, openItems[openItems.length - 1]?.column ?? 0);
|
|
237
|
+
if (opening !== undefined) {
|
|
238
|
+
fence = opening;
|
|
239
|
+
visit(raw, undefined, false);
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
visit(raw, parseAppendixMarkerLine(line), false);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* A body with the *contents* of fenced code removed, delimiters kept. Evidence
|
|
247
|
+
* ids inside a code example are page text, not citations — but a code block's
|
|
248
|
+
* own id rides on its opening fence, so the delimiters have to stay.
|
|
249
|
+
*/
|
|
250
|
+
export function withoutFencedCode(markdown) {
|
|
251
|
+
const kept = [];
|
|
252
|
+
eachLine(markdown, (line, _marker, fenced) => {
|
|
253
|
+
if (!fenced)
|
|
254
|
+
kept.push(line);
|
|
255
|
+
});
|
|
256
|
+
return kept.join('\n');
|
|
257
|
+
}
|
|
258
|
+
export function isAppendixMarkerLine(line) {
|
|
259
|
+
const body = markerBody(line);
|
|
260
|
+
return body.startsWith(APPENDIX_MARKER_PREFIX) && MARKER_LINE.test(body.trimEnd());
|
|
261
|
+
}
|
|
262
|
+
export function parseAppendixMarkerLine(line) {
|
|
263
|
+
const groups = MARKER_LINE.exec(markerBody(line).trimEnd())?.groups;
|
|
264
|
+
if (!groups)
|
|
265
|
+
return undefined;
|
|
266
|
+
const links = Number(groups.links);
|
|
267
|
+
const approxTokens = Number(groups.tokens);
|
|
268
|
+
if (!Number.isSafeInteger(links) || !Number.isSafeInteger(approxTokens))
|
|
269
|
+
return undefined;
|
|
270
|
+
const evidenceId = groups.id === undefined ? undefined : Number(groups.id);
|
|
271
|
+
const moreBlocks = groups.more === undefined ? undefined : Number(groups.more);
|
|
272
|
+
return {
|
|
273
|
+
evidenceId: evidenceId !== undefined && Number.isSafeInteger(evidenceId) ? evidenceId : undefined,
|
|
274
|
+
links,
|
|
275
|
+
approxTokens,
|
|
276
|
+
label: groups.label,
|
|
277
|
+
preview: groups.preview,
|
|
278
|
+
moreBlocks: moreBlocks !== undefined && Number.isSafeInteger(moreBlocks) ? moreBlocks : undefined,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Remove marker paragraphs from a Markdown body. Markers are synthetic: they
|
|
283
|
+
* are never search snippets, never citable, and never scored by quality evals.
|
|
284
|
+
*/
|
|
285
|
+
export function stripAppendixMarkers(markdown) {
|
|
286
|
+
if (!markdown.includes(APPENDIX_MARKER_PREFIX))
|
|
287
|
+
return markdown;
|
|
288
|
+
const kept = [];
|
|
289
|
+
eachLine(markdown, (line, marker) => {
|
|
290
|
+
if (!marker)
|
|
291
|
+
kept.push(line);
|
|
292
|
+
});
|
|
293
|
+
return kept
|
|
294
|
+
.join('\n')
|
|
295
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
296
|
+
.replace(/\n+$/u, '\n');
|
|
297
|
+
}
|
|
298
|
+
/** Every marker in a Markdown body, in document order. */
|
|
299
|
+
export function parseAppendixMarkers(markdown) {
|
|
300
|
+
const markers = [];
|
|
301
|
+
eachLine(markdown, (_line, marker) => {
|
|
302
|
+
if (marker)
|
|
303
|
+
markers.push(marker);
|
|
304
|
+
});
|
|
305
|
+
return markers;
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=AppendixMarkers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppendixMarkers.js","sourceRoot":"","sources":["../../src/AppendixMarkers.ts"],"names":[],"mappings":"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"}
|
package/build/esm/Client.js
CHANGED
|
@@ -1,6 +1,33 @@
|
|
|
1
|
+
import { Undici } from '@effect/platform-node';
|
|
1
2
|
import { Effect, Either, Exit, Layer } from 'effect';
|
|
3
|
+
import { makeCrawlProjectionsClient, makeCrawlsClient, } from './Crawls.js';
|
|
4
|
+
import { ExpandClientError } from './Error.js';
|
|
2
5
|
import { InternalClient } from './Internal.js';
|
|
3
6
|
import { buildServiceConfig, } from './Service.js';
|
|
7
|
+
export class SnapshotService {
|
|
8
|
+
baseUrl;
|
|
9
|
+
readSnapshot;
|
|
10
|
+
constructor(baseUrl, readSnapshot) {
|
|
11
|
+
this.baseUrl = baseUrl;
|
|
12
|
+
this.readSnapshot = readSnapshot;
|
|
13
|
+
}
|
|
14
|
+
get(params, options = {}) {
|
|
15
|
+
return this.readSnapshot(params, options);
|
|
16
|
+
}
|
|
17
|
+
async network(params) {
|
|
18
|
+
return this.request(`${params.snapshotId}/network${params.q ? `?q=${encodeURIComponent(params.q)}` : ''}`);
|
|
19
|
+
}
|
|
20
|
+
async preview(params) {
|
|
21
|
+
const suffix = `/artifacts/${encodeURIComponent(params.artifactId)}/preview${params.maxBytes !== undefined ? `?maxBytes=${params.maxBytes}` : ''}`;
|
|
22
|
+
return this.request(`${params.snapshotId}${suffix}`);
|
|
23
|
+
}
|
|
24
|
+
async request(path) {
|
|
25
|
+
const response = await globalThis.fetch(`${this.baseUrl.replace(/\/+$/u, '')}/v1/public/snapshots/${path}`);
|
|
26
|
+
if (!response.ok)
|
|
27
|
+
throw new Error(`Snapshot request failed with HTTP ${response.status}`);
|
|
28
|
+
return (await response.json());
|
|
29
|
+
}
|
|
30
|
+
}
|
|
4
31
|
/**
|
|
5
32
|
* Promise-based client for the Expand API. Holds an {@link InternalClient} layer and runs Effects
|
|
6
33
|
* against it, translating typed failures into the `ExpandClient*Error` hierarchy that async/await
|
|
@@ -14,6 +41,18 @@ import { buildServiceConfig, } from './Service.js';
|
|
|
14
41
|
*/
|
|
15
42
|
export class ExpandClient {
|
|
16
43
|
layer;
|
|
44
|
+
lifetime = new AbortController();
|
|
45
|
+
activeRequests = new Set();
|
|
46
|
+
dispatcher;
|
|
47
|
+
closePromise;
|
|
48
|
+
/** Create, list and control crawls, and read their event streams. */
|
|
49
|
+
crawls;
|
|
50
|
+
/** Read stored crawl captures: Markdown, HTML, State JSON and evidence. */
|
|
51
|
+
captures;
|
|
52
|
+
/** Read a crawled page's versions and diffs. */
|
|
53
|
+
pages;
|
|
54
|
+
snapshots;
|
|
55
|
+
projections;
|
|
17
56
|
constructor(options = {}) {
|
|
18
57
|
// Eagerly validate so the Promise constructor matches the documented sync-throw contract.
|
|
19
58
|
// `buildServiceConfig` is a pure-sync Effect (env-var read + Schema.decode), so runSync is safe.
|
|
@@ -25,6 +64,44 @@ export class ExpandClient {
|
|
|
25
64
|
// Layer.orDie narrows the error channel to `never` while keeping a die fallback as a defensive
|
|
26
65
|
// net (translateCause picks up dies via Cause.dieOption and converts via toPublicError).
|
|
27
66
|
this.layer = InternalClient.layer(options).pipe(Layer.orDie);
|
|
67
|
+
const apiKey = options.apiKey ?? process.env.EXPAND_API_KEY;
|
|
68
|
+
if (apiKey === undefined)
|
|
69
|
+
throw new Error('Missing Expand API key.');
|
|
70
|
+
const proxyAwareFetch = (input, init) => {
|
|
71
|
+
if (this.lifetime.signal.aborted) {
|
|
72
|
+
const reason = this.lifetime.signal.reason;
|
|
73
|
+
return Promise.reject(reason instanceof Error ? reason : new ExpandClientError('The Expand client is closed.'));
|
|
74
|
+
}
|
|
75
|
+
this.dispatcher ??= new Undici.EnvHttpProxyAgent();
|
|
76
|
+
const requestSignal = init?.signal === undefined && input instanceof Request ? input.signal : init?.signal;
|
|
77
|
+
const signal = AbortSignal.any([this.lifetime.signal, ...(requestSignal == null ? [] : [requestSignal])]);
|
|
78
|
+
const proxyInit = {
|
|
79
|
+
...init,
|
|
80
|
+
signal,
|
|
81
|
+
dispatcher: this.dispatcher,
|
|
82
|
+
};
|
|
83
|
+
return globalThis.fetch(input, proxyInit);
|
|
84
|
+
};
|
|
85
|
+
const transport = {
|
|
86
|
+
apiKey,
|
|
87
|
+
baseUrl: options.baseUrl ?? 'https://api.expand.ai',
|
|
88
|
+
fetch: proxyAwareFetch,
|
|
89
|
+
timeoutMs: options.timeoutMs,
|
|
90
|
+
maxRetries: options.maxRetries,
|
|
91
|
+
signal: this.lifetime.signal,
|
|
92
|
+
};
|
|
93
|
+
this.crawls = makeCrawlsClient(transport);
|
|
94
|
+
this.projections = makeCrawlProjectionsClient(transport);
|
|
95
|
+
this.captures = this.projections.captures;
|
|
96
|
+
this.pages = this.projections.pages;
|
|
97
|
+
this.snapshots = new SnapshotService(options.baseUrl ?? 'https://api.expand.ai', (params, requestOptions) => this.run((client) => client.getSnapshot(params, requestOptions)));
|
|
98
|
+
}
|
|
99
|
+
/** Abort active requests and release this client's HTTP connections. Repeated calls are safe. */
|
|
100
|
+
close() {
|
|
101
|
+
if (!this.lifetime.signal.aborted)
|
|
102
|
+
this.lifetime.abort(new ExpandClientError('The Expand client is closed.'));
|
|
103
|
+
this.closePromise ??= Promise.all([...this.activeRequests, this.dispatcher?.destroy() ?? Promise.resolve()]).then(() => undefined);
|
|
104
|
+
return this.closePromise;
|
|
28
105
|
}
|
|
29
106
|
/**
|
|
30
107
|
* Fetch a URL through the Expand API.
|
|
@@ -37,20 +114,11 @@ export class ExpandClient {
|
|
|
37
114
|
async fetch(params, options = {}) {
|
|
38
115
|
return this.run((client) => client.fetch(params, options));
|
|
39
116
|
}
|
|
40
|
-
/**
|
|
41
|
-
* Fetch a URL through the object-mode endpoint.
|
|
42
|
-
*
|
|
43
|
-
* Returns `{ meta, markdown, json }`; use {@link fetch} for the raw markdown document.
|
|
44
|
-
*/
|
|
45
117
|
async fetchJson(params, options = {}) {
|
|
118
|
+
if (typeof params === 'string')
|
|
119
|
+
return this.projections.fetchJson(params, options);
|
|
46
120
|
return this.run((client) => client.fetchJson(params, options));
|
|
47
121
|
}
|
|
48
|
-
/**
|
|
49
|
-
* Search a previous Fetch response by `snapshotId` without starting a new capture.
|
|
50
|
-
*/
|
|
51
|
-
async fetchSearch(params, options = {}) {
|
|
52
|
-
return this.run((client) => client.fetchSearch(params, options));
|
|
53
|
-
}
|
|
54
122
|
/**
|
|
55
123
|
* Kick off an asynchronous batched fetch over one or more URLs. Returns a batched-run ID that can
|
|
56
124
|
* be polled via {@link getBatched}.
|
|
@@ -85,11 +153,24 @@ export class ExpandClient {
|
|
|
85
153
|
return this.run((client) => client.cancelBatched(id, options));
|
|
86
154
|
}
|
|
87
155
|
async run(body) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
156
|
+
this.lifetime.signal.throwIfAborted();
|
|
157
|
+
const running = Effect.runPromiseExit(InternalClient.use(body).pipe(Effect.provide(this.layer)), {
|
|
158
|
+
signal: this.lifetime.signal,
|
|
159
|
+
});
|
|
160
|
+
this.activeRequests.add(running);
|
|
161
|
+
try {
|
|
162
|
+
const exit = await running;
|
|
163
|
+
this.lifetime.signal.throwIfAborted();
|
|
164
|
+
if (Exit.isSuccess(exit))
|
|
165
|
+
return exit.value;
|
|
166
|
+
throw InternalClient.translateCause(exit.cause);
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
this.activeRequests.delete(running);
|
|
91
170
|
}
|
|
92
|
-
throw InternalClient.translateCause(exit.cause);
|
|
93
171
|
}
|
|
94
172
|
}
|
|
173
|
+
/** Concise public name used by the Crawl API examples. */
|
|
174
|
+
export class Expand extends ExpandClient {
|
|
175
|
+
}
|
|
95
176
|
//# sourceMappingURL=Client.js.map
|
package/build/esm/Client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Client.js","sourceRoot":"","sources":["../../src/Client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAIN,kBAAkB,
|
|
1
|
+
{"version":3,"file":"Client.js","sourceRoot":"","sources":["../../src/Client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACpD,OAAO,EAGN,0BAA0B,EAC1B,gBAAgB,GAChB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAIN,kBAAkB,GAiBlB,MAAM,cAAc,CAAA;AAyBrB,MAAM,OAAO,eAAe;IAET,OAAO;IACP,YAAY;IAF9B,YACkB,OAAe,EACf,YAGyC;uBAJzC,OAAO;4BACP,YAAY;IAI3B,CAAC;IAMJ,GAAG,CAAC,MAAyB,EAAE,OAAO,GAAmB,EAAE;QAC1D,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAA4D;QACzE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,UAAU,WAAW,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC3G,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAIb;QACA,MAAM,MAAM,GAAG,cAAc,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;QAClJ,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,UAAU,GAAG,MAAM,EAAE,CAAC,CAAA;IACrD,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,IAAY;QACpC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAA;QAC3G,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;QACzF,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAA;IACpC,CAAC;CACD;AAED;;;;;;;;;;GAUG;AACH,MAAM,OAAO,YAAY;IACP,KAAK,CAA6B;IAClC,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAA;IAChC,cAAc,GAAG,IAAI,GAAG,EAAoB,CAAA;IACrD,UAAU,CAA2B;IACrC,YAAY,CAAgB;IACpC,qEAAqE;IAC5D,MAAM,CAAc;IAC7B,2EAA2E;IAClE,QAAQ,CAA2D;IAC5E,gDAAgD;IACvC,KAAK,CAAwD;IAC7D,SAAS,CAAiB;IAClB,WAAW,CAA+C;IAE3E,YAAY,OAAO,GAAwB,EAAE;QAC5C,0FAA0F;QAC1F,iGAAiG;QACjG,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;QAC9E,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAA;QAClC,CAAC;QACD,+FAA+F;QAC/F,+FAA+F;QAC/F,yFAAyF;QACzF,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;QAC3D,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;QACpE,MAAM,eAAe,GAA4B,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAChE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClC,MAAM,MAAM,GAAY,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAA;gBACnD,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,8BAA8B,CAAC,CAAC,CAAA;YAChH,CAAC;YACD,IAAI,CAAC,UAAU,KAAK,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAA;YAClD,MAAM,aAAa,GAAG,IAAI,EAAE,MAAM,KAAK,SAAS,IAAI,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAA;YAC1G,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;YACzG,MAAM,SAAS,GAA6D;gBAC3E,GAAG,IAAI;gBACP,MAAM;gBACN,UAAU,EAAE,IAAI,CAAC,UAAU;aAC3B,CAAA;YACD,OAAO,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;QAC1C,CAAC,CAAA;QACD,MAAM,SAAS,GAAG;YACjB,MAAM;YACN,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,uBAAuB;YACnD,KAAK,EAAE,eAAe;YACtB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;SAC5B,CAAA;QACD,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAA;QACzC,IAAI,CAAC,WAAW,GAAG,0BAA0B,CAAC,SAAS,CAAC,CAAA;QACxD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAA;QACzC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAA;QACnC,IAAI,CAAC,SAAS,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,OAAO,IAAI,uBAAuB,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,CAC3G,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAChE,CAAA;IACF,CAAC;IAED,iGAAiG;IACjG,KAAK;QACJ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO;YAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,iBAAiB,CAAC,8BAA8B,CAAC,CAAC,CAAA;QAC7G,IAAI,CAAC,YAAY,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAChH,GAAG,EAAE,CAAC,SAAS,CACf,CAAA;QACD,OAAO,IAAI,CAAC,YAAY,CAAA;IACzB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,KAAK,CAAC,MAAmB,EAAE,OAAO,GAAwB,EAAE;QACjE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAC3D,CAAC;IAUD,KAAK,CAAC,SAAS,CACd,MAAgC,EAChC,OAAO,GAAqD,EAAE;QAE9D,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAClF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAC/D,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,OAAO,CAAC,MAAqB,EAAE,OAAO,GAA0B,EAAE;QACvE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAC7D,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,OAAO,GAAsC,EAAE;QAC3E,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;IAC5D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,EAAU,EAAE,OAAO,GAAmB,EAAE;QAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;IAC/D,CAAC;IAEO,KAAK,CAAC,GAAG,CAAI,IAAqD;QACzE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,CAAA;QACrC,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YAChG,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;SAC5B,CAAC,CAAA;QACF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAChC,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,OAAO,CAAA;YAC1B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,CAAA;YACrC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAA;YAC3C,MAAM,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChD,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACpC,CAAC;IACF,CAAC;CACD;AAED,0DAA0D;AAC1D,MAAM,OAAO,MAAO,SAAQ,YAAY;CAAG"}
|