scoutline 0.22.0 → 0.23.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 +60 -26
- package/dist/capabilities/search.d.ts +18 -4
- package/dist/capabilities/search.d.ts.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +14 -5
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/crawl.d.ts.map +1 -1
- package/dist/commands/crawl.js +2 -1
- package/dist/commands/crawl.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +2 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts +42 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +42 -5
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/map.d.ts.map +1 -1
- package/dist/commands/map.js +2 -1
- package/dist/commands/map.js.map +1 -1
- package/dist/commands/quota.d.ts.map +1 -1
- package/dist/commands/quota.js +2 -2
- package/dist/commands/quota.js.map +1 -1
- package/dist/commands/read.d.ts.map +1 -1
- package/dist/commands/read.js +2 -1
- package/dist/commands/read.js.map +1 -1
- package/dist/commands/repo.js +1 -1
- package/dist/commands/research.d.ts.map +1 -1
- package/dist/commands/research.js +2 -1
- package/dist/commands/research.js.map +1 -1
- package/dist/commands/search.d.ts +54 -6
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +273 -25
- package/dist/commands/search.js.map +1 -1
- package/dist/index.d.ts +72 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +364 -8
- package/dist/index.js.map +1 -1
- package/dist/lib/code-mode.d.ts +12 -0
- package/dist/lib/code-mode.d.ts.map +1 -1
- package/dist/lib/code-mode.js +18 -10
- package/dist/lib/code-mode.js.map +1 -1
- package/dist/lib/config-store.d.ts +45 -1
- package/dist/lib/config-store.d.ts.map +1 -1
- package/dist/lib/config-store.js +70 -1
- package/dist/lib/config-store.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +5 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/errors.d.ts +7 -1
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +8 -2
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/execution.d.ts +14 -5
- package/dist/lib/execution.d.ts.map +1 -1
- package/dist/lib/execution.js +25 -6
- package/dist/lib/execution.js.map +1 -1
- package/dist/lib/mcp-client.d.ts +7 -0
- package/dist/lib/mcp-client.d.ts.map +1 -1
- package/dist/lib/mcp-client.js +11 -1
- package/dist/lib/mcp-client.js.map +1 -1
- package/dist/lib/parse-zoned-instant.d.ts +13 -0
- package/dist/lib/parse-zoned-instant.d.ts.map +1 -0
- package/dist/lib/parse-zoned-instant.js +17 -0
- package/dist/lib/parse-zoned-instant.js.map +1 -0
- package/dist/lib/quota-mapping.d.ts +4 -2
- package/dist/lib/quota-mapping.d.ts.map +1 -1
- package/dist/lib/quota-mapping.js +25 -2
- package/dist/lib/quota-mapping.js.map +1 -1
- package/dist/lib/redact.d.ts +3 -2
- package/dist/lib/redact.d.ts.map +1 -1
- package/dist/lib/redact.js +90 -24
- package/dist/lib/redact.js.map +1 -1
- package/dist/lib/timeout.d.ts +28 -0
- package/dist/lib/timeout.d.ts.map +1 -0
- package/dist/lib/timeout.js +30 -0
- package/dist/lib/timeout.js.map +1 -0
- package/dist/lib/url.d.ts +10 -4
- package/dist/lib/url.d.ts.map +1 -1
- package/dist/lib/url.js +21 -6
- package/dist/lib/url.js.map +1 -1
- package/dist/providers/arxiv/client.d.ts +4 -1
- package/dist/providers/arxiv/client.d.ts.map +1 -1
- package/dist/providers/arxiv/client.js +11 -3
- package/dist/providers/arxiv/client.js.map +1 -1
- package/dist/providers/bocha/adapter.d.ts +43 -0
- package/dist/providers/bocha/adapter.d.ts.map +1 -0
- package/dist/providers/bocha/adapter.js +197 -0
- package/dist/providers/bocha/adapter.js.map +1 -0
- package/dist/providers/bocha/client.d.ts +51 -0
- package/dist/providers/bocha/client.d.ts.map +1 -0
- package/dist/providers/bocha/client.js +104 -0
- package/dist/providers/bocha/client.js.map +1 -0
- package/dist/providers/bocha/credentials.d.ts +12 -0
- package/dist/providers/bocha/credentials.d.ts.map +1 -0
- package/dist/providers/bocha/credentials.js +29 -0
- package/dist/providers/bocha/credentials.js.map +1 -0
- package/dist/providers/bocha/diagnostics.d.ts +17 -0
- package/dist/providers/bocha/diagnostics.d.ts.map +1 -0
- package/dist/providers/bocha/diagnostics.js +33 -0
- package/dist/providers/bocha/diagnostics.js.map +1 -0
- package/dist/providers/brave/adapter.d.ts.map +1 -1
- package/dist/providers/brave/adapter.js +4 -3
- package/dist/providers/brave/adapter.js.map +1 -1
- package/dist/providers/brave/client.d.ts +1 -0
- package/dist/providers/brave/client.d.ts.map +1 -1
- package/dist/providers/brave/client.js +4 -6
- package/dist/providers/brave/client.js.map +1 -1
- package/dist/providers/brave/credentials.d.ts +2 -0
- package/dist/providers/brave/credentials.d.ts.map +1 -1
- package/dist/providers/brave/credentials.js +2 -0
- package/dist/providers/brave/credentials.js.map +1 -1
- package/dist/providers/catalog.d.ts +34 -0
- package/dist/providers/catalog.d.ts.map +1 -0
- package/dist/providers/catalog.js +57 -0
- package/dist/providers/catalog.js.map +1 -0
- package/dist/providers/crossref/adapter.js +2 -2
- package/dist/providers/crossref/adapter.js.map +1 -1
- package/dist/providers/crossref/client.d.ts +4 -1
- package/dist/providers/crossref/client.d.ts.map +1 -1
- package/dist/providers/crossref/client.js +11 -3
- package/dist/providers/crossref/client.js.map +1 -1
- package/dist/providers/crossref/diagnostics.d.ts +1 -1
- package/dist/providers/crossref/diagnostics.js +1 -1
- package/dist/providers/crossref/diagnostics.js.map +1 -1
- package/dist/providers/europepmc/adapter.js +2 -2
- package/dist/providers/europepmc/adapter.js.map +1 -1
- package/dist/providers/europepmc/client.d.ts +4 -1
- package/dist/providers/europepmc/client.d.ts.map +1 -1
- package/dist/providers/europepmc/client.js +11 -3
- package/dist/providers/europepmc/client.js.map +1 -1
- package/dist/providers/exa/client.d.ts +1 -0
- package/dist/providers/exa/client.d.ts.map +1 -1
- package/dist/providers/exa/client.js +3 -2
- package/dist/providers/exa/client.js.map +1 -1
- package/dist/providers/exa/credentials.d.ts +2 -0
- package/dist/providers/exa/credentials.d.ts.map +1 -1
- package/dist/providers/exa/credentials.js +2 -0
- package/dist/providers/exa/credentials.js.map +1 -1
- package/dist/providers/firecrawl/adapter.d.ts.map +1 -1
- package/dist/providers/firecrawl/adapter.js +2 -1
- package/dist/providers/firecrawl/adapter.js.map +1 -1
- package/dist/providers/firecrawl/client.d.ts +1 -0
- package/dist/providers/firecrawl/client.d.ts.map +1 -1
- package/dist/providers/firecrawl/client.js +3 -2
- package/dist/providers/firecrawl/client.js.map +1 -1
- package/dist/providers/firecrawl/credentials.d.ts +2 -0
- package/dist/providers/firecrawl/credentials.d.ts.map +1 -1
- package/dist/providers/firecrawl/credentials.js +2 -0
- package/dist/providers/firecrawl/credentials.js.map +1 -1
- package/dist/providers/firecrawl/quota.d.ts.map +1 -1
- package/dist/providers/firecrawl/quota.js +5 -2
- package/dist/providers/firecrawl/quota.js.map +1 -1
- package/dist/providers/jina/adapter.d.ts.map +1 -1
- package/dist/providers/jina/adapter.js +6 -4
- package/dist/providers/jina/adapter.js.map +1 -1
- package/dist/providers/jina/client.d.ts +2 -0
- package/dist/providers/jina/client.d.ts.map +1 -1
- package/dist/providers/jina/client.js +6 -5
- package/dist/providers/jina/client.js.map +1 -1
- package/dist/providers/jina/credentials.d.ts +2 -0
- package/dist/providers/jina/credentials.d.ts.map +1 -1
- package/dist/providers/jina/credentials.js +2 -0
- package/dist/providers/jina/credentials.js.map +1 -1
- package/dist/providers/kagi/adapter.d.ts +44 -0
- package/dist/providers/kagi/adapter.d.ts.map +1 -0
- package/dist/providers/kagi/adapter.js +188 -0
- package/dist/providers/kagi/adapter.js.map +1 -0
- package/dist/providers/kagi/client.d.ts +41 -0
- package/dist/providers/kagi/client.d.ts.map +1 -0
- package/dist/providers/kagi/client.js +100 -0
- package/dist/providers/kagi/client.js.map +1 -0
- package/dist/providers/kagi/credentials.d.ts +15 -0
- package/dist/providers/kagi/credentials.d.ts.map +1 -0
- package/dist/providers/kagi/credentials.js +35 -0
- package/dist/providers/kagi/credentials.js.map +1 -0
- package/dist/providers/kagi/diagnostics.d.ts +17 -0
- package/dist/providers/kagi/diagnostics.d.ts.map +1 -0
- package/dist/providers/kagi/diagnostics.js +33 -0
- package/dist/providers/kagi/diagnostics.js.map +1 -0
- package/dist/providers/linkup/client.d.ts +1 -0
- package/dist/providers/linkup/client.d.ts.map +1 -1
- package/dist/providers/linkup/client.js +3 -2
- package/dist/providers/linkup/client.js.map +1 -1
- package/dist/providers/linkup/credentials.d.ts +2 -0
- package/dist/providers/linkup/credentials.d.ts.map +1 -1
- package/dist/providers/linkup/credentials.js +2 -0
- package/dist/providers/linkup/credentials.js.map +1 -1
- package/dist/providers/minimax/adapter.d.ts.map +1 -1
- package/dist/providers/minimax/adapter.js +2 -2
- package/dist/providers/minimax/adapter.js.map +1 -1
- package/dist/providers/minimax/coding-plan-client.d.ts +1 -0
- package/dist/providers/minimax/coding-plan-client.d.ts.map +1 -1
- package/dist/providers/minimax/coding-plan-client.js +3 -2
- package/dist/providers/minimax/coding-plan-client.js.map +1 -1
- package/dist/providers/minimax/quota-client.d.ts +1 -0
- package/dist/providers/minimax/quota-client.d.ts.map +1 -1
- package/dist/providers/minimax/quota-client.js +3 -2
- package/dist/providers/minimax/quota-client.js.map +1 -1
- package/dist/providers/openalex/client.d.ts +2 -0
- package/dist/providers/openalex/client.d.ts.map +1 -1
- package/dist/providers/openalex/client.js +10 -3
- package/dist/providers/openalex/client.js.map +1 -1
- package/dist/providers/openalex/diagnostics.d.ts +1 -1
- package/dist/providers/openalex/diagnostics.js +1 -1
- package/dist/providers/openalex/diagnostics.js.map +1 -1
- package/dist/providers/parallel/client.d.ts +1 -0
- package/dist/providers/parallel/client.d.ts.map +1 -1
- package/dist/providers/parallel/client.js +3 -2
- package/dist/providers/parallel/client.js.map +1 -1
- package/dist/providers/parallel/credentials.d.ts +2 -0
- package/dist/providers/parallel/credentials.d.ts.map +1 -1
- package/dist/providers/parallel/credentials.js +2 -0
- package/dist/providers/parallel/credentials.js.map +1 -1
- package/dist/providers/perplexity/client.d.ts +2 -0
- package/dist/providers/perplexity/client.d.ts.map +1 -1
- package/dist/providers/perplexity/client.js +5 -4
- package/dist/providers/perplexity/client.js.map +1 -1
- package/dist/providers/perplexity/credentials.d.ts +2 -0
- package/dist/providers/perplexity/credentials.d.ts.map +1 -1
- package/dist/providers/perplexity/credentials.js +2 -0
- package/dist/providers/perplexity/credentials.js.map +1 -1
- package/dist/providers/pubmed/client.d.ts +2 -0
- package/dist/providers/pubmed/client.d.ts.map +1 -1
- package/dist/providers/pubmed/client.js +10 -3
- package/dist/providers/pubmed/client.js.map +1 -1
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +6 -0
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/searchapi/adapter.d.ts +54 -0
- package/dist/providers/searchapi/adapter.d.ts.map +1 -0
- package/dist/providers/searchapi/adapter.js +310 -0
- package/dist/providers/searchapi/adapter.js.map +1 -0
- package/dist/providers/searchapi/client.d.ts +73 -0
- package/dist/providers/searchapi/client.d.ts.map +1 -0
- package/dist/providers/searchapi/client.js +196 -0
- package/dist/providers/searchapi/client.js.map +1 -0
- package/dist/providers/searchapi/credentials.d.ts +46 -0
- package/dist/providers/searchapi/credentials.d.ts.map +1 -0
- package/dist/providers/searchapi/credentials.js +71 -0
- package/dist/providers/searchapi/credentials.js.map +1 -0
- package/dist/providers/searchapi/diagnostics.d.ts +48 -0
- package/dist/providers/searchapi/diagnostics.d.ts.map +1 -0
- package/dist/providers/searchapi/diagnostics.js +70 -0
- package/dist/providers/searchapi/diagnostics.js.map +1 -0
- package/dist/providers/searchapi/quota.d.ts +60 -0
- package/dist/providers/searchapi/quota.d.ts.map +1 -0
- package/dist/providers/searchapi/quota.js +125 -0
- package/dist/providers/searchapi/quota.js.map +1 -0
- package/dist/providers/spider/client.d.ts +2 -0
- package/dist/providers/spider/client.d.ts.map +1 -1
- package/dist/providers/spider/client.js +16 -6
- package/dist/providers/spider/client.js.map +1 -1
- package/dist/providers/spider/credentials.d.ts +2 -0
- package/dist/providers/spider/credentials.d.ts.map +1 -1
- package/dist/providers/spider/credentials.js +2 -0
- package/dist/providers/spider/credentials.js.map +1 -1
- package/dist/providers/tavily/client.d.ts +1 -0
- package/dist/providers/tavily/client.d.ts.map +1 -1
- package/dist/providers/tavily/client.js +3 -2
- package/dist/providers/tavily/client.js.map +1 -1
- package/dist/providers/tavily/credentials.d.ts +2 -0
- package/dist/providers/tavily/credentials.d.ts.map +1 -1
- package/dist/providers/tavily/credentials.js +2 -0
- package/dist/providers/tavily/credentials.js.map +1 -1
- package/dist/providers/types.d.ts +1 -1
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js +3 -0
- package/dist/providers/types.js.map +1 -1
- package/dist/providers/you/client.d.ts +4 -0
- package/dist/providers/you/client.d.ts.map +1 -1
- package/dist/providers/you/client.js +4 -5
- package/dist/providers/you/client.js.map +1 -1
- package/dist/providers/you/credentials.d.ts +2 -0
- package/dist/providers/you/credentials.d.ts.map +1 -1
- package/dist/providers/you/credentials.js +3 -3
- package/dist/providers/you/credentials.js.map +1 -1
- package/dist/providers/zai/adapter.d.ts.map +1 -1
- package/dist/providers/zai/adapter.js +2 -1
- package/dist/providers/zai/adapter.js.map +1 -1
- package/dist/providers/zai/credentials.d.ts +2 -0
- package/dist/providers/zai/credentials.d.ts.map +1 -1
- package/dist/providers/zai/credentials.js +2 -0
- package/dist/providers/zai/credentials.js.map +1 -1
- package/dist/providers/zai/monitor-client.d.ts +1 -0
- package/dist/providers/zai/monitor-client.d.ts.map +1 -1
- package/dist/providers/zai/monitor-client.js +3 -2
- package/dist/providers/zai/monitor-client.js.map +1 -1
- package/dist/providers/zai/quota.d.ts +4 -0
- package/dist/providers/zai/quota.d.ts.map +1 -1
- package/dist/providers/zai/quota.js +16 -1
- package/dist/providers/zai/quota.js.map +1 -1
- package/package.json +1 -1
- package/skills/scoutline/SKILL.md +93 -45
- package/skills/scoutline/references/advanced.md +12 -10
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SearchApi credential resolution.
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for the SearchApi.io API key
|
|
5
|
+
* (`SEARCHAPI_API_KEY`, with the legacy `SERPAPI_API_KEY` accepted as a
|
|
6
|
+
* lower-precedence fallback). Whitespace-only values are treated as
|
|
7
|
+
* absent, matching the descriptor's `isConfigured` contract. Resolved
|
|
8
|
+
* keys are returned trimmed so wire headers never carry stray
|
|
9
|
+
* whitespace.
|
|
10
|
+
*
|
|
11
|
+
* Boundary rules (ARCHITECTURE.md §2):
|
|
12
|
+
* - May import the normalized-error contract only.
|
|
13
|
+
* - Must NOT import transport, command presentation, or another
|
|
14
|
+
* Provider's Adapter.
|
|
15
|
+
*
|
|
16
|
+
* Missing credentials are surfaced as {@link ConfigurationError}
|
|
17
|
+
* (exit 3), distinct from {@link AuthError} (exit 1) which means the
|
|
18
|
+
* Provider REJECTED a presented credential.
|
|
19
|
+
*/
|
|
20
|
+
import crypto from "node:crypto";
|
|
21
|
+
import { ConfigurationError } from "../../lib/errors.js";
|
|
22
|
+
/** Credential environment names read by this module (#232 derivation pin). */
|
|
23
|
+
export const ENV_NAMES = ["SEARCHAPI_API_KEY", "SERPAPI_API_KEY"];
|
|
24
|
+
const MISSING_KEY_HELP = 'export SEARCHAPI_API_KEY="your-api-key"';
|
|
25
|
+
/**
|
|
26
|
+
* Pick a non-blank raw value from the environment and trim it. Returns
|
|
27
|
+
* `undefined` when the value is absent, non-string, or all whitespace.
|
|
28
|
+
*/
|
|
29
|
+
function pickNonBlank(raw) {
|
|
30
|
+
if (typeof raw !== "string")
|
|
31
|
+
return undefined;
|
|
32
|
+
const trimmed = raw.trim();
|
|
33
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Resolve the SearchApi API key without throwing. Returns the trimmed
|
|
37
|
+
* key or `undefined` when no non-blank value is present.
|
|
38
|
+
* `SEARCHAPI_API_KEY` wins over the legacy `SERPAPI_API_KEY`.
|
|
39
|
+
*/
|
|
40
|
+
export function getSearchApiKey(env) {
|
|
41
|
+
return pickNonBlank(env.SEARCHAPI_API_KEY) ?? pickNonBlank(env.SERPAPI_API_KEY);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Resolve the SearchApi API key or throw {@link ConfigurationError}
|
|
45
|
+
* (exit 3) when it is missing. Call this at every capability
|
|
46
|
+
* invocation gate.
|
|
47
|
+
*/
|
|
48
|
+
export function requireSearchApiKey(env) {
|
|
49
|
+
const key = getSearchApiKey(env);
|
|
50
|
+
if (key === undefined) {
|
|
51
|
+
throw new ConfigurationError("SEARCHAPI_API_KEY environment variable is required", MISSING_KEY_HELP);
|
|
52
|
+
}
|
|
53
|
+
return key;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* True when a non-blank SearchApi API key is configured. Metadata-only:
|
|
57
|
+
* performs no transport construction and reads no other Provider's
|
|
58
|
+
* credentials.
|
|
59
|
+
*/
|
|
60
|
+
export function isSearchApiConfigured(env) {
|
|
61
|
+
return getSearchApiKey(env) !== undefined;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Lowercase hex SHA-256 fingerprint of the SearchApi API key. Used for
|
|
65
|
+
* partitioned cache identity; the raw key must never appear in cache
|
|
66
|
+
* filenames, errors, or logs.
|
|
67
|
+
*/
|
|
68
|
+
export function hashSearchApiKey(key) {
|
|
69
|
+
return crypto.createHash("sha256").update(key).digest("hex");
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/providers/searchapi/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,mBAAmB,EAAE,iBAAiB,CAAU,CAAC;AAE3E,MAAM,gBAAgB,GAAG,yCAAyC,CAAC;AAEnE;;;GAGG;AACH,SAAS,YAAY,CAAC,GAAY;IAChC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,GAAsB;IACpD,OAAO,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAClF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAsB;IACxD,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,kBAAkB,CAC1B,oDAAoD,EACpD,gBAAgB,CACjB,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAsB;IAC1D,OAAO,eAAe,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SearchApi.io Diagnostics Capability.
|
|
3
|
+
*
|
|
4
|
+
* Probes SearchApi connectivity with a single, non-destructive GET
|
|
5
|
+
* against `/api/v1/me` — the account/subscription metadata endpoint,
|
|
6
|
+
* NOT a search, so the probe costs no search credit. The doctor command
|
|
7
|
+
* can therefore verify a credential authenticates without consuming a
|
|
8
|
+
* paid request. SearchApi has no `search_depth`-style knob, so no probe
|
|
9
|
+
* params are sent.
|
|
10
|
+
*
|
|
11
|
+
* The probe performs exactly ONE attempt. Shared execution owns the
|
|
12
|
+
* retry policy; this transport never retries. The doctor command
|
|
13
|
+
* catches the throw on failure and records a redacted error entry.
|
|
14
|
+
*
|
|
15
|
+
* When `options.probe` is false, `invoke` resolves immediately without
|
|
16
|
+
* touching the network — the doctor command skips probing unconfigured
|
|
17
|
+
* Providers (passing `probe: false`) before reaching this Capability.
|
|
18
|
+
*
|
|
19
|
+
* Boundary rules (ARCHITECTURE.md §2):
|
|
20
|
+
* - May import the diagnostics capability contract, Adapter-local
|
|
21
|
+
* credentials, Adapter-local quota transport, and normalized errors.
|
|
22
|
+
* - Must NOT import command presentation or another Provider's Adapter.
|
|
23
|
+
*/
|
|
24
|
+
import type { DiagnosticsCapability } from "../../capabilities/diagnostics.js";
|
|
25
|
+
import { type SearchApiTransportDeps } from "./client.js";
|
|
26
|
+
/**
|
|
27
|
+
* Options for the SearchApi.io DiagnosticsCapability. The API key is
|
|
28
|
+
* resolved from `env`; transport dependencies (`fetch`, timers) are
|
|
29
|
+
* injectable for deterministic tests through the unified `transport`
|
|
30
|
+
* seam.
|
|
31
|
+
*/
|
|
32
|
+
export interface SearchApiDiagnosticsCapabilityOptions {
|
|
33
|
+
readonly env: NodeJS.ProcessEnv;
|
|
34
|
+
readonly transport?: SearchApiTransportDeps;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Build the SearchApi.io DiagnosticsCapability. The probe performs ONE
|
|
38
|
+
* non-destructive `/api/v1/me` request — the cheapest credible probe
|
|
39
|
+
* (it authenticates the Bearer header without spending a search
|
|
40
|
+
* credit). Shared execution owns the retry policy; this transport
|
|
41
|
+
* performs exactly one attempt per invocation.
|
|
42
|
+
*
|
|
43
|
+
* When `options.probe` is false, `invoke` resolves immediately without
|
|
44
|
+
* touching the network — the doctor command skips probing unconfigured
|
|
45
|
+
* Providers before reaching this Capability.
|
|
46
|
+
*/
|
|
47
|
+
export declare function createSearchApiDiagnosticsCapability(options: SearchApiDiagnosticsCapabilityOptions): DiagnosticsCapability;
|
|
48
|
+
//# sourceMappingURL=diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../src/providers/searchapi/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAqB,MAAM,mCAAmC,CAAC;AAGlG,OAAO,EAAoB,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAuB5E;;;;;GAKG;AACH,MAAM,WAAW,qCAAqC;IACpD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,sBAAsB,CAAC;CAC7C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,qCAAqC,GAC7C,qBAAqB,CAcvB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SearchApi.io Diagnostics Capability.
|
|
3
|
+
*
|
|
4
|
+
* Probes SearchApi connectivity with a single, non-destructive GET
|
|
5
|
+
* against `/api/v1/me` — the account/subscription metadata endpoint,
|
|
6
|
+
* NOT a search, so the probe costs no search credit. The doctor command
|
|
7
|
+
* can therefore verify a credential authenticates without consuming a
|
|
8
|
+
* paid request. SearchApi has no `search_depth`-style knob, so no probe
|
|
9
|
+
* params are sent.
|
|
10
|
+
*
|
|
11
|
+
* The probe performs exactly ONE attempt. Shared execution owns the
|
|
12
|
+
* retry policy; this transport never retries. The doctor command
|
|
13
|
+
* catches the throw on failure and records a redacted error entry.
|
|
14
|
+
*
|
|
15
|
+
* When `options.probe` is false, `invoke` resolves immediately without
|
|
16
|
+
* touching the network — the doctor command skips probing unconfigured
|
|
17
|
+
* Providers (passing `probe: false`) before reaching this Capability.
|
|
18
|
+
*
|
|
19
|
+
* Boundary rules (ARCHITECTURE.md §2):
|
|
20
|
+
* - May import the diagnostics capability contract, Adapter-local
|
|
21
|
+
* credentials, Adapter-local quota transport, and normalized errors.
|
|
22
|
+
* - Must NOT import command presentation or another Provider's Adapter.
|
|
23
|
+
*/
|
|
24
|
+
import { createProbeErrorNormalizer, STANDARD_PROBE_PASS_THROUGH } from "../../lib/probe-errors.js";
|
|
25
|
+
import { requireSearchApiKey } from "./credentials.js";
|
|
26
|
+
import { fetchSearchApiMe } from "./client.js";
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Failure normalization (mirror the Adapter's search-path mapping)
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
/**
|
|
31
|
+
* Probe failure wrapper. Mirrors the Adapter's `normalizeSearchApiError`
|
|
32
|
+
* for the subset of errors the probe can surface. The probe throws on
|
|
33
|
+
* failure; the doctor command catches the throw and records a redacted
|
|
34
|
+
* error entry. The SearchApi transport already drains/discards response
|
|
35
|
+
* bodies, and these typed errors carry only curated messages, so no raw
|
|
36
|
+
* SearchApi body ever crosses this boundary.
|
|
37
|
+
*/
|
|
38
|
+
const normalizeProbeError = createProbeErrorNormalizer({
|
|
39
|
+
passThrough: STANDARD_PROBE_PASS_THROUGH,
|
|
40
|
+
fallbackMessage: "SearchApi.io diagnostics probe failed",
|
|
41
|
+
});
|
|
42
|
+
/**
|
|
43
|
+
* Build the SearchApi.io DiagnosticsCapability. The probe performs ONE
|
|
44
|
+
* non-destructive `/api/v1/me` request — the cheapest credible probe
|
|
45
|
+
* (it authenticates the Bearer header without spending a search
|
|
46
|
+
* credit). Shared execution owns the retry policy; this transport
|
|
47
|
+
* performs exactly one attempt per invocation.
|
|
48
|
+
*
|
|
49
|
+
* When `options.probe` is false, `invoke` resolves immediately without
|
|
50
|
+
* touching the network — the doctor command skips probing unconfigured
|
|
51
|
+
* Providers before reaching this Capability.
|
|
52
|
+
*/
|
|
53
|
+
export function createSearchApiDiagnosticsCapability(options) {
|
|
54
|
+
const { env, transport } = options;
|
|
55
|
+
return {
|
|
56
|
+
async invoke(diagOptions) {
|
|
57
|
+
if (!diagOptions.probe)
|
|
58
|
+
return;
|
|
59
|
+
const apiKey = requireSearchApiKey(env);
|
|
60
|
+
try {
|
|
61
|
+
// One non-destructive /me GET, no params — costs no search credit.
|
|
62
|
+
await fetchSearchApiMe(apiKey, transport);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
throw normalizeProbeError(error);
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../src/providers/searchapi/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAA+B,MAAM,aAAa,CAAC;AAE5E,8EAA8E;AAC9E,mEAAmE;AACnE,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,mBAAmB,GAAG,0BAA0B,CAAC;IACrD,WAAW,EAAE,2BAA2B;IACxC,eAAe,EAAE,uCAAuC;CACzD,CAAC,CAAC;AAiBH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oCAAoC,CAClD,OAA8C;IAE9C,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACnC,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,WAA8B;YACzC,IAAI,CAAC,WAAW,CAAC,KAAK;gBAAE,OAAO;YAC/B,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,CAAC;gBACH,mEAAmE;gBACnE,MAAM,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SearchApi.io Quota Capability.
|
|
3
|
+
*
|
|
4
|
+
* Maps the SearchApi.io `GET /api/v1/me` response into the normalized
|
|
5
|
+
* Provider-quota interface. SearchApi is credit-based: `account`
|
|
6
|
+
* carries the current-month usage, the monthly allowance, and the
|
|
7
|
+
* remaining credits. The single "searches" category (unit `"credits"`)
|
|
8
|
+
* is built from `used = current_month_usage` and
|
|
9
|
+
* `limit = monthly_allowance`, with `resetsAt` derived from
|
|
10
|
+
* `subscription.period_end` when it parses. `remaining_credits` is
|
|
11
|
+
* required by the wire contract but is not re-published verbatim —
|
|
12
|
+
* `buildQuotaWindow` derives the honest `remaining` from the counts.
|
|
13
|
+
*
|
|
14
|
+
* Structurally cloned from the Linkup quota pattern (non-destructive
|
|
15
|
+
* GET, IMPLEMENTATION-CONTRACT analog-adapter table): one direct GET
|
|
16
|
+
* per invoke, shared execution owns retry policy, quota never uses the
|
|
17
|
+
* response cache.
|
|
18
|
+
*
|
|
19
|
+
* Boundary rules (ARCHITECTURE.md §2):
|
|
20
|
+
* - May import the quota capability contract, Adapter-local
|
|
21
|
+
* credentials, Adapter-local quota transport, and normalized
|
|
22
|
+
* errors.
|
|
23
|
+
* - Must NOT import command presentation or another Provider's
|
|
24
|
+
* Adapter.
|
|
25
|
+
*/
|
|
26
|
+
import type { ProviderQuotaSuccess, QuotaCapability } from "../../capabilities/quota.js";
|
|
27
|
+
import { type SearchApiTransportDeps } from "./client.js";
|
|
28
|
+
/**
|
|
29
|
+
* Normalize a raw SearchApi.io `/api/v1/me` payload into the shared
|
|
30
|
+
* quota interface.
|
|
31
|
+
*
|
|
32
|
+
* The `account` object must carry finite `current_month_usage`,
|
|
33
|
+
* `monthly_allowance`, and `remaining_credits`; a missing/non-object
|
|
34
|
+
* root or account, or any non-finite count, is a malformed response and
|
|
35
|
+
* throws `ApiError` 500. On success a single `"searches"` category
|
|
36
|
+
* (`unit: "credits"`) is built through
|
|
37
|
+
* `buildQuotaWindow({ used, limit, resetsAtEpochMs })`, where
|
|
38
|
+
* `resetsAtEpochMs` is `parseZonedInstant(subscription.period_end)` when
|
|
39
|
+
* that parses (a zone-less form is anchored to UTC) and is omitted
|
|
40
|
+
* otherwise.
|
|
41
|
+
*/
|
|
42
|
+
export declare function normalizeSearchApiQuota(raw: unknown): ProviderQuotaSuccess;
|
|
43
|
+
/**
|
|
44
|
+
* Options for the SearchApi.io QuotaCapability. The API key is resolved
|
|
45
|
+
* from `env`; transport dependencies (`fetch`, timers) are injectable
|
|
46
|
+
* for deterministic tests through the unified `transport` seam.
|
|
47
|
+
*/
|
|
48
|
+
export interface SearchApiQuotaCapabilityOptions {
|
|
49
|
+
readonly env: NodeJS.ProcessEnv;
|
|
50
|
+
readonly transport?: SearchApiTransportDeps;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Build the SearchApi.io QuotaCapability. `invoke` resolves the API key,
|
|
54
|
+
* performs one non-destructive GET against `/api/v1/me` (not a search —
|
|
55
|
+
* costs no credit), and normalizes the account counts into the shared
|
|
56
|
+
* interface. Shared execution wraps this in the retry policy; quota
|
|
57
|
+
* never uses the response cache.
|
|
58
|
+
*/
|
|
59
|
+
export declare function createSearchApiQuotaCapability(options: SearchApiQuotaCapabilityOptions): QuotaCapability;
|
|
60
|
+
//# sourceMappingURL=quota.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota.d.ts","sourceRoot":"","sources":["../../../src/providers/searchapi/quota.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EACV,oBAAoB,EACpB,eAAe,EAEhB,MAAM,6BAA6B,CAAC;AAKrC,OAAO,EAAoB,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAgB5E;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,oBAAoB,CAmC1E;AAoBD;;;;GAIG;AACH,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,sBAAsB,CAAC;CAC7C;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,+BAA+B,GACvC,eAAe,CAajB"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SearchApi.io Quota Capability.
|
|
3
|
+
*
|
|
4
|
+
* Maps the SearchApi.io `GET /api/v1/me` response into the normalized
|
|
5
|
+
* Provider-quota interface. SearchApi is credit-based: `account`
|
|
6
|
+
* carries the current-month usage, the monthly allowance, and the
|
|
7
|
+
* remaining credits. The single "searches" category (unit `"credits"`)
|
|
8
|
+
* is built from `used = current_month_usage` and
|
|
9
|
+
* `limit = monthly_allowance`, with `resetsAt` derived from
|
|
10
|
+
* `subscription.period_end` when it parses. `remaining_credits` is
|
|
11
|
+
* required by the wire contract but is not re-published verbatim —
|
|
12
|
+
* `buildQuotaWindow` derives the honest `remaining` from the counts.
|
|
13
|
+
*
|
|
14
|
+
* Structurally cloned from the Linkup quota pattern (non-destructive
|
|
15
|
+
* GET, IMPLEMENTATION-CONTRACT analog-adapter table): one direct GET
|
|
16
|
+
* per invoke, shared execution owns retry policy, quota never uses the
|
|
17
|
+
* response cache.
|
|
18
|
+
*
|
|
19
|
+
* Boundary rules (ARCHITECTURE.md §2):
|
|
20
|
+
* - May import the quota capability contract, Adapter-local
|
|
21
|
+
* credentials, Adapter-local quota transport, and normalized
|
|
22
|
+
* errors.
|
|
23
|
+
* - Must NOT import command presentation or another Provider's
|
|
24
|
+
* Adapter.
|
|
25
|
+
*/
|
|
26
|
+
import { buildQuotaWindow } from "../../capabilities/quota.js";
|
|
27
|
+
import { ApiError, ScoutlineError } from "../../lib/errors.js";
|
|
28
|
+
import { parseZonedInstant } from "../../lib/parse-zoned-instant.js";
|
|
29
|
+
import { requireSearchApiKey } from "./credentials.js";
|
|
30
|
+
import { fetchSearchApiMe } from "./client.js";
|
|
31
|
+
function isPlainObject(value) {
|
|
32
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
33
|
+
}
|
|
34
|
+
/** Read a finite NONNEGATIVE number, or `undefined` for anything else. */
|
|
35
|
+
function readFiniteNumber(value) {
|
|
36
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : undefined;
|
|
37
|
+
}
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Normalizer
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
/**
|
|
42
|
+
* Normalize a raw SearchApi.io `/api/v1/me` payload into the shared
|
|
43
|
+
* quota interface.
|
|
44
|
+
*
|
|
45
|
+
* The `account` object must carry finite `current_month_usage`,
|
|
46
|
+
* `monthly_allowance`, and `remaining_credits`; a missing/non-object
|
|
47
|
+
* root or account, or any non-finite count, is a malformed response and
|
|
48
|
+
* throws `ApiError` 500. On success a single `"searches"` category
|
|
49
|
+
* (`unit: "credits"`) is built through
|
|
50
|
+
* `buildQuotaWindow({ used, limit, resetsAtEpochMs })`, where
|
|
51
|
+
* `resetsAtEpochMs` is `parseZonedInstant(subscription.period_end)` when
|
|
52
|
+
* that parses (a zone-less form is anchored to UTC) and is omitted
|
|
53
|
+
* otherwise.
|
|
54
|
+
*/
|
|
55
|
+
export function normalizeSearchApiQuota(raw) {
|
|
56
|
+
if (!isPlainObject(raw)) {
|
|
57
|
+
throw new ApiError("SearchApi.io quota returned a malformed response", 500);
|
|
58
|
+
}
|
|
59
|
+
const account = raw.account;
|
|
60
|
+
if (!isPlainObject(account)) {
|
|
61
|
+
throw new ApiError("SearchApi.io quota returned a malformed response", 500);
|
|
62
|
+
}
|
|
63
|
+
const used = readFiniteNumber(account.current_month_usage);
|
|
64
|
+
const limit = readFiniteNumber(account.monthly_allowance);
|
|
65
|
+
const remainingCredits = readFiniteNumber(account.remaining_credits);
|
|
66
|
+
if (used === undefined || limit === undefined || remainingCredits === undefined) {
|
|
67
|
+
throw new ApiError("SearchApi.io quota returned a malformed response", 500);
|
|
68
|
+
}
|
|
69
|
+
const subscription = isPlainObject(raw.subscription) ? raw.subscription : undefined;
|
|
70
|
+
const periodEnd = subscription ? subscription.period_end : undefined;
|
|
71
|
+
const resetsAtEpochMs = typeof periodEnd === "string" ? parseZonedInstant(periodEnd) : NaN;
|
|
72
|
+
const inputs = { used, limit };
|
|
73
|
+
if (Number.isFinite(resetsAtEpochMs)) {
|
|
74
|
+
inputs.resetsAtEpochMs = resetsAtEpochMs;
|
|
75
|
+
}
|
|
76
|
+
const category = {
|
|
77
|
+
name: "searches",
|
|
78
|
+
unit: "credits",
|
|
79
|
+
current: buildQuotaWindow(inputs),
|
|
80
|
+
};
|
|
81
|
+
return {
|
|
82
|
+
provider: "searchapi",
|
|
83
|
+
status: "ok",
|
|
84
|
+
categories: [category],
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
// Capability factory
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
/**
|
|
91
|
+
* Map a thrown error into a normalized SearchApi.io quota error. Every
|
|
92
|
+
* typed transport error (ConfigurationError, QuotaError, ApiError,
|
|
93
|
+
* TimeoutError, NetworkError) extends {@link ScoutlineError}, so the
|
|
94
|
+
* single guard passes them through verbatim; anything else is wrapped
|
|
95
|
+
* as a generic `ApiError`.
|
|
96
|
+
*/
|
|
97
|
+
function normalizeSearchApiQuotaError(error) {
|
|
98
|
+
if (error instanceof ScoutlineError) {
|
|
99
|
+
return error;
|
|
100
|
+
}
|
|
101
|
+
return new ApiError("SearchApi.io quota request failed", 500);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Build the SearchApi.io QuotaCapability. `invoke` resolves the API key,
|
|
105
|
+
* performs one non-destructive GET against `/api/v1/me` (not a search —
|
|
106
|
+
* costs no credit), and normalizes the account counts into the shared
|
|
107
|
+
* interface. Shared execution wraps this in the retry policy; quota
|
|
108
|
+
* never uses the response cache.
|
|
109
|
+
*/
|
|
110
|
+
export function createSearchApiQuotaCapability(options) {
|
|
111
|
+
const { env, transport } = options;
|
|
112
|
+
return {
|
|
113
|
+
async invoke() {
|
|
114
|
+
const apiKey = requireSearchApiKey(env);
|
|
115
|
+
try {
|
|
116
|
+
const raw = await fetchSearchApiMe(apiKey, transport);
|
|
117
|
+
return normalizeSearchApiQuota(raw);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
throw normalizeSearchApiQuotaError(error);
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=quota.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota.js","sourceRoot":"","sources":["../../../src/providers/searchapi/quota.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,8 @@ export interface SpiderSearchParams {
|
|
|
28
28
|
/** Domain allowlist mapped from `controls.domain`. */
|
|
29
29
|
readonly whitelist?: readonly string[];
|
|
30
30
|
}
|
|
31
|
+
/** `SPIDER_TIMEOUT` override, clamped through the shared seam (#234). */
|
|
32
|
+
export declare function resolveTimeoutMs(env: NodeJS.ProcessEnv): number;
|
|
31
33
|
/**
|
|
32
34
|
* Perform ONE POST against the Spider.cloud /search endpoint. No retry;
|
|
33
35
|
* no response body in public errors. Returns the parsed JSON value (raw;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/providers/spider/client.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/providers/spider/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
import pkg from "../../../package.json" with { type: "json" };
|
|
25
25
|
import { ApiError, AuthError, NetworkError, TimeoutError } from "../../lib/errors.js";
|
|
26
26
|
import { getGlobalFetch } from "../types.js";
|
|
27
|
+
import { clampTimeoutMs } from "../../lib/timeout.js";
|
|
27
28
|
const { version: VERSION } = pkg;
|
|
28
29
|
const BASE_URL = "https://api.spider.cloud";
|
|
29
30
|
const SEARCH_PATH = "/search";
|
|
@@ -33,6 +34,11 @@ const LINKS_PATH = "/links";
|
|
|
33
34
|
const CREDITS_PATH = "/data/credits";
|
|
34
35
|
const DEFAULT_TIMEOUT_MS = 30000;
|
|
35
36
|
const USER_AGENT = `scoutline/${VERSION}`;
|
|
37
|
+
/** `SPIDER_TIMEOUT` override, clamped through the shared seam (#234). */
|
|
38
|
+
export function resolveTimeoutMs(env) {
|
|
39
|
+
const raw = parseInt(env.SPIDER_TIMEOUT || String(DEFAULT_TIMEOUT_MS), 10);
|
|
40
|
+
return clampTimeoutMs(raw, DEFAULT_TIMEOUT_MS);
|
|
41
|
+
}
|
|
36
42
|
/**
|
|
37
43
|
* Layer 1 — HTTP-status mapping. Runs BEFORE the body is parsed; on a
|
|
38
44
|
* non-2xx response we discard the body and throw a typed error.
|
|
@@ -81,9 +87,11 @@ async function postSpiderJson(apiKey, path, body, deps, endpointLabel, signal) {
|
|
|
81
87
|
const f = deps.fetch ?? getGlobalFetch();
|
|
82
88
|
const setT = deps.setTimeout ?? setTimeout;
|
|
83
89
|
const clearT = deps.clearTimeout ?? clearTimeout;
|
|
90
|
+
const env = deps.env ?? process.env;
|
|
91
|
+
const timeoutMs = resolveTimeoutMs(env);
|
|
84
92
|
const url = `${BASE_URL}${path}`;
|
|
85
93
|
const controller = new AbortController();
|
|
86
|
-
const timeoutId = setT(() => controller.abort(),
|
|
94
|
+
const timeoutId = setT(() => controller.abort(), timeoutMs);
|
|
87
95
|
const abortWithExternal = () => controller.abort();
|
|
88
96
|
if (signal !== undefined) {
|
|
89
97
|
if (signal.aborted) {
|
|
@@ -106,7 +114,7 @@ async function postSpiderJson(apiKey, path, body, deps, endpointLabel, signal) {
|
|
|
106
114
|
});
|
|
107
115
|
if (!res.ok) {
|
|
108
116
|
await res.text().catch(() => { });
|
|
109
|
-
throw mapStatusError(res.status,
|
|
117
|
+
throw mapStatusError(res.status, timeoutMs);
|
|
110
118
|
}
|
|
111
119
|
try {
|
|
112
120
|
return await res.json();
|
|
@@ -121,7 +129,7 @@ async function postSpiderJson(apiKey, path, body, deps, endpointLabel, signal) {
|
|
|
121
129
|
}
|
|
122
130
|
}
|
|
123
131
|
catch (err) {
|
|
124
|
-
throw normalizeTransportError(err,
|
|
132
|
+
throw normalizeTransportError(err, timeoutMs);
|
|
125
133
|
}
|
|
126
134
|
finally {
|
|
127
135
|
if (signal !== undefined) {
|
|
@@ -217,9 +225,11 @@ async function getSpiderJson(apiKey, path, deps, endpointLabel) {
|
|
|
217
225
|
const f = deps.fetch ?? getGlobalFetch();
|
|
218
226
|
const setT = deps.setTimeout ?? setTimeout;
|
|
219
227
|
const clearT = deps.clearTimeout ?? clearTimeout;
|
|
228
|
+
const env = deps.env ?? process.env;
|
|
229
|
+
const timeoutMs = resolveTimeoutMs(env);
|
|
220
230
|
const url = `${BASE_URL}${path}`;
|
|
221
231
|
const controller = new AbortController();
|
|
222
|
-
const timeoutId = setT(() => controller.abort(),
|
|
232
|
+
const timeoutId = setT(() => controller.abort(), timeoutMs);
|
|
223
233
|
try {
|
|
224
234
|
const res = await f(url, {
|
|
225
235
|
method: "GET",
|
|
@@ -231,7 +241,7 @@ async function getSpiderJson(apiKey, path, deps, endpointLabel) {
|
|
|
231
241
|
});
|
|
232
242
|
if (!res.ok) {
|
|
233
243
|
await res.text().catch(() => { });
|
|
234
|
-
throw mapStatusError(res.status,
|
|
244
|
+
throw mapStatusError(res.status, timeoutMs);
|
|
235
245
|
}
|
|
236
246
|
try {
|
|
237
247
|
return await res.json();
|
|
@@ -246,7 +256,7 @@ async function getSpiderJson(apiKey, path, deps, endpointLabel) {
|
|
|
246
256
|
}
|
|
247
257
|
}
|
|
248
258
|
catch (err) {
|
|
249
|
-
throw normalizeTransportError(err,
|
|
259
|
+
throw normalizeTransportError(err, timeoutMs);
|
|
250
260
|
}
|
|
251
261
|
finally {
|
|
252
262
|
clearT(timeoutId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/providers/spider/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,GAAG,MAAM,uBAAuB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEtF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/providers/spider/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,8 @@
|
|
|
17
17
|
* (exit 3), distinct from {@link AuthError} (exit 1) which means the
|
|
18
18
|
* Provider REJECTED a presented credential.
|
|
19
19
|
*/
|
|
20
|
+
/** Credential environment names read by this module (#232 derivation pin). */
|
|
21
|
+
export declare const ENV_NAMES: readonly ["SPIDER_API_KEY"];
|
|
20
22
|
/**
|
|
21
23
|
* Resolve the Spider.cloud API key without throwing. Returns the
|
|
22
24
|
* trimmed key, or `undefined` when no non-blank value is present.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/providers/spider/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/providers/spider/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,8EAA8E;AAC9E,eAAO,MAAM,SAAS,YAAI,gBAAgB,CAAU,CAAC;AAerD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,GAAG,SAAS,CAE1E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CASlE"}
|
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
* Provider REJECTED a presented credential.
|
|
19
19
|
*/
|
|
20
20
|
import { ConfigurationError } from "../../lib/errors.js";
|
|
21
|
+
/** Credential environment names read by this module (#232 derivation pin). */
|
|
22
|
+
export const ENV_NAMES = ["SPIDER_API_KEY"];
|
|
21
23
|
const MISSING_KEY_HELP = 'export SPIDER_API_KEY="your-api-key"';
|
|
22
24
|
/**
|
|
23
25
|
* Pick a non-blank value from the environment. Returns the trimmed
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/providers/spider/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,gBAAgB,GAAG,sCAAsC,CAAC;AAEhE;;;;GAIG;AACH,SAAS,YAAY,CAAC,GAAY;IAChC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAsB;IACpD,OAAO,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAsB;IACxD,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,kBAAkB,CAC1B,iDAAiD,EACjD,gBAAgB,CACjB,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../../src/providers/spider/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,gBAAgB,CAAU,CAAC;AAErD,MAAM,gBAAgB,GAAG,sCAAsC,CAAC;AAEhE;;;;GAIG;AACH,SAAS,YAAY,CAAC,GAAY;IAChC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAsB;IACpD,OAAO,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAsB;IACxD,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,kBAAkB,CAC1B,iDAAiD,EACjD,gBAAgB,CACjB,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -133,6 +133,7 @@ export interface TavilyResearchPollSource {
|
|
|
133
133
|
readonly title?: string;
|
|
134
134
|
readonly url?: string;
|
|
135
135
|
}
|
|
136
|
+
export declare function resolveTimeoutMs(env: NodeJS.ProcessEnv): number;
|
|
136
137
|
/**
|
|
137
138
|
* Perform ONE POST against the Tavily /search endpoint. No retry; no
|
|
138
139
|
* response body in public errors. Returns the parsed JSON body (raw;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/providers/tavily/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/providers/tavily/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAMH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAiBtD,8DAA8D;AAC9D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,kBAAkB,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,UAAU,CAAC;IACxC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,YAAY,CAAC;IAC5C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAClC;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IACtC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IAClF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,wBAAwB,EAAE,CAAC;CACxD;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAG/D;AAwJD;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,kBAAkB,EAC3B,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,OAAO,CAAC,CAiBlB;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,mBAAmB,EAC5B,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,OAAO,CAAC,CAoBlB;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,iBAAiB,EAC1B,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,OAAO,CAAC,CA2ClB;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,eAAe,EACxB,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,OAAO,CAAC,CAiClB;AA6DD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,OAAO,CAAC,CAElB;AAaD;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,OAAO,CAAC,EAC5C,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,0BAA0B,CAAC,CAmBrC;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,wBAAwB,CAAC,CA6CnC"}
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
*/
|
|
26
26
|
import pkg from "../../../package.json" with { type: "json" };
|
|
27
27
|
import { ApiError, AuthError, NetworkError, TimeoutError } from "../../lib/errors.js";
|
|
28
|
+
import { clampTimeoutMs } from "../../lib/timeout.js";
|
|
28
29
|
import { getGlobalFetch } from "../types.js";
|
|
29
30
|
const { version: VERSION } = pkg;
|
|
30
31
|
const BASE_URL = "https://api.tavily.com";
|
|
@@ -37,9 +38,9 @@ const USAGE_PATH = "/usage";
|
|
|
37
38
|
const DEFAULT_TIMEOUT_MS = 30000;
|
|
38
39
|
const USER_AGENT = `scoutline/${VERSION}`;
|
|
39
40
|
const TIMEOUT_HELP_TEXT = "Try again or increase timeout with TAVILY_TIMEOUT env var";
|
|
40
|
-
function resolveTimeoutMs(env) {
|
|
41
|
+
export function resolveTimeoutMs(env) {
|
|
41
42
|
const raw = parseInt(env.TAVILY_TIMEOUT || String(DEFAULT_TIMEOUT_MS), 10);
|
|
42
|
-
return
|
|
43
|
+
return clampTimeoutMs(raw, DEFAULT_TIMEOUT_MS);
|
|
43
44
|
}
|
|
44
45
|
/**
|
|
45
46
|
* Layer 1 — HTTP-status mapping. Runs BEFORE the body is parsed; on a
|