webfox 4.4.1 → 4.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -42,7 +42,7 @@ configuration in your terminal, TypeScript applications, and pi.
42
42
  nix run github:mavam/webfox -- --help
43
43
  ```
44
44
 
45
- The flake exports `packages.<system>.default` and `overlays.default` for Linux
45
+ The flake exports `packages.<system>.default` for Linux
46
46
  (`aarch64`, `x86_64`) and macOS (Apple Silicon).
47
47
  - **TypeScript:** Add `webfox` as an application dependency.
48
48
  - **Pi:** Install the extension:
@@ -2,7 +2,7 @@ import {
2
2
  SERPBASE_MODES,
3
3
  serpbaseProvider,
4
4
  validateOptions
5
- } from "./chunk-VYMIR35R.js";
5
+ } from "./chunk-KH54YH7D.js";
6
6
  import "./chunk-GPACLYNT.js";
7
7
  import {
8
8
  trimSnippet
@@ -6,14 +6,14 @@ import {
6
6
  } from "./chunk-WCTOYZVB.js";
7
7
  import {
8
8
  configurationSchema
9
- } from "./chunk-HFTQQEQC.js";
9
+ } from "./chunk-VI3473TU.js";
10
10
  import {
11
11
  effectiveOptions,
12
12
  optionSchema,
13
13
  providers,
14
14
  selectProvider,
15
15
  validateConfiguredOptions
16
- } from "./chunk-VYMIR35R.js";
16
+ } from "./chunk-KH54YH7D.js";
17
17
  import {
18
18
  cancelProcessGroup,
19
19
  killProcessGroup
@@ -637,6 +637,11 @@ var customProvider = defineProvider({
637
637
  });
638
638
 
639
639
  // src/providers/exa/definition.ts
640
+ var snapshotAsOf = {
641
+ type: "string",
642
+ minLength: 1,
643
+ description: "ISO datetime cutoff, such as '2026-07-01T00:00:00Z'. Return the newest stored page version at or before this instant; pages without an eligible version are omitted. Do not combine with maxAgeHours, livecrawlTimeout, or subpages."
644
+ };
640
645
  var exaProvider = defineProvider({
641
646
  id: "exa",
642
647
  label: "Exa",
@@ -844,6 +849,7 @@ var exaProvider = defineProvider({
844
849
  ],
845
850
  description: "Include AI-generated summary."
846
851
  },
852
+ snapshotAsOf,
847
853
  livecrawlTimeout: {
848
854
  type: "integer",
849
855
  minimum: 1,
@@ -897,7 +903,7 @@ var exaProvider = defineProvider({
897
903
  }
898
904
  },
899
905
  additionalProperties: false,
900
- description: "Content extraction and freshness controls. Put text, highlights, summary, maxAgeHours, and livecrawlTimeout here, not directly in options."
906
+ description: "Content extraction, freshness, and historical snapshot controls. Put text, highlights, summary, snapshotAsOf, maxAgeHours, and livecrawlTimeout here, not directly in options."
901
907
  }
902
908
  },
903
909
  description: "Exa search options."
@@ -908,12 +914,27 @@ var exaProvider = defineProvider({
908
914
  "Set includeDomains or excludeDomains when the task names preferred sources, requires primary sources, or needs noisy domains filtered out.",
909
915
  "For fresh Exa search content, use options.contents.maxAgeHours=0; for cache-only retrieval use -1. Never put maxAgeHours at the top level of options.",
910
916
  "Do not send deprecated livecrawl, even alongside maxAgeHours. Remove livecrawl rather than moving it into contents. Exa ignores startCrawlDate/endCrawlDate; use startPublishedDate/endPublishedDate to filter publication dates, not cache freshness.",
917
+ "For historical page versions, set options.contents.snapshotAsOf to an ISO datetime. Use type auto, fast, or instant; omit category, maxAgeHours, livecrawl, livecrawlTimeout, and subpages. Snapshot bounds content, not ranking: Exa still discovers URLs using current retrieval signals. Snapshot is a research preview with limited access and lookback.",
911
918
  "Use includeText/excludeText for short required or forbidden phrases in page text.",
912
919
  "Request contents.text, contents.highlights, or contents.summary only when snippets are insufficient and richer source context is needed directly in search results."
913
920
  ],
914
921
  retrySafe: true
915
922
  },
916
923
  contents: {
924
+ options: {
925
+ type: "object",
926
+ properties: {
927
+ snapshotAsOf,
928
+ text: {
929
+ type: "boolean",
930
+ description: "Include text content."
931
+ }
932
+ },
933
+ description: "Exa contents options."
934
+ },
935
+ promptGuidelines: [
936
+ "For historical page versions, set options.snapshotAsOf to an ISO datetime (not nested inside contents). Exa returns the newest stored version at or before that instant and omits pages without an eligible version. Snapshot is a research preview with limited access and lookback."
937
+ ],
917
938
  retrySafe: true
918
939
  },
919
940
  answer: {
@@ -1970,7 +1991,7 @@ var serpbaseProvider = defineProvider({
1970
1991
  retrySafe: true
1971
1992
  }
1972
1993
  },
1973
- load: async () => (await import("./adapter-RL7JNB22.js")).adapter
1994
+ load: async () => (await import("./adapter-BQUN3ME2.js")).adapter
1974
1995
  });
1975
1996
 
1976
1997
  // src/providers/serper/definition.ts
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  optionSchema,
3
3
  providers
4
- } from "./chunk-VYMIR35R.js";
4
+ } from "./chunk-KH54YH7D.js";
5
5
  import {
6
6
  CAPABILITIES
7
7
  } from "./chunk-GPACLYNT.js";
@@ -9,7 +9,7 @@ import {
9
9
  // package.json
10
10
  var package_default = {
11
11
  name: "webfox",
12
- version: "4.4.1",
12
+ version: "4.5.0",
13
13
  description: "Search the web, extract pages, get grounded answers, and run deep research with the web CLI, a TypeScript library, and a pi extension. Bring your own providers and API keys.",
14
14
  type: "module",
15
15
  files: [
package/dist/cli.js CHANGED
@@ -11,14 +11,14 @@ import {
11
11
  redactConfig,
12
12
  resolveConfigPath,
13
13
  setCapabilityDefault
14
- } from "./chunk-DZ6C4PJH.js";
14
+ } from "./chunk-D4HCJRBE.js";
15
15
  import "./chunk-WCTOYZVB.js";
16
16
  import {
17
17
  PACKAGE_VERSION
18
- } from "./chunk-HFTQQEQC.js";
18
+ } from "./chunk-VI3473TU.js";
19
19
  import {
20
20
  validateConfiguredOptions
21
- } from "./chunk-VYMIR35R.js";
21
+ } from "./chunk-KH54YH7D.js";
22
22
  import "./chunk-ZVTVERW5.js";
23
23
  import {
24
24
  CAPABILITIES,
@@ -1388,6 +1388,11 @@
1388
1388
  ],
1389
1389
  "description": "Include AI-generated summary."
1390
1390
  },
1391
+ "snapshotAsOf": {
1392
+ "type": "string",
1393
+ "minLength": 1,
1394
+ "description": "ISO datetime cutoff, such as '2026-07-01T00:00:00Z'. Return the newest stored page version at or before this instant; pages without an eligible version are omitted. Do not combine with maxAgeHours, livecrawlTimeout, or subpages."
1395
+ },
1391
1396
  "livecrawlTimeout": {
1392
1397
  "type": "integer",
1393
1398
  "minimum": 1,
@@ -1441,7 +1446,7 @@
1441
1446
  }
1442
1447
  },
1443
1448
  "additionalProperties": false,
1444
- "description": "Content extraction and freshness controls. Put text, highlights, summary, maxAgeHours, and livecrawlTimeout here, not directly in options."
1449
+ "description": "Content extraction, freshness, and historical snapshot controls. Put text, highlights, summary, snapshotAsOf, maxAgeHours, and livecrawlTimeout here, not directly in options."
1445
1450
  }
1446
1451
  },
1447
1452
  "description": "Exa search options.",
@@ -1449,6 +1454,18 @@
1449
1454
  },
1450
1455
  "contents": {
1451
1456
  "type": "object",
1457
+ "properties": {
1458
+ "snapshotAsOf": {
1459
+ "type": "string",
1460
+ "minLength": 1,
1461
+ "description": "ISO datetime cutoff, such as '2026-07-01T00:00:00Z'. Return the newest stored page version at or before this instant; pages without an eligible version are omitted. Do not combine with maxAgeHours, livecrawlTimeout, or subpages."
1462
+ },
1463
+ "text": {
1464
+ "type": "boolean",
1465
+ "description": "Include text content."
1466
+ }
1467
+ },
1468
+ "description": "Exa contents options.",
1452
1469
  "additionalProperties": false
1453
1470
  },
1454
1471
  "answer": {
package/dist/index.js CHANGED
@@ -6,14 +6,14 @@ import {
6
6
  resolveConfigPath,
7
7
  setCapabilityDefault,
8
8
  validateConfig
9
- } from "./chunk-DZ6C4PJH.js";
9
+ } from "./chunk-D4HCJRBE.js";
10
10
  import "./chunk-WCTOYZVB.js";
11
11
  import {
12
12
  CONFIG_SCHEMA_URL
13
- } from "./chunk-HFTQQEQC.js";
13
+ } from "./chunk-VI3473TU.js";
14
14
  import {
15
15
  validateConfiguredOptions
16
- } from "./chunk-VYMIR35R.js";
16
+ } from "./chunk-KH54YH7D.js";
17
17
  import "./chunk-ZVTVERW5.js";
18
18
  import {
19
19
  CAPABILITIES,
package/dist/pi.js CHANGED
@@ -4,10 +4,10 @@ import {
4
4
  import {
5
5
  createWebfox,
6
6
  resolveConfigPath
7
- } from "./chunk-DZ6C4PJH.js";
7
+ } from "./chunk-D4HCJRBE.js";
8
8
  import "./chunk-WCTOYZVB.js";
9
- import "./chunk-HFTQQEQC.js";
10
- import "./chunk-VYMIR35R.js";
9
+ import "./chunk-VI3473TU.js";
10
+ import "./chunk-KH54YH7D.js";
11
11
  import "./chunk-ZVTVERW5.js";
12
12
  import {
13
13
  CAPABILITIES
@@ -288,11 +288,7 @@ var WebCall = class {
288
288
  const { args, theme, capability } = this;
289
289
  const title = theme.fg("toolTitle", theme.bold(`web ${capability}`));
290
290
  let text = title;
291
- const parameters = callParameters(
292
- capability,
293
- args,
294
- (key2) => theme.bold(key2)
295
- );
291
+ const parameters = callParameters(capability, args);
296
292
  if (parameters) text += theme.fg("dim", ` ${parameters}`);
297
293
  if (this.expanded)
298
294
  return visibleWidth2(text) <= width ? [text] : new Text2(text, 0, 0).render(width).map((line) => truncateLine(line, width));
package/docs/provider.md CHANGED
@@ -74,6 +74,26 @@ web search "Node.js release notes" --provider exa
74
74
  web research "Compare databases for an analytics service" --provider exa --timeout 20m
75
75
  ```
76
76
 
77
+ Use [Exa Snapshot](https://exa.ai/docs/search/snapshot) to retrieve the newest
78
+ stored page version at or before an ISO datetime. For search, set
79
+ `options.contents.snapshotAsOf`; for page extraction, set `options.snapshotAsOf`.
80
+ Both options are also exposed to the model when Exa is selected in pi.
81
+
82
+ ```sh
83
+ web search "Python release notes" --provider exa \
84
+ --options-json '{"contents":{"snapshotAsOf":"2026-07-01T00:00:00Z"}}'
85
+ web contents https://docs.python.org/3/whatsnew/ --provider exa \
86
+ --options-json '{"snapshotAsOf":"2026-07-01T00:00:00Z","text":true}'
87
+ ```
88
+
89
+ Snapshot search supports `auto`, `fast`, and `instant`, without `category`.
90
+ Do not combine snapshots with `maxAgeHours`, `livecrawl`, `livecrawlTimeout`, or
91
+ `subpages`, including saved defaults. Pages without an eligible snapshot are
92
+ omitted by Exa; page extraction reports those URLs as failures. The cutoff bounds
93
+ page content, not ranking: Exa still discovers candidate URLs using current
94
+ retrieval signals. Snapshot is a research preview with limited access and
95
+ lookback; consult Exa's documentation for current limits.
96
+
77
97
  ## Firecrawl
78
98
 
79
99
  Supports search, page extraction, and page-scoped answers. Set `FIRECRAWL_API_KEY`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webfox",
3
- "version": "4.4.1",
3
+ "version": "4.5.0",
4
4
  "description": "Search the web, extract pages, get grounded answers, and run deep research with the web CLI, a TypeScript library, and a pi extension. Bring your own providers and API keys.",
5
5
  "type": "module",
6
6
  "files": [