@x12i/sdk 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 x12i
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/client.d.ts CHANGED
@@ -1,53 +1,120 @@
1
1
  import { ParserRegistry, type ClassifyCandidate, type FetchResult, type ParsedResult, type Parser } from "@x12i/core";
2
- import { type FetchOptions } from "@x12i/fetcher";
2
+ import { type FetchOptions, type RetrieveOptions, type RetrieveBatchItem, type FetchCache, type SnapshotStore, type CachedRetrieveOptions, type ChangeCheckRequest, type ChangeCheckResult } from "@x12i/fetcher";
3
3
  import { type IngestOptions, type IngestResult } from "@x12i/ingest";
4
+ import { type SearchConfig, type SearchProvider, type WebSearchRequest, type WebSearchResponse } from "@x12i/search";
5
+ import { type CrawlRequest, type CrawlResult } from "@x12i/crawl";
6
+ import { type ResearchPacket, type ResearchRequest } from "@x12i/research";
7
+ import { type ExtractRequest, type ExtractResult, type ExtractionAdapter } from "@x12i/extract";
8
+ import { type RunRecord, type RunStore, type ListItemsOptions, type ListItemsResult } from "@x12i/runs";
4
9
  export interface WebAgentClientOptions {
5
- /** Provide your own registry (e.g. to only register a subset of parsers). Defaults to every first-party parser. */
6
10
  registry?: ParserRegistry;
7
- /** Default fetch options applied to every call, overridable per-call. */
8
11
  fetchOptions?: FetchOptions;
9
- /**
10
- * Reuse a single browser instance across calls instead of launching one
11
- * per fetch. Recommended for long-lived processes (the API/MCP server).
12
- * Call `.close()` when done.
13
- */
14
12
  reuseBrowser?: boolean;
13
+ search?: SearchProvider | SearchConfig | null;
14
+ fetchCache?: FetchCache;
15
+ snapshotStore?: SnapshotStore;
16
+ runStore?: RunStore;
17
+ extractionAdapter?: ExtractionAdapter;
18
+ /** When true, client owns and closes default in-memory stores it created. */
19
+ ownsDefaultStores?: boolean;
20
+ }
21
+ export interface FetchSearchResultsOptions {
22
+ positions?: number[];
23
+ urls?: string[];
24
+ concurrency?: number;
25
+ continueOnError?: boolean;
26
+ fetchOptions?: FetchOptions;
27
+ signal?: AbortSignal;
28
+ }
29
+ export interface FetchedSearchPage {
30
+ position?: number;
31
+ url: string;
32
+ title?: string;
33
+ fetch?: FetchResult;
34
+ error?: string;
35
+ }
36
+ export interface SearchAndFetchRequest extends WebSearchRequest {
37
+ top?: number;
38
+ positions?: number[];
39
+ urls?: string[];
40
+ concurrency?: number;
41
+ continueOnError?: boolean;
42
+ fetchOptions?: FetchOptions;
43
+ signal?: AbortSignal;
44
+ }
45
+ export interface SearchAndFetchResult {
46
+ search: WebSearchResponse;
47
+ pages: FetchedSearchPage[];
15
48
  }
16
49
  /**
17
- * The single entry point every other package (CLI, REST API, MCP server)
18
- * wraps: download a URL to Markdown, and/or classify+parse it into typed
19
- * JSON using the registered parsers.
50
+ * Canonical programmatic surface: fetch/retrieve/research/crawl/extract/runs.
51
+ * CLI, REST, and MCP are thin adapters around this client.
20
52
  */
21
53
  export declare class WebAgentClient {
22
54
  readonly registry: ParserRegistry;
23
55
  private readonly defaultFetchOptions;
24
56
  private readonly reuseBrowser;
57
+ private readonly searchProvider;
25
58
  private browserPromise;
59
+ readonly fetchCache: FetchCache;
60
+ readonly snapshotStore: SnapshotStore;
61
+ readonly runStore: RunStore;
62
+ private readonly extractionAdapter?;
63
+ private readonly ownsCache;
64
+ private readonly ownsSnapshots;
65
+ private readonly ownsRuns;
26
66
  constructor(options?: WebAgentClientOptions);
27
- /** Register an additional parser on this client's registry. */
28
67
  use<T>(parser: Parser<T>): this;
29
- /** Download a URL and return { url, html, markdown, ... }. */
68
+ /** Download a URL via Playwright (compatibility default: browser strategy). */
30
69
  fetch(url: string, options?: FetchOptions): Promise<FetchResult>;
31
- /** Fetch a URL, then rank every registered parser's fit without running parse(). */
70
+ /** Strategy-aware multi-format retrieval (default strategy: auto). */
71
+ retrieve(url: string, options?: RetrieveOptions): Promise<FetchResult>;
72
+ fetchBatch(request: {
73
+ urls: string[];
74
+ concurrency?: number;
75
+ continueOnError?: boolean;
76
+ retrieveOptions?: RetrieveOptions;
77
+ signal?: AbortSignal;
78
+ }): Promise<RetrieveBatchItem[]>;
79
+ retrieveCached(url: string, options?: CachedRetrieveOptions): Promise<FetchResult>;
32
80
  classify(url: string, options?: FetchOptions): Promise<ClassifyCandidate[]>;
33
- /** Fetch a URL, classify it, and parse it with the best-fit parser. */
34
81
  parse<T = unknown>(url: string, options?: FetchOptions): Promise<ParsedResult<T>>;
35
- /** Fetch a URL and force a specific parser by type id, skipping classification. */
36
82
  parseAs<T = unknown>(type: string, url: string, options?: FetchOptions): Promise<ParsedResult<T>>;
37
- /** List every registered parser's type id + description. */
38
83
  listParsers(): {
39
84
  type: string;
40
85
  description?: string;
41
86
  version?: string;
42
87
  }[];
43
- /**
44
- * Ingest a curated list / README URL: follow outbound GitHub skill links
45
- * one level deep and extract targeted files (SKILL.md, .md, .sh, …).
46
- * Uses GitHub raw/API — not Playwright.
47
- */
48
88
  ingest(rootUrl: string, options?: IngestOptions): Promise<IngestResult>;
89
+ search(request: WebSearchRequest, options?: {
90
+ signal?: AbortSignal;
91
+ }): Promise<WebSearchResponse>;
92
+ searchConfigured(): boolean;
93
+ fetchSearchResults(searchResult: WebSearchResponse, options?: FetchSearchResultsOptions): Promise<FetchedSearchPage[]>;
94
+ searchAndFetch(request: SearchAndFetchRequest): Promise<SearchAndFetchResult>;
95
+ research(request: ResearchRequest, options?: {
96
+ signal?: AbortSignal;
97
+ }): Promise<ResearchPacket>;
98
+ startResearch(request: ResearchRequest, opts?: {
99
+ idempotencyKey?: string;
100
+ }): Promise<RunRecord>;
101
+ private runResearchJob;
102
+ crawl(request: CrawlRequest, options?: {
103
+ signal?: AbortSignal;
104
+ }): Promise<CrawlResult>;
105
+ startCrawl(request: CrawlRequest, opts?: {
106
+ idempotencyKey?: string;
107
+ }): Promise<RunRecord>;
108
+ private runCrawlJob;
109
+ extract(request: ExtractRequest): Promise<ExtractResult>;
110
+ checkChanges(request: ChangeCheckRequest & {
111
+ url?: string;
112
+ }): Promise<ChangeCheckResult>;
113
+ getRun(runId: string): Promise<RunRecord | undefined>;
114
+ listRunItems(runId: string, options?: ListItemsOptions): Promise<ListItemsResult>;
115
+ cancelRun(runId: string): Promise<RunRecord>;
116
+ resumeRun(runId: string): Promise<RunRecord>;
49
117
  private getBrowser;
50
- /** Close the reused browser, if one was launched. No-op otherwise. */
51
118
  close(): Promise<void>;
52
119
  }
53
120
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,MAAM,EACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAoB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AA8CvF,MAAM,WAAW,qBAAqB;IACpC,mHAAmH;IACnH,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,yEAAyE;IACzE,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,qBAAa,cAAc;IACzB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAe;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IACvC,OAAO,CAAC,cAAc,CAA+B;gBAEzC,OAAO,GAAE,qBAA0B;IAM/C,+DAA+D;IAC/D,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAK/B,8DAA8D;IACxD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC;IAU1E,oFAAoF;IAC9E,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAKrF,uEAAuE;IACjE,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAK3F,mFAAmF;IAC7E,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAK3G,4DAA4D;IAC5D,WAAW;;;;;IAIX;;;;OAIG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC;YAI7D,UAAU;IAKxB,sEAAsE;IAChE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js CHANGED
@@ -1,6 +1,15 @@
1
- import { fetchUrl, launchBrowser } from "@x12i/fetcher";
1
+ import { fetchUrl, launchBrowser, retrieve, retrieveBatch, retrieveWithCache, checkChanges, InMemoryFetchCache, InMemorySnapshotStore, } from "@x12i/fetcher";
2
2
  import { ingestRepository } from "@x12i/ingest";
3
+ import { createSerperProvider, loadSearchConfig, search as runSearch, } from "@x12i/search";
4
+ import { crawl } from "@x12i/crawl";
5
+ import { research } from "@x12i/research";
6
+ import { extract, } from "@x12i/extract";
7
+ import { InMemoryRunStore, } from "@x12i/runs";
8
+ import { createHash } from "node:crypto";
3
9
  import { createDefaultRegistry } from "./registry.js";
10
+ function requestHash(value) {
11
+ return createHash("sha256").update(JSON.stringify(value)).digest("hex").slice(0, 24);
12
+ }
4
13
  /**
5
14
  * Per-site fetch defaults so client-rendered pages actually populate before
6
15
  * we snapshot HTML. Caller-supplied options still win (spread after this).
@@ -13,7 +22,6 @@ function siteFetchDefaults(url) {
13
22
  if ((host === "openrouter.ai" || host.endsWith(".openrouter.ai")) &&
14
23
  (path === "/rankings" || path.startsWith("/rankings/"))) {
15
24
  return {
16
- // Live leaderboard rows are CSS-grid divs, not <table>s.
17
25
  waitForSelector: "div.grid.grid-cols-12.items-center",
18
26
  settleMs: 500,
19
27
  };
@@ -28,7 +36,6 @@ function siteFetchDefaults(url) {
28
36
  return { waitForSelector: "article h1, h1", settleMs: 800 };
29
37
  }
30
38
  if (host === "g2.com" || host === "www.g2.com" || host.endsWith(".g2.com")) {
31
- // G2 often serves a bot-challenge with no product <h1>; don't hard-wait.
32
39
  return { settleMs: 1500 };
33
40
  }
34
41
  }
@@ -38,26 +45,40 @@ function siteFetchDefaults(url) {
38
45
  return {};
39
46
  }
40
47
  /**
41
- * The single entry point every other package (CLI, REST API, MCP server)
42
- * wraps: download a URL to Markdown, and/or classify+parse it into typed
43
- * JSON using the registered parsers.
48
+ * Canonical programmatic surface: fetch/retrieve/research/crawl/extract/runs.
49
+ * CLI, REST, and MCP are thin adapters around this client.
44
50
  */
45
51
  export class WebAgentClient {
46
52
  registry;
47
53
  defaultFetchOptions;
48
54
  reuseBrowser;
55
+ searchProvider;
49
56
  browserPromise;
57
+ fetchCache;
58
+ snapshotStore;
59
+ runStore;
60
+ extractionAdapter;
61
+ ownsCache;
62
+ ownsSnapshots;
63
+ ownsRuns;
50
64
  constructor(options = {}) {
51
65
  this.registry = options.registry ?? createDefaultRegistry();
52
66
  this.defaultFetchOptions = options.fetchOptions ?? {};
53
67
  this.reuseBrowser = options.reuseBrowser ?? false;
68
+ this.searchProvider = resolveSearchProvider(options.search);
69
+ this.ownsCache = !options.fetchCache;
70
+ this.ownsSnapshots = !options.snapshotStore;
71
+ this.ownsRuns = !options.runStore;
72
+ this.fetchCache = options.fetchCache ?? new InMemoryFetchCache();
73
+ this.snapshotStore = options.snapshotStore ?? new InMemorySnapshotStore();
74
+ this.runStore = options.runStore ?? new InMemoryRunStore();
75
+ this.extractionAdapter = options.extractionAdapter;
54
76
  }
55
- /** Register an additional parser on this client's registry. */
56
77
  use(parser) {
57
78
  this.registry.register(parser);
58
79
  return this;
59
80
  }
60
- /** Download a URL and return { url, html, markdown, ... }. */
81
+ /** Download a URL via Playwright (compatibility default: browser strategy). */
61
82
  async fetch(url, options = {}) {
62
83
  const browser = this.reuseBrowser ? await this.getBrowser() : undefined;
63
84
  return fetchUrl(url, {
@@ -67,44 +88,329 @@ export class WebAgentClient {
67
88
  browser: browser ?? options.browser,
68
89
  });
69
90
  }
70
- /** Fetch a URL, then rank every registered parser's fit without running parse(). */
91
+ /** Strategy-aware multi-format retrieval (default strategy: auto). */
92
+ async retrieve(url, options = {}) {
93
+ const browser = this.reuseBrowser ? await this.getBrowser() : undefined;
94
+ return retrieve(url, {
95
+ ...this.defaultFetchOptions,
96
+ ...siteFetchDefaults(url),
97
+ strategy: "auto",
98
+ ...options,
99
+ browser: browser ?? options.browser,
100
+ });
101
+ }
102
+ async fetchBatch(request) {
103
+ const browser = this.reuseBrowser ? await this.getBrowser() : undefined;
104
+ return retrieveBatch({
105
+ ...request,
106
+ retrieveOptions: {
107
+ ...this.defaultFetchOptions,
108
+ strategy: "auto",
109
+ ...request.retrieveOptions,
110
+ browser: browser ?? request.retrieveOptions?.browser,
111
+ },
112
+ });
113
+ }
114
+ async retrieveCached(url, options = {}) {
115
+ const browser = this.reuseBrowser ? await this.getBrowser() : undefined;
116
+ return retrieveWithCache(url, {
117
+ ...this.defaultFetchOptions,
118
+ ...siteFetchDefaults(url),
119
+ strategy: "auto",
120
+ cache: this.fetchCache,
121
+ ...options,
122
+ browser: browser ?? options.browser,
123
+ });
124
+ }
71
125
  async classify(url, options = {}) {
72
126
  const fetched = await this.fetch(url, options);
73
127
  return this.registry.classify(fetched);
74
128
  }
75
- /** Fetch a URL, classify it, and parse it with the best-fit parser. */
76
129
  async parse(url, options = {}) {
77
130
  const fetched = await this.fetch(url, options);
78
131
  return this.registry.parse(fetched);
79
132
  }
80
- /** Fetch a URL and force a specific parser by type id, skipping classification. */
81
133
  async parseAs(type, url, options = {}) {
82
134
  const fetched = await this.fetch(url, options);
83
135
  return this.registry.parseAs(type, fetched);
84
136
  }
85
- /** List every registered parser's type id + description. */
86
137
  listParsers() {
87
138
  return this.registry.list();
88
139
  }
89
- /**
90
- * Ingest a curated list / README URL: follow outbound GitHub skill links
91
- * one level deep and extract targeted files (SKILL.md, .md, .sh, …).
92
- * Uses GitHub raw/API — not Playwright.
93
- */
94
140
  ingest(rootUrl, options = {}) {
95
141
  return ingestRepository(rootUrl, options);
96
142
  }
143
+ search(request, options = {}) {
144
+ return runSearch(request, {
145
+ provider: this.searchProvider ?? null,
146
+ signal: options.signal,
147
+ });
148
+ }
149
+ searchConfigured() {
150
+ return this.searchProvider !== undefined;
151
+ }
152
+ async fetchSearchResults(searchResult, options = {}) {
153
+ const targets = resolveFetchTargets(searchResult, options);
154
+ const concurrency = Math.max(1, options.concurrency ?? 2);
155
+ const continueOnError = options.continueOnError !== false;
156
+ const pages = [];
157
+ for (let i = 0; i < targets.length; i += concurrency) {
158
+ if (options.signal?.aborted)
159
+ break;
160
+ const batch = targets.slice(i, i + concurrency);
161
+ const settled = await Promise.all(batch.map(async (t) => {
162
+ try {
163
+ const fetched = await this.fetch(t.url, {
164
+ ...options.fetchOptions,
165
+ });
166
+ return {
167
+ position: t.position,
168
+ url: t.url,
169
+ title: fetched.title ?? t.title,
170
+ fetch: fetched,
171
+ };
172
+ }
173
+ catch (err) {
174
+ const error = err instanceof Error ? err.message : String(err);
175
+ if (!continueOnError)
176
+ throw err;
177
+ return { position: t.position, url: t.url, title: t.title, error };
178
+ }
179
+ }));
180
+ pages.push(...settled);
181
+ }
182
+ return pages;
183
+ }
184
+ async searchAndFetch(request) {
185
+ const { top, positions, urls, concurrency, continueOnError, fetchOptions, signal, ...searchRequest } = request;
186
+ const searchResult = await this.search(searchRequest, { signal });
187
+ const pages = await this.fetchSearchResults(searchResult, {
188
+ positions: positions ?? (urls ? undefined : range(1, top ?? 3)),
189
+ urls,
190
+ concurrency,
191
+ continueOnError,
192
+ fetchOptions,
193
+ signal,
194
+ });
195
+ return { search: searchResult, pages };
196
+ }
197
+ async research(request, options = {}) {
198
+ const browser = this.reuseBrowser ? await this.getBrowser() : undefined;
199
+ const deps = {
200
+ searchFn: (req, opts) => this.search(req, opts),
201
+ retrieveFn: (url, ropts) => retrieve(url, {
202
+ ...this.defaultFetchOptions,
203
+ strategy: "auto",
204
+ ...ropts,
205
+ browser,
206
+ }),
207
+ registry: this.registry,
208
+ signal: options.signal,
209
+ };
210
+ return research(request, deps);
211
+ }
212
+ async startResearch(request, opts) {
213
+ const run = await this.runStore.create({
214
+ type: "research",
215
+ request,
216
+ requestHash: requestHash(request),
217
+ idempotencyKey: opts?.idempotencyKey,
218
+ });
219
+ void this.runResearchJob(run.id, request);
220
+ return run;
221
+ }
222
+ async runResearchJob(runId, request) {
223
+ await this.runStore.update(runId, { status: "planning" });
224
+ await this.runStore.update(runId, { status: "running", phase: "research" });
225
+ try {
226
+ const packet = await this.research(request);
227
+ const status = packet.status === "completed"
228
+ ? "completed"
229
+ : packet.status === "failed"
230
+ ? "failed"
231
+ : packet.status === "cancelled"
232
+ ? "cancelled"
233
+ : packet.status === "partial"
234
+ ? "partial"
235
+ : "completed_with_errors";
236
+ await this.runStore.update(runId, { status });
237
+ await this.runStore.appendItem?.(runId, {
238
+ kind: "packet",
239
+ data: packet,
240
+ });
241
+ }
242
+ catch (err) {
243
+ await this.runStore.update(runId, {
244
+ status: "failed",
245
+ errors: [
246
+ {
247
+ code: "PARSER_FAILED",
248
+ message: err instanceof Error ? err.message : String(err),
249
+ phase: "export",
250
+ retryable: false,
251
+ },
252
+ ],
253
+ });
254
+ }
255
+ }
256
+ async crawl(request, options = {}) {
257
+ const browser = this.reuseBrowser ? await this.getBrowser() : undefined;
258
+ return crawl(request, {
259
+ retrieve: (url, ropts) => retrieve(url, {
260
+ ...this.defaultFetchOptions,
261
+ strategy: "auto",
262
+ includeLinks: true,
263
+ ...ropts,
264
+ browser,
265
+ }),
266
+ signal: options.signal,
267
+ });
268
+ }
269
+ async startCrawl(request, opts) {
270
+ const run = await this.runStore.create({
271
+ type: "crawl",
272
+ request,
273
+ requestHash: requestHash(request),
274
+ idempotencyKey: opts?.idempotencyKey,
275
+ });
276
+ void this.runCrawlJob(run.id, request);
277
+ return run;
278
+ }
279
+ async runCrawlJob(runId, request) {
280
+ await this.runStore.update(runId, { status: "running", phase: "crawl" });
281
+ try {
282
+ const result = await this.crawl(request);
283
+ await this.runStore.update(runId, {
284
+ status: result.terminationReason === "cancelled" ? "cancelled" : "completed",
285
+ usage: {
286
+ pagesFetched: result.usage.pagesFetched,
287
+ bytesFetched: result.usage.bytesFetched,
288
+ },
289
+ });
290
+ await this.runStore.appendItem?.(runId, {
291
+ kind: "crawl_result",
292
+ data: result,
293
+ });
294
+ }
295
+ catch (err) {
296
+ await this.runStore.update(runId, {
297
+ status: "failed",
298
+ errors: [
299
+ {
300
+ code: "PARSER_FAILED",
301
+ message: err instanceof Error ? err.message : String(err),
302
+ phase: "crawl",
303
+ retryable: false,
304
+ },
305
+ ],
306
+ });
307
+ }
308
+ }
309
+ async extract(request) {
310
+ const browser = this.reuseBrowser ? await this.getBrowser() : undefined;
311
+ return extract(request, {
312
+ registry: this.registry,
313
+ adapter: this.extractionAdapter,
314
+ retrieveFn: (url, opts) => retrieve(url, {
315
+ ...this.defaultFetchOptions,
316
+ strategy: "auto",
317
+ ...opts,
318
+ browser,
319
+ }),
320
+ });
321
+ }
322
+ async checkChanges(request) {
323
+ let current = request.current;
324
+ if (!current && request.url) {
325
+ current = await this.retrieve(request.url, { strategy: "auto" });
326
+ if (current.canonicalUrl) {
327
+ await this.snapshotStore.put({
328
+ canonicalUrl: current.canonicalUrl,
329
+ markdown: current.markdown,
330
+ rawContentHash: current.rawContentHash,
331
+ normalizedContentHash: current.normalizedContentHash,
332
+ });
333
+ }
334
+ }
335
+ let previousSnapshot = request.previousSnapshot;
336
+ if (!previousSnapshot && !request.previous && current?.canonicalUrl) {
337
+ previousSnapshot = await this.snapshotStore.latestForUrl(current.canonicalUrl);
338
+ }
339
+ return checkChanges({ ...request, current, previousSnapshot });
340
+ }
341
+ getRun(runId) {
342
+ return this.runStore.get(runId);
343
+ }
344
+ listRunItems(runId, options) {
345
+ return this.runStore.listItems(runId, options);
346
+ }
347
+ cancelRun(runId) {
348
+ return this.runStore.requestCancel(runId);
349
+ }
350
+ async resumeRun(runId) {
351
+ const run = await this.runStore.get(runId);
352
+ if (!run)
353
+ throw new Error("RUN_NOT_FOUND");
354
+ if (!["partial", "cancelled", "failed"].includes(run.status)) {
355
+ throw new Error("RUN_NOT_RESUMABLE");
356
+ }
357
+ await this.runStore.update(runId, { status: "queued", cancellationRequested: false });
358
+ if (run.type === "research") {
359
+ void this.runResearchJob(runId, run.request);
360
+ }
361
+ else if (run.type === "crawl") {
362
+ void this.runCrawlJob(runId, run.request);
363
+ }
364
+ return (await this.runStore.get(runId));
365
+ }
97
366
  async getBrowser() {
98
367
  this.browserPromise ??= launchBrowser(this.defaultFetchOptions.executablePath);
99
368
  return this.browserPromise;
100
369
  }
101
- /** Close the reused browser, if one was launched. No-op otherwise. */
102
370
  async close() {
103
371
  if (this.browserPromise) {
104
372
  const browser = await this.browserPromise;
105
373
  await browser.close();
106
374
  this.browserPromise = undefined;
107
375
  }
376
+ void this.ownsCache;
377
+ void this.ownsSnapshots;
378
+ void this.ownsRuns;
108
379
  }
109
380
  }
381
+ function resolveSearchProvider(search) {
382
+ if (search === null)
383
+ return undefined;
384
+ if (!search) {
385
+ return createSerperProvider(loadSearchConfig());
386
+ }
387
+ if ("search" in search && typeof search.search === "function") {
388
+ return search;
389
+ }
390
+ return createSerperProvider(search);
391
+ }
392
+ function resolveFetchTargets(searchResult, options) {
393
+ if (options.urls?.length) {
394
+ return options.urls.map((url) => {
395
+ const match = searchResult.organic.find((o) => o.url === url);
396
+ return { url, position: match?.position, title: match?.title };
397
+ });
398
+ }
399
+ const positions = options.positions?.length
400
+ ? options.positions
401
+ : searchResult.organic.map((o) => o.position);
402
+ const out = [];
403
+ for (const pos of positions) {
404
+ const hit = searchResult.organic.find((o) => o.position === pos);
405
+ if (hit)
406
+ out.push({ url: hit.url, position: hit.position, title: hit.title });
407
+ }
408
+ return out;
409
+ }
410
+ function range(start, endInclusive) {
411
+ const out = [];
412
+ for (let i = start; i <= endInclusive; i++)
413
+ out.push(i);
414
+ return out;
415
+ }
110
416
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,20 @@
1
1
  export * from "./client.js";
2
2
  export * from "./registry.js";
3
3
  export * from "@x12i/core";
4
- export type { FetchOptions } from "@x12i/fetcher";
4
+ export type { FetchOptions, RetrieveOptions, RetrieveBatchItem, FetchCache, SnapshotStore, FreshnessMode, ChangeCheckRequest, ChangeCheckResult, } from "@x12i/fetcher";
5
+ export { InMemoryFetchCache, InMemorySnapshotStore, retrieve, retrieveBatch, checkChanges, } from "@x12i/fetcher";
5
6
  export type { IngestOptions, IngestResult, IngestedAsset, ExtractedFile, IngestProgressEvent, } from "@x12i/ingest";
7
+ export type { WebSearchRequest, WebSearchResponse, OrganicSearchResult, SearchConfig, SearchProvider, SearchErrorCode, SearchCandidate, SelectionOptions, } from "@x12i/search";
8
+ export { SearchError, isSearchConfigured, loadEnvFile, loadSearchConfig, searchCapabilityStatus, mergeSearchCandidates, selectCandidates, normalizeQueries, } from "@x12i/search";
9
+ export type { ResearchRequest, ResearchPacket } from "@x12i/research";
10
+ export { research } from "@x12i/research";
11
+ export type { CrawlRequest, CrawlResult } from "@x12i/crawl";
12
+ export { crawl } from "@x12i/crawl";
13
+ export type { ExtractRequest, ExtractResult, ExtractionAdapter, ExtractionMode, } from "@x12i/extract";
14
+ export { extract } from "@x12i/extract";
15
+ export type { EvidenceBlock } from "@x12i/evidence";
16
+ export { splitEvidence, rankEvidence, buildCitationMarkdown } from "@x12i/evidence";
17
+ export type { RunRecord, RunStore, RunStatus } from "@x12i/runs";
18
+ export { InMemoryRunStore, IdempotencyConflictError } from "@x12i/runs";
19
+ export { META_PARSER_TYPE, buildLlmBrief, createMetaParser, defaultSchemaCatalog, findSchema, metaLlmBriefParser, type MetaLlmBriefData, type PageSchema, } from "@x12i/parsers-meta";
6
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,YAAY,EACV,aAAa,EACb,YAAY,EACZ,aAAa,EACb,aAAa,EACb,mBAAmB,GACpB,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,YAAY,EACV,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,QAAQ,EACR,aAAa,EACb,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,aAAa,EACb,YAAY,EACZ,aAAa,EACb,aAAa,EACb,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,YAAY,EACV,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACpF,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,oBAAoB,EACpB,UAAU,EACV,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,KAAK,UAAU,GAChB,MAAM,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,12 @@
1
1
  export * from "./client.js";
2
2
  export * from "./registry.js";
3
3
  export * from "@x12i/core";
4
+ export { InMemoryFetchCache, InMemorySnapshotStore, retrieve, retrieveBatch, checkChanges, } from "@x12i/fetcher";
5
+ export { SearchError, isSearchConfigured, loadEnvFile, loadSearchConfig, searchCapabilityStatus, mergeSearchCandidates, selectCandidates, normalizeQueries, } from "@x12i/search";
6
+ export { research } from "@x12i/research";
7
+ export { crawl } from "@x12i/crawl";
8
+ export { extract } from "@x12i/extract";
9
+ export { splitEvidence, rankEvidence, buildCitationMarkdown } from "@x12i/evidence";
10
+ export { InMemoryRunStore, IdempotencyConflictError } from "@x12i/runs";
11
+ export { META_PARSER_TYPE, buildLlmBrief, createMetaParser, defaultSchemaCatalog, findSchema, metaLlmBriefParser, } from "@x12i/parsers-meta";
4
12
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAW3B,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,QAAQ,EACR,aAAa,EACb,YAAY,GACb,MAAM,eAAe,CAAC;AAkBvB,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAOpC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEpF,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,oBAAoB,EACpB,UAAU,EACV,kBAAkB,GAGnB,MAAM,oBAAoB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAQ5C;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,cAAc,CAOtD"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAS5C;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,cAAc,CAUtD"}
package/dist/registry.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { ParserRegistry } from "@x12i/core";
2
2
  import { openRouterRankingsParser } from "@x12i/parser-openrouter";
3
+ import { metaLlmBriefParser } from "@x12i/parsers-meta";
3
4
  import { g2ProductParser, linkedInCompanyParser, mediumArticleParser, } from "@x12i/parsers-web";
4
5
  /**
5
6
  * A ParserRegistry pre-loaded with every first-party parser this monorepo
@@ -12,6 +13,9 @@ export function createDefaultRegistry() {
12
13
  g2ProductParser,
13
14
  linkedInCompanyParser,
14
15
  mediumArticleParser,
16
+ // Metadata fallback: declarative schemas → LLM response instructions.
17
+ // Keep last; its confidence stays below site-specific parsers.
18
+ metaLlmBriefParser,
15
19
  ]);
16
20
  }
17
21
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,cAAc,EAAE,CAAC,WAAW,CAAC;QACtC,wBAAwB;QACxB,eAAe;QACf,qBAAqB;QACrB,mBAAmB;KACpB,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,cAAc,EAAE,CAAC,WAAW,CAAC;QACtC,wBAAwB;QACxB,eAAe;QACf,qBAAqB;QACrB,mBAAmB;QACnB,sEAAsE;QACtE,+DAA+D;QAC/D,kBAAkB;KACnB,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@x12i/sdk",
3
- "version": "0.1.0",
4
- "description": "Programmatic client: fetch(url) -> Markdown, parse(url) -> typed JSON via the parser registry. What the CLI, REST API, and MCP server are all thin wrappers around.",
3
+ "version": "0.3.0",
4
+ "description": "Programmatic client: fetch, retrieve, research, crawl, extract — the CLI, REST API, and MCP server wrap this.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -13,11 +13,18 @@
13
13
  },
14
14
  "dependencies": {
15
15
  "playwright": "^1.49.1",
16
- "@x12i/core": "0.1.0",
17
- "@x12i/parser-openrouter": "0.1.0",
18
- "@x12i/ingest": "0.1.0",
19
- "@x12i/fetcher": "0.1.0",
20
- "@x12i/parsers-web": "0.1.0"
16
+ "@x12i/core": "0.3.0",
17
+ "@x12i/fetcher": "0.3.0",
18
+ "@x12i/ingest": "0.3.0",
19
+ "@x12i/crawl": "0.3.0",
20
+ "@x12i/evidence": "0.3.0",
21
+ "@x12i/search": "0.3.0",
22
+ "@x12i/research": "0.3.0",
23
+ "@x12i/extract": "0.3.0",
24
+ "@x12i/runs": "0.3.0",
25
+ "@x12i/parser-openrouter": "0.3.0",
26
+ "@x12i/parsers-meta": "0.3.0",
27
+ "@x12i/parsers-web": "0.3.0"
21
28
  },
22
29
  "devDependencies": {
23
30
  "typescript": "^5.7.3",
@@ -40,6 +47,9 @@
40
47
  "bugs": {
41
48
  "url": "https://github.com/x12i/web-agentic-tools/issues"
42
49
  },
50
+ "engines": {
51
+ "node": ">=20"
52
+ },
43
53
  "scripts": {
44
54
  "build": "tsc -p tsconfig.json",
45
55
  "dev": "tsc -p tsconfig.json --watch",