scoutline 0.6.3 → 0.7.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 +8 -9
- package/bin/scoutline.js +2 -3
- package/dist/capabilities/crawl.d.ts +93 -0
- package/dist/capabilities/crawl.d.ts.map +1 -0
- package/dist/capabilities/crawl.js +62 -0
- package/dist/capabilities/crawl.js.map +1 -0
- package/dist/capabilities/diagnostics.d.ts +45 -43
- package/dist/capabilities/diagnostics.d.ts.map +1 -1
- package/dist/capabilities/diagnostics.js +58 -71
- package/dist/capabilities/diagnostics.js.map +1 -1
- package/dist/capabilities/map.d.ts +81 -0
- package/dist/capabilities/map.d.ts.map +1 -0
- package/dist/capabilities/map.js +60 -0
- package/dist/capabilities/map.js.map +1 -0
- package/dist/capabilities/quota.js +1 -1
- package/dist/capabilities/quota.js.map +1 -1
- package/dist/capabilities/research.d.ts +98 -0
- package/dist/capabilities/research.d.ts.map +1 -0
- package/dist/capabilities/research.js +71 -0
- package/dist/capabilities/research.js.map +1 -0
- package/dist/capabilities/search.d.ts +9 -1
- package/dist/capabilities/search.d.ts.map +1 -1
- package/dist/commands/crawl.d.ts +46 -0
- package/dist/commands/crawl.d.ts.map +1 -0
- package/dist/commands/crawl.js +170 -0
- package/dist/commands/crawl.js.map +1 -0
- package/dist/commands/doctor.d.ts +7 -8
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +37 -34
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/map.d.ts +39 -0
- package/dist/commands/map.d.ts.map +1 -0
- package/dist/commands/map.js +121 -0
- package/dist/commands/map.js.map +1 -0
- package/dist/commands/read.d.ts.map +1 -1
- package/dist/commands/read.js +7 -1
- package/dist/commands/read.js.map +1 -1
- package/dist/commands/research.d.ts +62 -0
- package/dist/commands/research.d.ts.map +1 -0
- package/dist/commands/research.js +314 -0
- package/dist/commands/research.js.map +1 -0
- package/dist/commands/search.d.ts +2 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +11 -4
- package/dist/commands/search.js.map +1 -1
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +260 -13
- package/dist/index.js.map +1 -1
- package/dist/lib/cache.d.ts +13 -0
- package/dist/lib/cache.d.ts.map +1 -1
- package/dist/lib/cache.js +15 -0
- package/dist/lib/cache.js.map +1 -1
- package/dist/lib/execution.d.ts +105 -1
- package/dist/lib/execution.d.ts.map +1 -1
- package/dist/lib/execution.js +73 -1
- package/dist/lib/execution.js.map +1 -1
- package/dist/lib/redact.d.ts +2 -1
- package/dist/lib/redact.d.ts.map +1 -1
- package/dist/lib/redact.js +19 -7
- package/dist/lib/redact.js.map +1 -1
- package/dist/lib/research-state.d.ts +104 -0
- package/dist/lib/research-state.d.ts.map +1 -0
- package/dist/lib/research-state.js +214 -0
- package/dist/lib/research-state.js.map +1 -0
- package/dist/lib/search-topic.d.ts +21 -0
- package/dist/lib/search-topic.d.ts.map +1 -0
- package/dist/lib/search-topic.js +36 -0
- package/dist/lib/search-topic.js.map +1 -0
- package/dist/providers/minimax/adapter.d.ts.map +1 -1
- package/dist/providers/minimax/adapter.js +41 -4
- package/dist/providers/minimax/adapter.js.map +1 -1
- package/dist/providers/minimax/vision-conformance.d.ts +2 -2
- package/dist/providers/minimax/vision-conformance.js +2 -2
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +2 -0
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/tavily/adapter.d.ts +62 -0
- package/dist/providers/tavily/adapter.d.ts.map +1 -0
- package/dist/providers/tavily/adapter.js +970 -0
- package/dist/providers/tavily/adapter.js.map +1 -0
- package/dist/providers/tavily/client.d.ts +184 -0
- package/dist/providers/tavily/client.d.ts.map +1 -0
- package/dist/providers/tavily/client.js +486 -0
- package/dist/providers/tavily/client.js.map +1 -0
- package/dist/providers/tavily/credentials.d.ts +34 -0
- package/dist/providers/tavily/credentials.d.ts.map +1 -0
- package/dist/providers/tavily/credentials.js +56 -0
- package/dist/providers/tavily/credentials.js.map +1 -0
- package/dist/providers/tavily/diagnostics.d.ts +44 -0
- package/dist/providers/tavily/diagnostics.d.ts.map +1 -0
- package/dist/providers/tavily/diagnostics.js +70 -0
- package/dist/providers/tavily/diagnostics.js.map +1 -0
- package/dist/providers/tavily/quota.d.ts +60 -0
- package/dist/providers/tavily/quota.d.ts.map +1 -0
- package/dist/providers/tavily/quota.js +186 -0
- package/dist/providers/tavily/quota.js.map +1 -0
- package/dist/providers/types.d.ts +14 -2
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js +1 -1
- package/dist/providers/types.js.map +1 -1
- package/dist/providers/zai/adapter.d.ts.map +1 -1
- package/dist/providers/zai/adapter.js +6 -1
- package/dist/providers/zai/adapter.js.map +1 -1
- package/dist/providers/zai/encoded-error.d.ts.map +1 -1
- package/dist/providers/zai/encoded-error.js +8 -6
- package/dist/providers/zai/encoded-error.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider-neutral Map Capability Contract (tech-plan §2b).
|
|
3
|
+
*
|
|
4
|
+
* Declares the single Map operation (`map-fetch`), its provider-neutral
|
|
5
|
+
* request, identity, cache, and result shapes, and a total normalized
|
|
6
|
+
* cache decoder.
|
|
7
|
+
*
|
|
8
|
+
* It imports NO concrete Provider, transport, or Adapter. It does no URL
|
|
9
|
+
* validation, raw response parsing, Provider field mapping, Provider
|
|
10
|
+
* selection, retries, or presentation.
|
|
11
|
+
*
|
|
12
|
+
* Map is the simplest of the three new Tavily capabilities: the API
|
|
13
|
+
* returns URLs only (no per-page content), so there is no per-page
|
|
14
|
+
* projection or truncation concern. The handler therefore needs no
|
|
15
|
+
* `--max-chars` flag.
|
|
16
|
+
*/
|
|
17
|
+
// ===========================================================================
|
|
18
|
+
// Total normalized cache decoder
|
|
19
|
+
// ===========================================================================
|
|
20
|
+
//
|
|
21
|
+
// Accepts `unknown`, returns the typed result or `null`, never throws, and
|
|
22
|
+
// never trusts a generic cast. Shape contract is local; the Adapter is
|
|
23
|
+
// responsible for producing values that conform to `MapResult`.
|
|
24
|
+
function isPlainObject(value) {
|
|
25
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
26
|
+
}
|
|
27
|
+
function isNonEmptyString(value) {
|
|
28
|
+
return typeof value === "string" && value.length > 0;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Decode a MapResult from the cache. Returns the canonical `MapResult`
|
|
32
|
+
* on success, `null` for any malformed value.
|
|
33
|
+
*/
|
|
34
|
+
export function decodeMapResult(value) {
|
|
35
|
+
if (!isPlainObject(value))
|
|
36
|
+
return null;
|
|
37
|
+
if (value.schemaVersion !== 1)
|
|
38
|
+
return null;
|
|
39
|
+
if (!isNonEmptyString(value.baseUrl))
|
|
40
|
+
return null;
|
|
41
|
+
const urls = value.urls;
|
|
42
|
+
if (!Array.isArray(urls))
|
|
43
|
+
return null;
|
|
44
|
+
const decodedUrls = [];
|
|
45
|
+
for (const entry of urls) {
|
|
46
|
+
if (typeof entry !== "string" || entry.length === 0)
|
|
47
|
+
return null;
|
|
48
|
+
decodedUrls.push(entry);
|
|
49
|
+
}
|
|
50
|
+
const totalUrls = value.totalUrls;
|
|
51
|
+
if (typeof totalUrls !== "number" || !Number.isFinite(totalUrls))
|
|
52
|
+
return null;
|
|
53
|
+
return {
|
|
54
|
+
schemaVersion: 1,
|
|
55
|
+
baseUrl: value.baseUrl,
|
|
56
|
+
urls: decodedUrls,
|
|
57
|
+
totalUrls,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/capabilities/map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAkFH,8EAA8E;AAC9E,iCAAiC;AACjC,8EAA8E;AAC9E,EAAE;AACF,2EAA2E;AAC3E,uEAAuE;AACvE,gEAAgE;AAEhE,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3C,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAElD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACjE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IAClC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9E,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,WAAW;QACjB,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota.js","sourceRoot":"","sources":["../../src/capabilities/quota.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,cAAc,EAA2B,MAAM,kBAAkB,CAAC;AAoE3E,SAAS,mBAAmB,CAAC,KAAc;IACzC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACxB,IAAI,KAAK,GAAG,GAAG;QAAE,OAAO,GAAG,CAAC;IAC5B,OAAO,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"quota.js","sourceRoot":"","sources":["../../src/capabilities/quota.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider-neutral Research Capability Contract (tech-plan §2c, §3).
|
|
3
|
+
*
|
|
4
|
+
* Declares the single Research operation (`research-fetch`), its
|
|
5
|
+
* provider-neutral request, identity, cache, and result shapes, and a
|
|
6
|
+
* total normalized cache decoder.
|
|
7
|
+
*
|
|
8
|
+
* Research is the most complex of the three new Tavily capabilities: it
|
|
9
|
+
* runs an asynchronous create→poll lifecycle server-side and costs 4-250
|
|
10
|
+
* credits per request. The Adapter's `invoke()` owns that full lifecycle
|
|
11
|
+
* (state-file resume, POST, poll loop, completion/failure/404 handling);
|
|
12
|
+
* shared execution wraps it with the standard cache-then-invoke pattern
|
|
13
|
+
* but forces `maxRetries: 0` so a transient POST failure never risks a
|
|
14
|
+
* double-charge (tech-plan §3, §4).
|
|
15
|
+
*
|
|
16
|
+
* It imports NO concrete Provider, transport, or Adapter. It does no
|
|
17
|
+
* query validation, raw response parsing, Provider field mapping,
|
|
18
|
+
* Provider selection, retries, or presentation.
|
|
19
|
+
*/
|
|
20
|
+
import type { CacheIdentity, CachedOperation } from "../lib/execution.js";
|
|
21
|
+
/**
|
|
22
|
+
* The single Research Capability operation. Cache identity partitions by
|
|
23
|
+
* the composite `${capability}-${operation}` literal; the v2 partitioned
|
|
24
|
+
* key shape is
|
|
25
|
+
* `v2.research-research-fetch.<provider>.<credential-hash>.<request-hash>.json`.
|
|
26
|
+
*
|
|
27
|
+
* `--max-chars`, `--no-cache`, `--timeout` (polling), and output mode are
|
|
28
|
+
* handler-level projections/policy and do NOT participate in the cache
|
|
29
|
+
* identity.
|
|
30
|
+
*/
|
|
31
|
+
export type ResearchOperationKind = "research-fetch";
|
|
32
|
+
/**
|
|
33
|
+
* Provider-neutral research request. `query` MUST be supplied explicitly
|
|
34
|
+
* (the handler rejects empty/whitespace queries at parse time before this
|
|
35
|
+
* request reaches the Adapter).
|
|
36
|
+
*
|
|
37
|
+
* EVERY field except `query` participates in the v2 partitioned cache
|
|
38
|
+
* identity: `model`, `outputLength`, `citationFormat`, and `domain` each
|
|
39
|
+
* alter the report the Provider produces, so two requests differing only
|
|
40
|
+
* in citation format MUST NOT share a cache entry. `--max-chars`,
|
|
41
|
+
* `--no-cache`, `--timeout`, and output mode NEVER appear here — they are
|
|
42
|
+
* projections/policy applied around the cached normalized result.
|
|
43
|
+
*/
|
|
44
|
+
export interface ResearchRequest {
|
|
45
|
+
readonly query: string;
|
|
46
|
+
/** Research model: mini (cheapest), pro (deepest), auto (default). */
|
|
47
|
+
readonly model?: "mini" | "pro" | "auto";
|
|
48
|
+
/** Output length: short, standard (default), long. */
|
|
49
|
+
readonly outputLength?: "short" | "standard" | "long";
|
|
50
|
+
/** Citation format: numbered (default), mla, apa, chicago. */
|
|
51
|
+
readonly citationFormat?: "numbered" | "mla" | "apa" | "chicago";
|
|
52
|
+
/** Restrict research to a single domain. */
|
|
53
|
+
readonly domain?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* A single research source. `favicon` and other Provider-only fields are
|
|
57
|
+
* dropped at the Adapter boundary.
|
|
58
|
+
*/
|
|
59
|
+
export interface ResearchSource {
|
|
60
|
+
readonly title: string;
|
|
61
|
+
readonly url: string;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Normalized research result. `schemaVersion: 1` is the breaking shape.
|
|
65
|
+
* `report` is the full report text (cache stores it untruncated;
|
|
66
|
+
* `--max-chars` is a handler projection). `model` echoes the requested
|
|
67
|
+
* model so the cached entry is self-describing.
|
|
68
|
+
*/
|
|
69
|
+
export interface ResearchResult {
|
|
70
|
+
readonly schemaVersion: 1;
|
|
71
|
+
readonly query: string;
|
|
72
|
+
readonly model: string;
|
|
73
|
+
readonly report: string;
|
|
74
|
+
readonly sources: readonly ResearchSource[];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Generic Research operation descriptor. The Adapter supplies one of
|
|
78
|
+
* these for the `research-fetch` operation it supports. The Adapter's
|
|
79
|
+
* `invoke()` owns the full create→poll→state-file lifecycle internally
|
|
80
|
+
* (tech-plan §3); shared execution wraps it with cache + zero-retry.
|
|
81
|
+
*/
|
|
82
|
+
export interface ResearchOperation extends CachedOperation<ResearchRequest, ResearchResult> {
|
|
83
|
+
readonly kind: ResearchOperationKind;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Research Capability contract. Every Adapter that supports research
|
|
87
|
+
* implements this interface and exposes it as `adapter.research`.
|
|
88
|
+
*/
|
|
89
|
+
export interface ResearchCapability {
|
|
90
|
+
readonly run: ResearchOperation;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Decode a ResearchResult from the cache. Returns the canonical
|
|
94
|
+
* `ResearchResult` on success, `null` for any malformed value.
|
|
95
|
+
*/
|
|
96
|
+
export declare function decodeResearchResult(value: unknown): ResearchResult | null;
|
|
97
|
+
export type ResearchCacheIdentity = CacheIdentity<ResearchRequest, ResearchResult>;
|
|
98
|
+
//# sourceMappingURL=research.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/capabilities/research.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAM1E;;;;;;;;;GASG;AACH,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,CAAC;AAMrD;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,sEAAsE;IACtE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;IACzC,sDAAsD;IACtD,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;IACtD,8DAA8D;IAC9D,QAAQ,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC;IACjE,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAMD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;CAC7C;AAMD;;;;;GAKG;AACH,MAAM,WAAW,iBAAkB,SAAQ,eAAe,CAAC,eAAe,EAAE,cAAc,CAAC;IACzF,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;CACtC;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAC;CACjC;AAkBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CA6B1E;AAID,MAAM,MAAM,qBAAqB,GAAG,aAAa,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider-neutral Research Capability Contract (tech-plan §2c, §3).
|
|
3
|
+
*
|
|
4
|
+
* Declares the single Research operation (`research-fetch`), its
|
|
5
|
+
* provider-neutral request, identity, cache, and result shapes, and a
|
|
6
|
+
* total normalized cache decoder.
|
|
7
|
+
*
|
|
8
|
+
* Research is the most complex of the three new Tavily capabilities: it
|
|
9
|
+
* runs an asynchronous create→poll lifecycle server-side and costs 4-250
|
|
10
|
+
* credits per request. The Adapter's `invoke()` owns that full lifecycle
|
|
11
|
+
* (state-file resume, POST, poll loop, completion/failure/404 handling);
|
|
12
|
+
* shared execution wraps it with the standard cache-then-invoke pattern
|
|
13
|
+
* but forces `maxRetries: 0` so a transient POST failure never risks a
|
|
14
|
+
* double-charge (tech-plan §3, §4).
|
|
15
|
+
*
|
|
16
|
+
* It imports NO concrete Provider, transport, or Adapter. It does no
|
|
17
|
+
* query validation, raw response parsing, Provider field mapping,
|
|
18
|
+
* Provider selection, retries, or presentation.
|
|
19
|
+
*/
|
|
20
|
+
// ===========================================================================
|
|
21
|
+
// Total normalized cache decoder
|
|
22
|
+
// ===========================================================================
|
|
23
|
+
//
|
|
24
|
+
// Accepts `unknown`, returns the typed result or `null`, never throws, and
|
|
25
|
+
// never trusts a generic cast. Shape contract is local; the Adapter is
|
|
26
|
+
// responsible for producing values that conform to `ResearchResult`.
|
|
27
|
+
function isPlainObject(value) {
|
|
28
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
29
|
+
}
|
|
30
|
+
function isNonEmptyString(value) {
|
|
31
|
+
return typeof value === "string" && value.length > 0;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Decode a ResearchResult from the cache. Returns the canonical
|
|
35
|
+
* `ResearchResult` on success, `null` for any malformed value.
|
|
36
|
+
*/
|
|
37
|
+
export function decodeResearchResult(value) {
|
|
38
|
+
if (!isPlainObject(value))
|
|
39
|
+
return null;
|
|
40
|
+
if (value.schemaVersion !== 1)
|
|
41
|
+
return null;
|
|
42
|
+
if (!isNonEmptyString(value.query))
|
|
43
|
+
return null;
|
|
44
|
+
if (!isNonEmptyString(value.model))
|
|
45
|
+
return null;
|
|
46
|
+
// `report` may legitimately be empty for a failed-but-completed run, but
|
|
47
|
+
// it must be a string. Require the field; do not require non-empty.
|
|
48
|
+
if (typeof value.report !== "string")
|
|
49
|
+
return null;
|
|
50
|
+
const sources = value.sources;
|
|
51
|
+
if (!Array.isArray(sources))
|
|
52
|
+
return null;
|
|
53
|
+
const decodedSources = [];
|
|
54
|
+
for (const entry of sources) {
|
|
55
|
+
if (!isPlainObject(entry))
|
|
56
|
+
return null;
|
|
57
|
+
if (!isNonEmptyString(entry.title))
|
|
58
|
+
return null;
|
|
59
|
+
if (!isNonEmptyString(entry.url))
|
|
60
|
+
return null;
|
|
61
|
+
decodedSources.push({ title: entry.title, url: entry.url });
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
schemaVersion: 1,
|
|
65
|
+
query: value.query,
|
|
66
|
+
model: value.model,
|
|
67
|
+
report: value.report,
|
|
68
|
+
sources: decodedSources,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=research.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/capabilities/research.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAiGH,8EAA8E;AAC9E,iCAAiC;AACjC,8EAA8E;AAC9E,EAAE;AACF,2EAA2E;AAC3E,uEAAuE;AACvE,qEAAqE;AAErE,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3C,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,yEAAyE;IACzE,oEAAoE;IACpE,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAElD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,MAAM,cAAc,GAAqB,EAAE,CAAC;IAC5C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACvC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAChD,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9C,cAAc,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,cAAc;KACxB,CAAC;AACJ,CAAC"}
|
|
@@ -20,16 +20,24 @@
|
|
|
20
20
|
import type { ProviderId } from "../providers/types.js";
|
|
21
21
|
/** Recency filter accepted by Z.AI; MiniMax rejects it. */
|
|
22
22
|
export type SearchRecency = "oneDay" | "oneWeek" | "oneMonth" | "oneYear" | "noLimit";
|
|
23
|
+
/**
|
|
24
|
+
* Topic hint accepted by all Search Providers. Each Adapter maps it
|
|
25
|
+
* differently: Tavily passes it natively; Z.AI and MiniMax append a
|
|
26
|
+
* keyword to the query inside `invoke()`.
|
|
27
|
+
*/
|
|
28
|
+
export type SearchTopic = "general" | "news" | "finance";
|
|
23
29
|
/**
|
|
24
30
|
* Provider controls accepted by the Search Capability. Every field is
|
|
25
31
|
* optional. MiniMax rejects `domain`, `recency`, `contentSize`, and
|
|
26
|
-
* `location` with `UNSUPPORTED_OPTION` before any SDK access.
|
|
32
|
+
* `location` with `UNSUPPORTED_OPTION` before any SDK access. `topic`
|
|
33
|
+
* is accepted by all adapters.
|
|
27
34
|
*/
|
|
28
35
|
export interface SearchControls {
|
|
29
36
|
domain?: string;
|
|
30
37
|
recency?: SearchRecency;
|
|
31
38
|
contentSize?: "medium" | "high";
|
|
32
39
|
location?: "cn" | "us";
|
|
40
|
+
topic?: SearchTopic;
|
|
33
41
|
}
|
|
34
42
|
/**
|
|
35
43
|
* A Search request. `query` must contain at least one non-whitespace
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/capabilities/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAMxD,2DAA2D;AAC3D,MAAM,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/capabilities/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAMxD,2DAA2D;AAC3D,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAEtF;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,WAAW,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAChC,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;CACrC;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAMD;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,YAAY,EAAE,GAAG,IAAI,CAAC;CACxD;AAED;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC;IAC9B,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC1C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,0BAA0B,EAAE,CAAC;CACnE;AAMD;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAEvC;;;;;OAKG;IACH,aAAa,CACX,OAAO,EAAE,aAAa,EACtB,aAAa,CAAC,EAAE;QAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAChD,mBAAmB,CAAC;IAEvB;;;;OAIG;IACH,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAAC;CAClE"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crawl command — thin handler over the Crawl Capability
|
|
3
|
+
* (tech-plan §2a, §8).
|
|
4
|
+
*
|
|
5
|
+
* The handler applies parse-level validation (URL scheme), delegates to
|
|
6
|
+
* `capability.fetch(request)` through the generic shared execution
|
|
7
|
+
* wrapper (`executeCachedOperation`), then projects the normalized
|
|
8
|
+
* `CrawlResult` into the public envelope. The Adapter owns URL
|
|
9
|
+
* validation, credentials, transport, raw response parsing, cache
|
|
10
|
+
* identity, and error normalization; the handler owns projection
|
|
11
|
+
* (`--max-chars` per-page truncation) and output-mode presentation.
|
|
12
|
+
*
|
|
13
|
+
* Provider selection, capability support, configuration, Adapter
|
|
14
|
+
* construction, and adapter.crawl agreement live in `src/index.ts`.
|
|
15
|
+
*
|
|
16
|
+
* Cache stores full content; `truncated` and `originalContentLength`
|
|
17
|
+
* are handler projections (mirrors reader).
|
|
18
|
+
*/
|
|
19
|
+
import type { CommandContext, CommandResult } from "../command-invocation.js";
|
|
20
|
+
import type { CrawlCapability } from "../capabilities/crawl.js";
|
|
21
|
+
import type { ExecutionDependencies } from "../lib/execution.js";
|
|
22
|
+
export interface CrawlOptions {
|
|
23
|
+
readonly depth?: number;
|
|
24
|
+
readonly breadth?: number;
|
|
25
|
+
readonly limit?: number;
|
|
26
|
+
readonly selectPaths?: string;
|
|
27
|
+
readonly excludePaths?: string;
|
|
28
|
+
readonly instructions?: string;
|
|
29
|
+
readonly format?: "markdown" | "text";
|
|
30
|
+
readonly contentSize?: "medium" | "high";
|
|
31
|
+
readonly timeout?: number;
|
|
32
|
+
readonly noCache?: boolean;
|
|
33
|
+
readonly maxChars?: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Dependencies injected by `src/index.ts` after Provider selection,
|
|
37
|
+
* capability support check, configuration check, Adapter construction,
|
|
38
|
+
* and adapter.crawl agreement.
|
|
39
|
+
*/
|
|
40
|
+
export interface CrawlHandlerDependencies {
|
|
41
|
+
readonly capability: CrawlCapability;
|
|
42
|
+
readonly execution: ExecutionDependencies;
|
|
43
|
+
}
|
|
44
|
+
export declare function crawl(url: string, options: CrawlOptions | undefined, deps: CrawlHandlerDependencies, _context?: CommandContext): Promise<CommandResult>;
|
|
45
|
+
export declare const CRAWL_HELP: string;
|
|
46
|
+
//# sourceMappingURL=crawl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crawl.d.ts","sourceRoot":"","sources":["../../src/commands/crawl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AASjE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,qBAAqB,CAAC;CAC3C;AA0FD,wBAAsB,KAAK,CACzB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,YAAY,YAAK,EAC1B,IAAI,EAAE,wBAAwB,EAC9B,QAAQ,CAAC,EAAE,cAAc,GACxB,OAAO,CAAC,aAAa,CAAC,CAwBxB;AAQD,eAAO,MAAM,UAAU,QAuDf,CAAC"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crawl command — thin handler over the Crawl Capability
|
|
3
|
+
* (tech-plan §2a, §8).
|
|
4
|
+
*
|
|
5
|
+
* The handler applies parse-level validation (URL scheme), delegates to
|
|
6
|
+
* `capability.fetch(request)` through the generic shared execution
|
|
7
|
+
* wrapper (`executeCachedOperation`), then projects the normalized
|
|
8
|
+
* `CrawlResult` into the public envelope. The Adapter owns URL
|
|
9
|
+
* validation, credentials, transport, raw response parsing, cache
|
|
10
|
+
* identity, and error normalization; the handler owns projection
|
|
11
|
+
* (`--max-chars` per-page truncation) and output-mode presentation.
|
|
12
|
+
*
|
|
13
|
+
* Provider selection, capability support, configuration, Adapter
|
|
14
|
+
* construction, and adapter.crawl agreement live in `src/index.ts`.
|
|
15
|
+
*
|
|
16
|
+
* Cache stores full content; `truncated` and `originalContentLength`
|
|
17
|
+
* are handler projections (mirrors reader).
|
|
18
|
+
*/
|
|
19
|
+
import { executeCachedOperation } from "../lib/execution.js";
|
|
20
|
+
import { OUTPUT_MODES } from "../lib/output.js";
|
|
21
|
+
import { ValidationError } from "../lib/errors.js";
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Parse-level validation
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
function validateUrl(url) {
|
|
26
|
+
if (!url.startsWith("http://") && !url.startsWith("https://")) {
|
|
27
|
+
throw new ValidationError("URL must start with http:// or https://");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// Projection helpers
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
/**
|
|
34
|
+
* Apply `--max-chars` truncation to a single page's content. Mirrors the
|
|
35
|
+
* reader's truncation contract: slice to `max - 1`, trim trailing
|
|
36
|
+
* whitespace, append `…`.
|
|
37
|
+
*/
|
|
38
|
+
function truncateContent(content, max) {
|
|
39
|
+
const originalLen = content.length;
|
|
40
|
+
if (!max || max <= 0 || originalLen <= max) {
|
|
41
|
+
return { text: content, originalLen, truncated: false };
|
|
42
|
+
}
|
|
43
|
+
return { text: content.slice(0, max - 1).trimEnd() + "…", originalLen, truncated: true };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Build the Provider-neutral CrawlRequest from CrawlOptions. Only fields
|
|
47
|
+
* that affect the Provider request or the cache identity appear here;
|
|
48
|
+
* `--max-chars`, `--no-cache`, and output mode never enter the request.
|
|
49
|
+
*/
|
|
50
|
+
function buildCrawlRequest(url, options) {
|
|
51
|
+
const request = { url };
|
|
52
|
+
if (options.depth !== undefined)
|
|
53
|
+
request.depth = options.depth;
|
|
54
|
+
if (options.breadth !== undefined)
|
|
55
|
+
request.breadth = options.breadth;
|
|
56
|
+
if (options.limit !== undefined)
|
|
57
|
+
request.limit = options.limit;
|
|
58
|
+
if (options.selectPaths !== undefined)
|
|
59
|
+
request.selectPaths = options.selectPaths;
|
|
60
|
+
if (options.excludePaths !== undefined)
|
|
61
|
+
request.excludePaths = options.excludePaths;
|
|
62
|
+
if (options.instructions !== undefined)
|
|
63
|
+
request.instructions = options.instructions;
|
|
64
|
+
if (options.format !== undefined)
|
|
65
|
+
request.format = options.format;
|
|
66
|
+
if (options.contentSize !== undefined)
|
|
67
|
+
request.contentSize = options.contentSize;
|
|
68
|
+
if (options.timeout !== undefined)
|
|
69
|
+
request.timeout = options.timeout;
|
|
70
|
+
return request;
|
|
71
|
+
}
|
|
72
|
+
function projectPage(page, maxChars) {
|
|
73
|
+
if (!maxChars || maxChars <= 0) {
|
|
74
|
+
return { url: page.url, content: page.content, contentFormat: page.contentFormat };
|
|
75
|
+
}
|
|
76
|
+
const { text, originalLen, truncated } = truncateContent(page.content, maxChars);
|
|
77
|
+
return {
|
|
78
|
+
url: page.url,
|
|
79
|
+
content: text,
|
|
80
|
+
contentFormat: page.contentFormat,
|
|
81
|
+
truncated,
|
|
82
|
+
originalContentLength: originalLen,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function buildCrawlPresentations(pages) {
|
|
86
|
+
const urls = pages.map((p) => p.url);
|
|
87
|
+
const compact = urls.join("\n");
|
|
88
|
+
const refs = urls.map((u, i) => `[${i + 1}] ${u}`).join("\n");
|
|
89
|
+
const markdown = pages.map((p) => `## ${p.url}\n\n${p.content}`).join("\n\n---\n\n");
|
|
90
|
+
return { compact, markdown, refs, tty: markdown };
|
|
91
|
+
}
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
// Handler
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
export async function crawl(url, options = {}, deps, _context) {
|
|
96
|
+
validateUrl(url);
|
|
97
|
+
const request = buildCrawlRequest(url, options);
|
|
98
|
+
const result = await executeCachedOperation(deps.capability.fetch, request, { noCache: options.noCache === true }, deps.execution);
|
|
99
|
+
// Projection: apply --max-chars per page. The cache stores full content;
|
|
100
|
+
// truncation state is recomputed on every read.
|
|
101
|
+
const projectedPages = result.pages.map((page) => projectPage(page, options.maxChars));
|
|
102
|
+
const envelope = {
|
|
103
|
+
schemaVersion: 1,
|
|
104
|
+
baseUrl: result.baseUrl,
|
|
105
|
+
pages: projectedPages,
|
|
106
|
+
totalPages: result.totalPages,
|
|
107
|
+
};
|
|
108
|
+
return { kind: "data", data: envelope, presentations: buildCrawlPresentations(projectedPages) };
|
|
109
|
+
}
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
// Help
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
const OUTPUT_MODE_LIST = OUTPUT_MODES.join(" | ");
|
|
114
|
+
export const CRAWL_HELP = `
|
|
115
|
+
Crawl Command - Crawl a website starting from a URL (Provider Capability)
|
|
116
|
+
|
|
117
|
+
Usage: scoutline crawl <url> [options]
|
|
118
|
+
|
|
119
|
+
Crawls pages starting from <url>, following links up to the configured
|
|
120
|
+
depth and breadth. Returns a structured result with an array of pages.
|
|
121
|
+
|
|
122
|
+
Provider selection (precedence: --provider, then SCOUTLINE_PROVIDER,
|
|
123
|
+
then the configured default):
|
|
124
|
+
- Tavily advertises the crawl Capability and supplies the Adapter.
|
|
125
|
+
- Z.AI and MiniMax do NOT advertise crawl. Selecting them returns
|
|
126
|
+
UNSUPPORTED_CAPABILITY with no fallback.
|
|
127
|
+
|
|
128
|
+
Options:
|
|
129
|
+
--depth <n> Crawl depth, 1-5 (default: 1)
|
|
130
|
+
--breadth <n> Max links to follow per page, 1-500 (default: 20)
|
|
131
|
+
--limit <n> Total pages to process (default: 50)
|
|
132
|
+
--select-paths <rx> Comma-separated regex patterns to select URL paths
|
|
133
|
+
--exclude-paths <rx> Comma-separated regex patterns to exclude URL paths
|
|
134
|
+
--instructions <t> Natural language instructions for page selection
|
|
135
|
+
--format <f> Output format: markdown (default), text
|
|
136
|
+
--content-size <s> Extraction depth: medium (default), high
|
|
137
|
+
--timeout <s> Request timeout in seconds (default: 150)
|
|
138
|
+
--max-chars <n> Truncate each page's content to <n> chars
|
|
139
|
+
(projection only; cache stores full content)
|
|
140
|
+
--no-cache Bypass the response cache for this invocation
|
|
141
|
+
|
|
142
|
+
Common Options:
|
|
143
|
+
--provider <id> Override the active Provider (zai | minimax | tavily)
|
|
144
|
+
--output-format <mode> One of: ${OUTPUT_MODE_LIST} (default: data)
|
|
145
|
+
-O <mode> Alias for --output-format
|
|
146
|
+
|
|
147
|
+
Output format (schema-version-1):
|
|
148
|
+
{
|
|
149
|
+
"schemaVersion": 1,
|
|
150
|
+
"baseUrl": "<the URL you passed>",
|
|
151
|
+
"pages": [
|
|
152
|
+
{
|
|
153
|
+
"url": "<page URL>",
|
|
154
|
+
"content": "<page body as markdown/text>",
|
|
155
|
+
"contentFormat": "markdown" | "text",
|
|
156
|
+
"truncated": false, // present when --max-chars is set
|
|
157
|
+
"originalContentLength": <number> // present when --max-chars is set
|
|
158
|
+
}
|
|
159
|
+
],
|
|
160
|
+
"totalPages": <number>
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
Examples:
|
|
164
|
+
scoutline crawl https://docs.example.com --depth 1
|
|
165
|
+
scoutline crawl https://example.com --depth 2 --breadth 10 --limit 20
|
|
166
|
+
scoutline crawl https://docs.example.com --select-paths "/api/.*,/guide/.*"
|
|
167
|
+
scoutline crawl https://example.com --format text --max-chars 2000
|
|
168
|
+
scoutline --provider tavily crawl https://example.com --depth 3
|
|
169
|
+
`.trim();
|
|
170
|
+
//# sourceMappingURL=crawl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crawl.js","sourceRoot":"","sources":["../../src/commands/crawl.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,14 +38,13 @@ export interface DoctorDiagnosticsDependencies {
|
|
|
38
38
|
readonly cacheSummary?: string;
|
|
39
39
|
}
|
|
40
40
|
/**
|
|
41
|
-
* Build a schema-version-
|
|
42
|
-
* (`
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
* failures.
|
|
41
|
+
* Build a schema-version-2 {@link DiagnosticsReport}. Inventory
|
|
42
|
+
* (`capabilityMatrix`) is derived purely from `deps.descriptors` — no
|
|
43
|
+
* descriptor.create(), no transport, no production registry import.
|
|
44
|
+
* Under `--no-tools` the command returns after metadata +
|
|
45
|
+
* configured-state evaluation. Otherwise each configured Provider is
|
|
46
|
+
* probed through shared execution with settled collection, preserving
|
|
47
|
+
* registry order and normalized redacted failures.
|
|
49
48
|
*/
|
|
50
49
|
export declare function buildDiagnosticsReport(deps: DoctorDiagnosticsDependencies): Promise<DiagnosticsReport>;
|
|
51
50
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,gCAAgC,CAAC;AAKxC,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAsB,MAAM,uBAAuB,CAAC;AAMhG,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,UAAU,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACpD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC;IAC9B;;;;;;;OAOG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AA6CD;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,6BAA6B,GAClC,OAAO,CAAC,iBAAiB,CAAC,CAiC5B;AA4CD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAKhE;AAMD,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACxD;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAC1B,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAO3C;AAED,eAAO,MAAM,WAAW,QA4DhB,CAAC"}
|