openvibers/openvibe.contracts Commits
0.225.0: the Search Fabric (search.fabric.query; search.fabric-request@1, search.fabric-result@1 with route.explain and cited answers, search.provider-offer@1) (#233)
Changes
@@@ -4,6 +4,40 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) thfrom `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,the notes were in the tag and commit messages (`git tag -n1`).++## 0.225.0 — 2026-10-28++++- **The Search Fabric** (plan 2026-10-28 §4.5; the owner, 10-28: "a shared sdk/api enabled multi purpose search system++ for OpenVibe to reuse across sites and more"): one search over several scopes, routed the cheapest way that answers.++ - **`search.fabric.query`** (public, owned by `search`): `POST /api/v1/query` (or `GET /api/v1/query?q=&scopes=`), and++ `GET /api/v1/query/providers`. It is the SDK's `createSearchClient().query()` and the MCP tool `openvibe.search`.++ - **`search.fabric-request@1`:**++ - `q` and `scopes`: `network`, `mine`, `web`, and `news`, `images`, `video`, `products`, `people`, `places`,++ `code` (accepted now; v1 answers them as network results by kind);++ - `filters` (owner, type, lang, site);++ - `freshness`;++ - `depth`: `quick` reads only the indexes and caches, `standard` climbs the provider ladder until a step++ answers, `deep` asks every step;++ - `answer`, `limit` and `cursor`.++ - **`search.fabric-result@1`:**++ - `results`, each with its scope and kind (a document in Search's index, or a web page with its provider,++ URL, date and when it was read);++ - `groups` (counts per scope) and `citations`;++ - an optional `answer`. It is labelled "Written by AI from these sources" and is never without citations.++ - `route.explain`: step by step, what was asked, what answered, from the cache or not, why a step was++ skipped, and what it cost.++++ The query is never echoed (the `?q=` rule).++ - **`search.provider-offer@1`:** a web provider as the ladder and Route see it. It gives the scopes, the price++ per call, whether the provider has its own index, availability (balance, key, rate limit, daily cap),++ latency, answered rate and terms.++ - **Who may use what:**++ - anonymous callers get network results, plus web results from the open index and the cache;++ - a signed-in person, or a first-party service, also reaches the paid providers within OpenVibe's daily caps;++ - `mine` needs a person;++ - providers never receive an account identifier.++++ Fixtures, valid and invalid, for all three schemas.++## 0.224.0 — 2026-10-28- **A `crawl` source type for OpenVibe.Sources** (the owner, 2026-10-28: "aggregate all websites and select deals on all@@@ -266,6 +266,33 @@"compatibility": "backward","status": "active"},++ {++ "id": "search.fabric-request",++ "version": "1.0.0",++ "owner": "search",++ "schema": "search/fabric-request.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "search.fabric-result",++ "version": "1.0.0",++ "owner": "search",++ "schema": "search/fabric-result.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },++ {++ "id": "search.provider-offer",++ "version": "1.0.0",++ "owner": "search",++ "schema": "search/provider-offer.v1.json",++ "visibility": "public",++ "compatibility": "backward",++ "status": "active"++ },{"id": "search.write-result","version": "1.0.0",nnew file mode 100644@@@ -0,0 +1,104 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/search/fabric-request.v1.json",++ "title": "SearchFabricRequest",++ "description": "search.fabric-request@1: the body of POST /api/v1/query (or the query string of GET /api/v1/query, scopes comma-separated), capability search.fabric.query. One search over several scopes, routed the cheapest way that answers (plan 2026-10-28 \u00a74.5). network: Search's own index, permission-aware exactly as search.query.run; mine: the caller's own private documents (a signed-in person, or a service with X-OV-Subject); web: OpenVibe's open index first, then paid providers in a ladder, each result keeping its provider, date and URL. Providers never receive an account identifier. A scope the caller may not use (mine without a person; web's paid providers for an anonymous caller, who gets cached and open-index results only) is reported in route.explain, never an error. The other scopes are facets of the same indexes and are accepted for forward compatibility; v1 answers them as network results filtered by kind.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "q"++ ],++ "properties": {++ "q": {++ "type": "string",++ "minLength": 1,++ "maxLength": 200,++ "description": "What to find."++ },++ "scopes": {++ "type": "array",++ "minItems": 1,++ "maxItems": 10,++ "uniqueItems": true,++ "items": {++ "enum": [++ "network",++ "mine",++ "web",++ "news",++ "images",++ "video",++ "products",++ "people",++ "places",++ "code"++ ]++ },++ "default": [++ "network"++ ],++ "description": "Where to look; results are grouped by scope. Default: network."++ },++ "filters": {++ "type": "object",++ "additionalProperties": false,++ "description": "Narrow the network and mine scopes (never widen what the caller may see).",++ "properties": {++ "owner": {++ "type": "string",++ "pattern": "^[a-z][a-z0-9_-]{0,31}$"++ },++ "type": {++ "type": "string",++ "pattern": "^[a-z][a-z0-9_-]{0,31}$"++ },++ "lang": {++ "type": "string",++ "pattern": "^[a-zA-Z]{2,3}(-[A-Za-z0-9]{2,8})*$"++ },++ "site": {++ "type": "string",++ "maxLength": 253,++ "pattern": "^[a-z0-9.-]+$",++ "description": "web: results from this host only."++ }++ }++ },++ "freshness": {++ "enum": [++ "any",++ "day",++ "week",++ "month",++ "year"++ ],++ "default": "any",++ "description": "How recent results must be, where the source dates them."++ },++ "depth": {++ "enum": [++ "quick",++ "standard",++ "deep"++ ],++ "default": "standard",++ "description": "quick: indexes and caches only (no paid provider); standard: the ladder until a step answers; deep: every step, merged."++ },++ "answer": {++ "type": "boolean",++ "default": false,++ "description": "Ask for a short cited answer written by AI from the results. Never without citations; labelled AI. A deployment may decline (answer: null, with the reason in route.explain)."++ },++ "limit": {++ "type": "integer",++ "minimum": 1,++ "maximum": 50,++ "default": 20++ },++ "cursor": {++ "type": "string",++ "maxLength": 512,++ "description": "next_cursor of the previous page (network and mine only)."++ }++ }++}nnew file mode 100644@@@ -0,0 +1,296 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/search/fabric-result.v1.json",++ "title": "SearchFabricResult",++ "description": "search.fabric-result@1: the answer of search.fabric.query. results come grouped by scope order (the room's own first when the caller asked for it); every web result keeps its provider, URL and date; route.explain says, step by step, what was asked, what answered, from cache or not, and what it cost. The query is never echoed: a page renders results without writing the query into its HTML (the ?q= rule).",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "results",++ "groups",++ "route",++ "next_cursor"++ ],++ "properties": {++ "results": {++ "type": "array",++ "maxItems": 100,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "scope",++ "kind",++ "title",++ "url"++ ],++ "properties": {++ "scope": {++ "enum": [++ "network",++ "mine",++ "web",++ "news",++ "images",++ "video",++ "products",++ "people",++ "places",++ "code"++ ]++ },++ "kind": {++ "enum": [++ "document",++ "page"++ ],++ "description": "document: in Search's index (owner, type, id set); page: a web page (provider set)."++ },++ "title": {++ "type": "string",++ "maxLength": 300++ },++ "url": {++ "type": "string",++ "maxLength": 2048,++ "format": "uri"++ },++ "snippet": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 600,++ "description": "Plain text; never HTML."++ },++ "site": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 253++ },++ "image": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 2048++ },++ "published_at": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 40++ },++ "retrieved_at": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 40,++ "description": "When a web page was read (by the provider or the open index)."++ },++ "provider": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 40,++ "description": "page: who found it (open_index, deepseek, wikipedia, brave, \u2026)."++ },++ "owner": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 32++ },++ "type": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 32++ },++ "id": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 200++ },++ "score": {++ "type": [++ "number",++ "null"++ ],++ "description": "Rank within its scope (higher first); not comparable across scopes."++ }++ }++ }++ },++ "groups": {++ "type": "object",++ "additionalProperties": {++ "type": "integer",++ "minimum": 0++ },++ "description": "How many results each scope gave on this page."++ },++ "answer": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "required": [++ "text",++ "citations",++ "label"++ ],++ "properties": {++ "text": {++ "type": "string",++ "maxLength": 2000++ },++ "citations": {++ "type": "array",++ "minItems": 1,++ "maxItems": 20,++ "items": {++ "type": "integer",++ "minimum": 1++ }++ },++ "label": {++ "const": "Written by AI from these sources"++ }++ }++ },++ "citations": {++ "type": "array",++ "maxItems": 20,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "n",++ "url",++ "title"++ ],++ "properties": {++ "n": {++ "type": "integer",++ "minimum": 1++ },++ "url": {++ "type": "string",++ "maxLength": 2048++ },++ "title": {++ "type": "string",++ "maxLength": 300++ },++ "provider": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 40++ },++ "retrieved_at": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 40++ }++ }++ }++ },++ "route": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "explain",++ "cost_usd"++ ],++ "properties": {++ "explain": {++ "type": "array",++ "maxItems": 20,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "scope",++ "step",++ "ok"++ ],++ "properties": {++ "scope": {++ "enum": [++ "network",++ "mine",++ "web",++ "news",++ "images",++ "video",++ "products",++ "people",++ "places",++ "code"++ ]++ },++ "step": {++ "type": "string",++ "maxLength": 40,++ "description": "index, open_index, cache, deepseek, wikipedia, \u2026"++ },++ "ok": {++ "type": "boolean"++ },++ "count": {++ "type": "integer",++ "minimum": 0++ },++ "ms": {++ "type": "integer",++ "minimum": 0++ },++ "cached": {++ "type": "boolean"++ },++ "cost_usd": {++ "type": "number",++ "minimum": 0++ },++ "skipped": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 160,++ "description": "Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down)."++ }++ }++ }++ },++ "cost_usd": {++ "type": "number",++ "minimum": 0,++ "description": "What this query cost OpenVibe (paid provider calls; cached answers cost 0)."++ }++ }++ },++ "next_cursor": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 512++ }++ }++}nnew file mode 100644@@@ -0,0 +1,103 @@++{++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/search/provider-offer.v1.json",++ "title": "SearchProviderOffer",++ "description": "search.provider-offer@1: one web search provider as the Search Fabric's ladder and Route see it (GET /api/v1/query/providers, capability search.fabric.query): what it covers, what it costs, whether it is usable now and how it has answered. Prices are the vendor's published ones as of checked_at; nothing here is a secret.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "provider",++ "scopes",++ "price_usd_per_call",++ "available",++ "checked_at"++ ],++ "properties": {++ "provider": {++ "type": "string",++ "pattern": "^[a-z][a-z0-9_]{1,39}$"++ },++ "name": {++ "type": "string",++ "maxLength": 80++ },++ "scopes": {++ "type": "array",++ "minItems": 1,++ "items": {++ "enum": [++ "network",++ "mine",++ "web",++ "news",++ "images",++ "video",++ "products",++ "people",++ "places",++ "code"++ ]++ }++ },++ "price_usd_per_call": {++ "type": "number",++ "minimum": 0++ },++ "independent_index": {++ "type": "boolean",++ "description": "Searches its own crawl rather than reselling another engine's."++ },++ "available": {++ "type": "boolean",++ "description": "Configured and not standing down (balance, key, rate limit, daily cap)."++ },++ "reason": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 160++ },++ "daily_cap": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "used_today": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "latency_ms_p50": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "answered_rate": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0,++ "maximum": 1,++ "description": "Share of calls in the last day that returned at least one result."++ },++ "terms_url": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 2048++ },++ "checked_at": {++ "type": "string",++ "maxLength": 40++ }++ }++}nnew file mode 100644@@@ -0,0 +1,3 @@++{++ "q": ""++}nnew file mode 100644@@@ -0,0 +1,4 @@++{++ "q": "x",++ "limit": 500++}nnew file mode 100644@@@ -0,0 +1,6 @@++{++ "q": "x",++ "scopes": [++ "everything"++ ]++}nnew file mode 100644@@@ -0,0 +1,12 @@++{++ "q": "notes",++ "scopes": [++ "mine"++ ],++ "filters": {++ "owner": "community",++ "type": "paste"++ },++ "answer": false,++ "depth": "quick"++}nnew file mode 100644@@@ -0,0 +1,3 @@++{++ "q": "lofi streams"++}nnew file mode 100644@@@ -0,0 +1,10 @@++{++ "q": "surf_utopia world record",++ "scopes": [++ "network",++ "web"++ ],++ "freshness": "month",++ "depth": "standard",++ "limit": 10++}nnew file mode 100644@@@ -0,0 +1,14 @@++{++ "results": [],++ "groups": {},++ "answer": {++ "text": "Trust me.",++ "citations": [],++ "label": "Written by AI from these sources"++ },++ "route": {++ "explain": [],++ "cost_usd": 0++ },++ "next_cursor": null++}nnew file mode 100644@@@ -0,0 +1,16 @@++{++ "results": [++ {++ "scope": "web",++ "kind": "html",++ "title": "x",++ "url": "https://x.org/"++ }++ ],++ "groups": {},++ "route": {++ "explain": [],++ "cost_usd": 0++ },++ "next_cursor": null++}nnew file mode 100644@@@ -0,0 +1,88 @@++{++ "results": [++ {++ "scope": "network",++ "kind": "document",++ "title": "surf_utopia in 1:02.4",++ "url": "https://openvibe.live/clips/482",++ "snippet": "A clean line through every stage.",++ "site": "openvibe.live",++ "image": null,++ "published_at": "2026-10-27T21:04:00Z",++ "retrieved_at": null,++ "provider": null,++ "owner": "media-hub",++ "type": "clip",++ "id": "482",++ "score": 0.82++ },++ {++ "scope": "web",++ "kind": "page",++ "title": "Surf (Counter-Strike) - Wikipedia",++ "url": "https://en.wikipedia.org/wiki/Surf_(video_game_mode)",++ "snippet": "Surfing is a game mode in Counter-Strike\u2026",++ "site": "en.wikipedia.org",++ "image": null,++ "published_at": null,++ "retrieved_at": "2026-10-28T11:20:00Z",++ "provider": "wikipedia",++ "owner": null,++ "type": null,++ "id": null,++ "score": 0.61++ }++ ],++ "groups": {++ "network": 1,++ "web": 1++ },++ "answer": null,++ "citations": [++ {++ "n": 1,++ "url": "https://en.wikipedia.org/wiki/Surf_(video_game_mode)",++ "title": "Surf (Counter-Strike) - Wikipedia",++ "provider": "wikipedia",++ "retrieved_at": "2026-10-28T11:20:00Z"++ }++ ],++ "route": {++ "explain": [++ {++ "scope": "network",++ "step": "index",++ "ok": true,++ "count": 1,++ "ms": 18,++ "cached": false,++ "cost_usd": 0++ },++ {++ "scope": "web",++ "step": "open_index",++ "ok": true,++ "count": 0,++ "ms": 9,++ "cost_usd": 0++ },++ {++ "scope": "web",++ "step": "deepseek",++ "ok": true,++ "count": 1,++ "ms": 1420,++ "cached": true,++ "cost_usd": 0++ },++ {++ "scope": "web",++ "step": "brave",++ "ok": false,++ "skipped": "an earlier step answered"++ }++ ],++ "cost_usd": 0++ },++ "next_cursor": null++}nnew file mode 100644@@@ -0,0 +1,43 @@++{++ "results": [++ {++ "scope": "web",++ "kind": "page",++ "title": "A",++ "url": "https://example.org/a",++ "provider": "deepseek"++ }++ ],++ "groups": {++ "web": 1++ },++ "answer": {++ "text": "Surf maps are ramps you slide along [1].",++ "citations": [++ 1++ ],++ "label": "Written by AI from these sources"++ },++ "citations": [++ {++ "n": 1,++ "url": "https://example.org/a",++ "title": "A",++ "provider": "deepseek",++ "retrieved_at": "2026-10-28T11:20:00Z"++ }++ ],++ "route": {++ "explain": [++ {++ "scope": "web",++ "step": "deepseek",++ "ok": true,++ "count": 1,++ "cost_usd": 0.00075++ }++ ],++ "cost_usd": 0.00075++ },++ "next_cursor": null++}nnew file mode 100644@@@ -0,0 +1,9 @@++{++ "provider": "x",++ "scopes": [++ "web"++ ],++ "price_usd_per_call": -1,++ "available": true,++ "checked_at": "2026-10-28T11:00:00Z"++}nnew file mode 100644@@@ -0,0 +1,18 @@++{++ "provider": "deepseek",++ "name": "DeepSeek Search",++ "scopes": [++ "web",++ "news"++ ],++ "price_usd_per_call": 0.00075,++ "independent_index": false,++ "available": true,++ "reason": null,++ "daily_cap": 1500,++ "used_today": 212,++ "latency_ms_p50": 1380,++ "answered_rate": 0.97,++ "terms_url": "https://api-docs.deepseek.com/guides/search",++ "checked_at": "2026-10-28T11:00:00Z"++}@@@ -3664,6 +3664,524 @@}}},++ "search.fabric-request": {++ "version": "1.0.0",++ "owner": "search",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/search/fabric-request.v1.json",++ "title": "SearchFabricRequest",++ "description": "search.fabric-request@1: the body of POST /api/v1/query (or the query string of GET /api/v1/query, scopes comma-separated), capability search.fabric.query. One search over several scopes, routed the cheapest way that answers (plan 2026-10-28 §4.5). network: Search's own index, permission-aware exactly as search.query.run; mine: the caller's own private documents (a signed-in person, or a service with X-OV-Subject); web: OpenVibe's open index first, then paid providers in a ladder, each result keeping its provider, date and URL. Providers never receive an account identifier. A scope the caller may not use (mine without a person; web's paid providers for an anonymous caller, who gets cached and open-index results only) is reported in route.explain, never an error. The other scopes are facets of the same indexes and are accepted for forward compatibility; v1 answers them as network results filtered by kind.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "q"++ ],++ "properties": {++ "q": {++ "type": "string",++ "minLength": 1,++ "maxLength": 200,++ "description": "What to find."++ },++ "scopes": {++ "type": "array",++ "minItems": 1,++ "maxItems": 10,++ "uniqueItems": true,++ "items": {++ "enum": [++ "network",++ "mine",++ "web",++ "news",++ "images",++ "video",++ "products",++ "people",++ "places",++ "code"++ ]++ },++ "default": [++ "network"++ ],++ "description": "Where to look; results are grouped by scope. Default: network."++ },++ "filters": {++ "type": "object",++ "additionalProperties": false,++ "description": "Narrow the network and mine scopes (never widen what the caller may see).",++ "properties": {++ "owner": {++ "type": "string",++ "pattern": "^[a-z][a-z0-9_-]{0,31}$"++ },++ "type": {++ "type": "string",++ "pattern": "^[a-z][a-z0-9_-]{0,31}$"++ },++ "lang": {++ "type": "string",++ "pattern": "^[a-zA-Z]{2,3}(-[A-Za-z0-9]{2,8})*$"++ },++ "site": {++ "type": "string",++ "maxLength": 253,++ "pattern": "^[a-z0-9.-]+$",++ "description": "web: results from this host only."++ }++ }++ },++ "freshness": {++ "enum": [++ "any",++ "day",++ "week",++ "month",++ "year"++ ],++ "default": "any",++ "description": "How recent results must be, where the source dates them."++ },++ "depth": {++ "enum": [++ "quick",++ "standard",++ "deep"++ ],++ "default": "standard",++ "description": "quick: indexes and caches only (no paid provider); standard: the ladder until a step answers; deep: every step, merged."++ },++ "answer": {++ "type": "boolean",++ "default": false,++ "description": "Ask for a short cited answer written by AI from the results. Never without citations; labelled AI. A deployment may decline (answer: null, with the reason in route.explain)."++ },++ "limit": {++ "type": "integer",++ "minimum": 1,++ "maximum": 50,++ "default": 20++ },++ "cursor": {++ "type": "string",++ "maxLength": 512,++ "description": "next_cursor of the previous page (network and mine only)."++ }++ }++ }++ },++ "search.fabric-result": {++ "version": "1.0.0",++ "owner": "search",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/search/fabric-result.v1.json",++ "title": "SearchFabricResult",++ "description": "search.fabric-result@1: the answer of search.fabric.query. results come grouped by scope order (the room's own first when the caller asked for it); every web result keeps its provider, URL and date; route.explain says, step by step, what was asked, what answered, from cache or not, and what it cost. The query is never echoed: a page renders results without writing the query into its HTML (the ?q= rule).",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "results",++ "groups",++ "route",++ "next_cursor"++ ],++ "properties": {++ "results": {++ "type": "array",++ "maxItems": 100,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "scope",++ "kind",++ "title",++ "url"++ ],++ "properties": {++ "scope": {++ "enum": [++ "network",++ "mine",++ "web",++ "news",++ "images",++ "video",++ "products",++ "people",++ "places",++ "code"++ ]++ },++ "kind": {++ "enum": [++ "document",++ "page"++ ],++ "description": "document: in Search's index (owner, type, id set); page: a web page (provider set)."++ },++ "title": {++ "type": "string",++ "maxLength": 300++ },++ "url": {++ "type": "string",++ "maxLength": 2048,++ "format": "uri"++ },++ "snippet": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 600,++ "description": "Plain text; never HTML."++ },++ "site": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 253++ },++ "image": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 2048++ },++ "published_at": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 40++ },++ "retrieved_at": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 40,++ "description": "When a web page was read (by the provider or the open index)."++ },++ "provider": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 40,++ "description": "page: who found it (open_index, deepseek, wikipedia, brave, …)."++ },++ "owner": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 32++ },++ "type": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 32++ },++ "id": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 200++ },++ "score": {++ "type": [++ "number",++ "null"++ ],++ "description": "Rank within its scope (higher first); not comparable across scopes."++ }++ }++ }++ },++ "groups": {++ "type": "object",++ "additionalProperties": {++ "type": "integer",++ "minimum": 0++ },++ "description": "How many results each scope gave on this page."++ },++ "answer": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "required": [++ "text",++ "citations",++ "label"++ ],++ "properties": {++ "text": {++ "type": "string",++ "maxLength": 2000++ },++ "citations": {++ "type": "array",++ "minItems": 1,++ "maxItems": 20,++ "items": {++ "type": "integer",++ "minimum": 1++ }++ },++ "label": {++ "const": "Written by AI from these sources"++ }++ }++ },++ "citations": {++ "type": "array",++ "maxItems": 20,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "n",++ "url",++ "title"++ ],++ "properties": {++ "n": {++ "type": "integer",++ "minimum": 1++ },++ "url": {++ "type": "string",++ "maxLength": 2048++ },++ "title": {++ "type": "string",++ "maxLength": 300++ },++ "provider": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 40++ },++ "retrieved_at": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 40++ }++ }++ }++ },++ "route": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "explain",++ "cost_usd"++ ],++ "properties": {++ "explain": {++ "type": "array",++ "maxItems": 20,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "scope",++ "step",++ "ok"++ ],++ "properties": {++ "scope": {++ "enum": [++ "network",++ "mine",++ "web",++ "news",++ "images",++ "video",++ "products",++ "people",++ "places",++ "code"++ ]++ },++ "step": {++ "type": "string",++ "maxLength": 40,++ "description": "index, open_index, cache, deepseek, wikipedia, …"++ },++ "ok": {++ "type": "boolean"++ },++ "count": {++ "type": "integer",++ "minimum": 0++ },++ "ms": {++ "type": "integer",++ "minimum": 0++ },++ "cached": {++ "type": "boolean"++ },++ "cost_usd": {++ "type": "number",++ "minimum": 0++ },++ "skipped": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 160,++ "description": "Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down)."++ }++ }++ }++ },++ "cost_usd": {++ "type": "number",++ "minimum": 0,++ "description": "What this query cost OpenVibe (paid provider calls; cached answers cost 0)."++ }++ }++ },++ "next_cursor": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 512++ }++ }++ }++ },++ "search.provider-offer": {++ "version": "1.0.0",++ "owner": "search",++ "status": "active",++ "schema": {++ "$schema": "https://json-schema.org/draft/2020-12/schema",++ "$id": "https://openvibe.network/contracts/search/provider-offer.v1.json",++ "title": "SearchProviderOffer",++ "description": "search.provider-offer@1: one web search provider as the Search Fabric's ladder and Route see it (GET /api/v1/query/providers, capability search.fabric.query): what it covers, what it costs, whether it is usable now and how it has answered. Prices are the vendor's published ones as of checked_at; nothing here is a secret.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "provider",++ "scopes",++ "price_usd_per_call",++ "available",++ "checked_at"++ ],++ "properties": {++ "provider": {++ "type": "string",++ "pattern": "^[a-z][a-z0-9_]{1,39}$"++ },++ "name": {++ "type": "string",++ "maxLength": 80++ },++ "scopes": {++ "type": "array",++ "minItems": 1,++ "items": {++ "enum": [++ "network",++ "mine",++ "web",++ "news",++ "images",++ "video",++ "products",++ "people",++ "places",++ "code"++ ]++ }++ },++ "price_usd_per_call": {++ "type": "number",++ "minimum": 0++ },++ "independent_index": {++ "type": "boolean",++ "description": "Searches its own crawl rather than reselling another engine's."++ },++ "available": {++ "type": "boolean",++ "description": "Configured and not standing down (balance, key, rate limit, daily cap)."++ },++ "reason": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 160++ },++ "daily_cap": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "used_today": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "latency_ms_p50": {++ "type": [++ "integer",++ "null"++ ],++ "minimum": 0++ },++ "answered_rate": {++ "type": [++ "number",++ "null"++ ],++ "minimum": 0,++ "maximum": 1,++ "description": "Share of calls in the last day that returned at least one result."++ },++ "terms_url": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 2048++ },++ "checked_at": {++ "type": "string",++ "maxLength": 40++ }++ }++ }++ },"search.write-result": {"version": "1.0.0","owner": "search",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Actor API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.AI API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Billing API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Blog API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Bot API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Chat API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Codes API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Community API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Coupons API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Deals API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Events API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Food API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Games API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Host API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -180,8 +180,8 @@"service": "search","name": "OpenVibe.Search","origin": "https://search.openvibe.network",-- "operations": 8,-- "capabilities": 3++ "operations": 11,++ "capabilities": 4},{"service": "services",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Inventory API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Live API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.MediaHub API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Media API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Network API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.News API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenRestream API",-- "version": "0.224.0",-- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Play API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Quest API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Reviews API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Run API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Search API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -502,6 +502,438 @@}}},++ "/api/v1/query": {++ "get": {++ "operationId": "get_api_v1_query",++ "summary": "One search over several scopes (plan 2026-10-28 §4.5, the Search Fabric): network (Search's index, permission-aware as search.query.run), mine (the person's own private documents), web (OpenVibe's ope",++ "description": "**search.fabric.query** (public): One search over several scopes (plan 2026-10-28 §4.5, the Search Fabric): network (Search's index, permission-aware as search.query.run), mine (the person's own private documents), web (OpenVibe's open index, then paid providers in a ladder, cached), with route.explain saying what answered and what it cost. Anonymous callers get network results and web results from the open index and the cache; a signed-in person or a first-party service (X-OV-Subject for mine) also reaches paid providers within OpenVibe's daily caps. Providers never receive an account identifier. The same operation is the SDK's createSearchClient().query() and the MCP tool openvibe.search.",++ "tags": [++ "search.fabric"++ ],++ "x-openvibe-capabilities": [++ "search.fabric.query"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "search-query",++ "security": [++ {++ "openvibeToken": [++ "search.fabric.query"++ ]++ }++ ],++ "x-openvibe-input": {++ "$ref": "#/components/schemas/search.fabric-request.v1"++ },++ "parameters": [++ {++ "name": "q",++ "in": "query",++ "required": true,++ "schema": {++ "type": "string",++ "minLength": 1,++ "maxLength": 200,++ "description": "What to find."++ },++ "description": "What to find."++ },++ {++ "name": "scopes",++ "in": "query",++ "required": false,++ "schema": {++ "type": "array",++ "minItems": 1,++ "maxItems": 10,++ "uniqueItems": true,++ "items": {++ "enum": [++ "network",++ "mine",++ "web",++ "news",++ "images",++ "video",++ "products",++ "people",++ "places",++ "code"++ ]++ },++ "default": [++ "network"++ ],++ "description": "Where to look; results are grouped by scope. Default: network."++ },++ "description": "Where to look; results are grouped by scope. Default: network."++ },++ {++ "name": "filters",++ "in": "query",++ "required": false,++ "schema": {++ "type": "object",++ "additionalProperties": false,++ "description": "Narrow the network and mine scopes (never widen what the caller may see).",++ "properties": {++ "owner": {++ "type": "string",++ "pattern": "^[a-z][a-z0-9_-]{0,31}$"++ },++ "type": {++ "type": "string",++ "pattern": "^[a-z][a-z0-9_-]{0,31}$"++ },++ "lang": {++ "type": "string",++ "pattern": "^[a-zA-Z]{2,3}(-[A-Za-z0-9]{2,8})*$"++ },++ "site": {++ "type": "string",++ "maxLength": 253,++ "pattern": "^[a-z0-9.-]+$",++ "description": "web: results from this host only."++ }++ }++ },++ "description": "Narrow the network and mine scopes (never widen what the caller may see)."++ },++ {++ "name": "freshness",++ "in": "query",++ "required": false,++ "schema": {++ "enum": [++ "any",++ "day",++ "week",++ "month",++ "year"++ ],++ "default": "any",++ "description": "How recent results must be, where the source dates them."++ },++ "description": "How recent results must be, where the source dates them."++ },++ {++ "name": "depth",++ "in": "query",++ "required": false,++ "schema": {++ "enum": [++ "quick",++ "standard",++ "deep"++ ],++ "default": "standard",++ "description": "quick: indexes and caches only (no paid provider); standard: the ladder until a step answers; deep: every step, merged."++ },++ "description": "quick: indexes and caches only (no paid provider); standard: the ladder until a step answers; deep: every step, merged."++ },++ {++ "name": "answer",++ "in": "query",++ "required": false,++ "schema": {++ "type": "boolean",++ "default": false,++ "description": "Ask for a short cited answer written by AI from the results. Never without citations; labelled AI. A deployment may decline (answer: null, with the reason in route.explain)."++ },++ "description": "Ask for a short cited answer written by AI from the results. Never without citations; labelled AI. A deployment may decline (answer: null, with the reason in route.explain)."++ },++ {++ "name": "limit",++ "in": "query",++ "required": false,++ "schema": {++ "type": "integer",++ "minimum": 1,++ "maximum": 50,++ "default": 20++ }++ },++ {++ "name": "cursor",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "maxLength": 512,++ "description": "next_cursor of the previous page (network and mine only)."++ },++ "description": "next_cursor of the previous page (network and mine only)."++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/search.fabric-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ },++ "post": {++ "operationId": "post_api_v1_query",++ "summary": "One search over several scopes (plan 2026-10-28 §4.5, the Search Fabric): network (Search's index, permission-aware as search.query.run), mine (the person's own private documents), web (OpenVibe's ope",++ "description": "**search.fabric.query** (public): One search over several scopes (plan 2026-10-28 §4.5, the Search Fabric): network (Search's index, permission-aware as search.query.run), mine (the person's own private documents), web (OpenVibe's open index, then paid providers in a ladder, cached), with route.explain saying what answered and what it cost. Anonymous callers get network results and web results from the open index and the cache; a signed-in person or a first-party service (X-OV-Subject for mine) also reaches paid providers within OpenVibe's daily caps. Providers never receive an account identifier. The same operation is the SDK's createSearchClient().query() and the MCP tool openvibe.search.",++ "tags": [++ "search.fabric"++ ],++ "x-openvibe-capabilities": [++ "search.fabric.query"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "search-query",++ "security": [++ {++ "openvibeToken": [++ "search.fabric.query"++ ]++ }++ ],++ "requestBody": {++ "required": false,++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/search.fabric-request.v1"++ }++ }++ }++ },++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/search.fabric-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },++ "/api/v1/query/providers": {++ "get": {++ "operationId": "get_api_v1_query_providers",++ "summary": "One search over several scopes (plan 2026-10-28 §4.5, the Search Fabric): network (Search's index, permission-aware as search.query.run), mine (the person's own private documents), web (OpenVibe's ope",++ "description": "**search.fabric.query** (public): One search over several scopes (plan 2026-10-28 §4.5, the Search Fabric): network (Search's index, permission-aware as search.query.run), mine (the person's own private documents), web (OpenVibe's open index, then paid providers in a ladder, cached), with route.explain saying what answered and what it cost. Anonymous callers get network results and web results from the open index and the cache; a signed-in person or a first-party service (X-OV-Subject for mine) also reaches paid providers within OpenVibe's daily caps. Providers never receive an account identifier. The same operation is the SDK's createSearchClient().query() and the MCP tool openvibe.search.",++ "tags": [++ "search.fabric"++ ],++ "x-openvibe-capabilities": [++ "search.fabric.query"++ ],++ "x-openvibe-visibility": [++ "public"++ ],++ "x-openvibe-quota-class": "search-query",++ "security": [++ {++ "openvibeToken": [++ "search.fabric.query"++ ]++ }++ ],++ "x-openvibe-input": {++ "$ref": "#/components/schemas/search.fabric-request.v1"++ },++ "parameters": [++ {++ "name": "q",++ "in": "query",++ "required": true,++ "schema": {++ "type": "string",++ "minLength": 1,++ "maxLength": 200,++ "description": "What to find."++ },++ "description": "What to find."++ },++ {++ "name": "scopes",++ "in": "query",++ "required": false,++ "schema": {++ "type": "array",++ "minItems": 1,++ "maxItems": 10,++ "uniqueItems": true,++ "items": {++ "enum": [++ "network",++ "mine",++ "web",++ "news",++ "images",++ "video",++ "products",++ "people",++ "places",++ "code"++ ]++ },++ "default": [++ "network"++ ],++ "description": "Where to look; results are grouped by scope. Default: network."++ },++ "description": "Where to look; results are grouped by scope. Default: network."++ },++ {++ "name": "filters",++ "in": "query",++ "required": false,++ "schema": {++ "type": "object",++ "additionalProperties": false,++ "description": "Narrow the network and mine scopes (never widen what the caller may see).",++ "properties": {++ "owner": {++ "type": "string",++ "pattern": "^[a-z][a-z0-9_-]{0,31}$"++ },++ "type": {++ "type": "string",++ "pattern": "^[a-z][a-z0-9_-]{0,31}$"++ },++ "lang": {++ "type": "string",++ "pattern": "^[a-zA-Z]{2,3}(-[A-Za-z0-9]{2,8})*$"++ },++ "site": {++ "type": "string",++ "maxLength": 253,++ "pattern": "^[a-z0-9.-]+$",++ "description": "web: results from this host only."++ }++ }++ },++ "description": "Narrow the network and mine scopes (never widen what the caller may see)."++ },++ {++ "name": "freshness",++ "in": "query",++ "required": false,++ "schema": {++ "enum": [++ "any",++ "day",++ "week",++ "month",++ "year"++ ],++ "default": "any",++ "description": "How recent results must be, where the source dates them."++ },++ "description": "How recent results must be, where the source dates them."++ },++ {++ "name": "depth",++ "in": "query",++ "required": false,++ "schema": {++ "enum": [++ "quick",++ "standard",++ "deep"++ ],++ "default": "standard",++ "description": "quick: indexes and caches only (no paid provider); standard: the ladder until a step answers; deep: every step, merged."++ },++ "description": "quick: indexes and caches only (no paid provider); standard: the ladder until a step answers; deep: every step, merged."++ },++ {++ "name": "answer",++ "in": "query",++ "required": false,++ "schema": {++ "type": "boolean",++ "default": false,++ "description": "Ask for a short cited answer written by AI from the results. Never without citations; labelled AI. A deployment may decline (answer: null, with the reason in route.explain)."++ },++ "description": "Ask for a short cited answer written by AI from the results. Never without citations; labelled AI. A deployment may decline (answer: null, with the reason in route.explain)."++ },++ {++ "name": "limit",++ "in": "query",++ "required": false,++ "schema": {++ "type": "integer",++ "minimum": 1,++ "maximum": 50,++ "default": 20++ }++ },++ {++ "name": "cursor",++ "in": "query",++ "required": false,++ "schema": {++ "type": "string",++ "maxLength": 512,++ "description": "next_cursor of the previous page (network and mine only)."++ },++ "description": "next_cursor of the previous page (network and mine only)."++ }++ ],++ "responses": {++ "2XX": {++ "description": "Success",++ "content": {++ "application/json": {++ "schema": {++ "$ref": "#/components/schemas/search.fabric-result.v1"++ }++ }++ }++ },++ "default": {++ "description": "An error (RFC 9457 problem details)",++ "content": {++ "application/problem+json": {++ "schema": {++ "$ref": "#/components/schemas/errors.problem.v1"++ }++ }++ }++ }++ }++ }++ },"/api/v1/search": {"get": {"operationId": "get_api_v1_search",@@@ -865,6 +1297,402 @@}]},++ "search.fabric-request.v1": {++ "title": "SearchFabricRequest",++ "description": "search.fabric-request@1: the body of POST /api/v1/query (or the query string of GET /api/v1/query, scopes comma-separated), capability search.fabric.query. One search over several scopes, routed the cheapest way that answers (plan 2026-10-28 §4.5). network: Search's own index, permission-aware exactly as search.query.run; mine: the caller's own private documents (a signed-in person, or a service with X-OV-Subject); web: OpenVibe's open index first, then paid providers in a ladder, each result keeping its provider, date and URL. Providers never receive an account identifier. A scope the caller may not use (mine without a person; web's paid providers for an anonymous caller, who gets cached and open-index results only) is reported in route.explain, never an error. The other scopes are facets of the same indexes and are accepted for forward compatibility; v1 answers them as network results filtered by kind.",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "q"++ ],++ "properties": {++ "q": {++ "type": "string",++ "minLength": 1,++ "maxLength": 200,++ "description": "What to find."++ },++ "scopes": {++ "type": "array",++ "minItems": 1,++ "maxItems": 10,++ "uniqueItems": true,++ "items": {++ "enum": [++ "network",++ "mine",++ "web",++ "news",++ "images",++ "video",++ "products",++ "people",++ "places",++ "code"++ ]++ },++ "default": [++ "network"++ ],++ "description": "Where to look; results are grouped by scope. Default: network."++ },++ "filters": {++ "type": "object",++ "additionalProperties": false,++ "description": "Narrow the network and mine scopes (never widen what the caller may see).",++ "properties": {++ "owner": {++ "type": "string",++ "pattern": "^[a-z][a-z0-9_-]{0,31}$"++ },++ "type": {++ "type": "string",++ "pattern": "^[a-z][a-z0-9_-]{0,31}$"++ },++ "lang": {++ "type": "string",++ "pattern": "^[a-zA-Z]{2,3}(-[A-Za-z0-9]{2,8})*$"++ },++ "site": {++ "type": "string",++ "maxLength": 253,++ "pattern": "^[a-z0-9.-]+$",++ "description": "web: results from this host only."++ }++ }++ },++ "freshness": {++ "enum": [++ "any",++ "day",++ "week",++ "month",++ "year"++ ],++ "default": "any",++ "description": "How recent results must be, where the source dates them."++ },++ "depth": {++ "enum": [++ "quick",++ "standard",++ "deep"++ ],++ "default": "standard",++ "description": "quick: indexes and caches only (no paid provider); standard: the ladder until a step answers; deep: every step, merged."++ },++ "answer": {++ "type": "boolean",++ "default": false,++ "description": "Ask for a short cited answer written by AI from the results. Never without citations; labelled AI. A deployment may decline (answer: null, with the reason in route.explain)."++ },++ "limit": {++ "type": "integer",++ "minimum": 1,++ "maximum": 50,++ "default": 20++ },++ "cursor": {++ "type": "string",++ "maxLength": 512,++ "description": "next_cursor of the previous page (network and mine only)."++ }++ }++ },++ "search.fabric-result.v1": {++ "title": "SearchFabricResult",++ "description": "search.fabric-result@1: the answer of search.fabric.query. results come grouped by scope order (the room's own first when the caller asked for it); every web result keeps its provider, URL and date; route.explain says, step by step, what was asked, what answered, from cache or not, and what it cost. The query is never echoed: a page renders results without writing the query into its HTML (the ?q= rule).",++ "type": "object",++ "additionalProperties": false,++ "required": [++ "results",++ "groups",++ "route",++ "next_cursor"++ ],++ "properties": {++ "results": {++ "type": "array",++ "maxItems": 100,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "scope",++ "kind",++ "title",++ "url"++ ],++ "properties": {++ "scope": {++ "enum": [++ "network",++ "mine",++ "web",++ "news",++ "images",++ "video",++ "products",++ "people",++ "places",++ "code"++ ]++ },++ "kind": {++ "enum": [++ "document",++ "page"++ ],++ "description": "document: in Search's index (owner, type, id set); page: a web page (provider set)."++ },++ "title": {++ "type": "string",++ "maxLength": 300++ },++ "url": {++ "type": "string",++ "maxLength": 2048,++ "format": "uri"++ },++ "snippet": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 600,++ "description": "Plain text; never HTML."++ },++ "site": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 253++ },++ "image": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 2048++ },++ "published_at": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 40++ },++ "retrieved_at": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 40,++ "description": "When a web page was read (by the provider or the open index)."++ },++ "provider": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 40,++ "description": "page: who found it (open_index, deepseek, wikipedia, brave, …)."++ },++ "owner": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 32++ },++ "type": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 32++ },++ "id": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 200++ },++ "score": {++ "type": [++ "number",++ "null"++ ],++ "description": "Rank within its scope (higher first); not comparable across scopes."++ }++ }++ }++ },++ "groups": {++ "type": "object",++ "additionalProperties": {++ "type": "integer",++ "minimum": 0++ },++ "description": "How many results each scope gave on this page."++ },++ "answer": {++ "type": [++ "object",++ "null"++ ],++ "additionalProperties": false,++ "required": [++ "text",++ "citations",++ "label"++ ],++ "properties": {++ "text": {++ "type": "string",++ "maxLength": 2000++ },++ "citations": {++ "type": "array",++ "minItems": 1,++ "maxItems": 20,++ "items": {++ "type": "integer",++ "minimum": 1++ }++ },++ "label": {++ "const": "Written by AI from these sources"++ }++ }++ },++ "citations": {++ "type": "array",++ "maxItems": 20,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "n",++ "url",++ "title"++ ],++ "properties": {++ "n": {++ "type": "integer",++ "minimum": 1++ },++ "url": {++ "type": "string",++ "maxLength": 2048++ },++ "title": {++ "type": "string",++ "maxLength": 300++ },++ "provider": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 40++ },++ "retrieved_at": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 40++ }++ }++ }++ },++ "route": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "explain",++ "cost_usd"++ ],++ "properties": {++ "explain": {++ "type": "array",++ "maxItems": 20,++ "items": {++ "type": "object",++ "additionalProperties": false,++ "required": [++ "scope",++ "step",++ "ok"++ ],++ "properties": {++ "scope": {++ "enum": [++ "network",++ "mine",++ "web",++ "news",++ "images",++ "video",++ "products",++ "people",++ "places",++ "code"++ ]++ },++ "step": {++ "type": "string",++ "maxLength": 40,++ "description": "index, open_index, cache, deepseek, wikipedia, …"++ },++ "ok": {++ "type": "boolean"++ },++ "count": {++ "type": "integer",++ "minimum": 0++ },++ "ms": {++ "type": "integer",++ "minimum": 0++ },++ "cached": {++ "type": "boolean"++ },++ "cost_usd": {++ "type": "number",++ "minimum": 0++ },++ "skipped": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 160,++ "description": "Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down)."++ }++ }++ }++ },++ "cost_usd": {++ "type": "number",++ "minimum": 0,++ "description": "What this query cost OpenVibe (paid provider calls; cached answers cost 0)."++ }++ }++ },++ "next_cursor": {++ "type": [++ "string",++ "null"++ ],++ "maxLength": 512++ }++ }++ },"search.index-document.v1": {"title": "IndexDocument","description": "What an owning service tells OpenVibe.Search about one of its resources (roadmap §15.12, §4.2 A). The owner stays the source of truth; Search keeps a revision-ordered, permission-aware copy for discovery. A document with deleted=true is a tombstone: it removes the resource from every result and wins over any upsert with the same or an older revision.",@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Services API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Sources API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Space API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Tips API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Tools API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Trade API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.VIP API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Watch API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Wiki API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Work API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -3,8 +3,8 @@"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema","info": {"title": "OpenVibe.Zone API",-- "version": "0.224.0",-- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",++ "version": "0.225.0",++ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.","license": {"name": "MIT","identifier": "MIT"@@@ -6134,6 +6134,5275 @@ export interface SearchQueryResult {};}++/** [email protected] (owner: search) */++/**++ * search.fabric-request@1: the body of POST /api/v1/query (or the query string of GET /api/v1/query, scopes comma-separated), capability search.fabric.query. One search over several scopes, routed the cheapest way that answers (plan 2026-10-28 §4.5). network: Search's own index, permission-aware exactly as search.query.run; mine: the caller's own private documents (a signed-in person, or a service with X-OV-Subject); web: OpenVibe's open index first, then paid providers in a ladder, each result keeping its provider, date and URL. Providers never receive an account identifier. A scope the caller may not use (mine without a person; web's paid providers for an anonymous caller, who gets cached and open-index results only) is reported in route.explain, never an error. The other scopes are facets of the same indexes and are accepted for forward compatibility; v1 answers them as network results filtered by kind.++ */++export interface SearchFabricRequest {++ /**++ * What to find.++ */++ q: string;++ /**++ * Where to look; results are grouped by scope. Default: network.++ *++ * @minItems 1++ * @maxItems 10++ */++ scopes?:++ | ["network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code"]++ | [++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code"++ ]++ | [++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code"++ ]++ | [++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code"++ ]++ | [++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code"++ ]++ | [++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code"++ ]++ | [++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code"++ ]++ | [++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code"++ ]++ | [++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code"++ ]++ | [++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code"++ ];++ /**++ * Narrow the network and mine scopes (never widen what the caller may see).++ */++ filters?: {++ owner?: string;++ type?: string;++ lang?: string;++ /**++ * web: results from this host only.++ */++ site?: string;++ };++ /**++ * How recent results must be, where the source dates them.++ */++ freshness?: "any" | "day" | "week" | "month" | "year";++ /**++ * quick: indexes and caches only (no paid provider); standard: the ladder until a step answers; deep: every step, merged.++ */++ depth?: "quick" | "standard" | "deep";++ /**++ * Ask for a short cited answer written by AI from the results. Never without citations; labelled AI. A deployment may decline (answer: null, with the reason in route.explain).++ */++ answer?: boolean;++ limit?: number;++ /**++ * next_cursor of the previous page (network and mine only).++ */++ cursor?: string;++}++++/** [email protected] (owner: search) */++/**++ * search.fabric-result@1: the answer of search.fabric.query. results come grouped by scope order (the room's own first when the caller asked for it); every web result keeps its provider, URL and date; route.explain says, step by step, what was asked, what answered, from cache or not, and what it cost. The query is never echoed: a page renders results without writing the query into its HTML (the ?q= rule).++ */++export interface SearchFabricResult {++ /**++ * @maxItems 100++ */++ results: {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * document: in Search's index (owner, type, id set); page: a web page (provider set).++ */++ kind: "document" | "page";++ title: string;++ url: string;++ /**++ * Plain text; never HTML.++ */++ snippet?: string | null;++ site?: string | null;++ image?: string | null;++ published_at?: string | null;++ /**++ * When a web page was read (by the provider or the open index).++ */++ retrieved_at?: string | null;++ /**++ * page: who found it (open_index, deepseek, wikipedia, brave, …).++ */++ provider?: string | null;++ owner?: string | null;++ type?: string | null;++ id?: string | null;++ /**++ * Rank within its scope (higher first); not comparable across scopes.++ */++ score?: number | null;++ }[];++ /**++ * How many results each scope gave on this page.++ */++ groups: {++ [k: string]: number | undefined;++ };++ answer?: {++ text: string;++ /**++ * @minItems 1++ * @maxItems 20++ */++ citations:++ | [number]++ | [number, number]++ | [number, number, number]++ | [number, number, number, number]++ | [number, number, number, number, number]++ | [number, number, number, number, number, number]++ | [number, number, number, number, number, number, number]++ | [number, number, number, number, number, number, number, number]++ | [number, number, number, number, number, number, number, number, number]++ | [number, number, number, number, number, number, number, number, number, number]++ | [number, number, number, number, number, number, number, number, number, number, number]++ | [number, number, number, number, number, number, number, number, number, number, number, number]++ | [number, number, number, number, number, number, number, number, number, number, number, number, number]++ | [number, number, number, number, number, number, number, number, number, number, number, number, number, number]++ | [++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number++ ]++ | [++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number++ ]++ | [++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number++ ]++ | [++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number++ ]++ | [++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number++ ]++ | [++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number,++ number++ ];++ label: "Written by AI from these sources";++ } | null;++ /**++ * @maxItems 20++ */++ citations?:++ | []++ | [++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ }++ ]++ | [++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ }++ ]++ | [++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ }++ ]++ | [++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ }++ ]++ | [++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ }++ ]++ | [++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ }++ ]++ | [++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ }++ ]++ | [++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ }++ ]++ | [++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ }++ ]++ | [++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ }++ ]++ | [++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ }++ ]++ | [++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ }++ ]++ | [++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ }++ ]++ | [++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ }++ ]++ | [++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ }++ ]++ | [++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ }++ ]++ | [++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ }++ ]++ | [++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ }++ ]++ | [++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ }++ ]++ | [++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ },++ {++ n: number;++ url: string;++ title: string;++ provider?: string | null;++ retrieved_at?: string | null;++ }++ ];++ route: {++ /**++ * @maxItems 20++ */++ explain:++ | []++ | [++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ }++ ]++ | [++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ }++ ]++ | [++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ }++ ]++ | [++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ }++ ]++ | [++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ }++ ]++ | [++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ }++ ]++ | [++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ }++ ]++ | [++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ }++ ]++ | [++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ }++ ]++ | [++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ }++ ]++ | [++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ }++ ]++ | [++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ }++ ]++ | [++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ }++ ]++ | [++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ }++ ]++ | [++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ }++ ]++ | [++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ }++ ]++ | [++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ }++ ]++ | [++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ }++ ]++ | [++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ }++ ]++ | [++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ },++ {++ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";++ /**++ * index, open_index, cache, deepseek, wikipedia, …++ */++ step: string;++ ok: boolean;++ count?: number;++ ms?: number;++ cached?: boolean;++ cost_usd?: number;++ /**++ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).++ */++ skipped?: string | null;++ }++ ];++ /**++ * What this query cost OpenVibe (paid provider calls; cached answers cost 0).++ */++ cost_usd: number;++ };++ next_cursor: string | null;++}++++/** [email protected] (owner: search) */++/**++ * search.provider-offer@1: one web search provider as the Search Fabric's ladder and Route see it (GET /api/v1/query/providers, capability search.fabric.query): what it covers, what it costs, whether it is usable now and how it has answered. Prices are the vendor's published ones as of checked_at; nothing here is a secret.++ */++export interface SearchProviderOffer {++ provider: string;++ name?: string;++ /**++ * @minItems 1++ */++ scopes: [++ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",++ ...("network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code")[]++ ];++ price_usd_per_call: number;++ /**++ * Searches its own crawl rather than reselling another engine's.++ */++ independent_index?: boolean;++ /**++ * Configured and not standing down (balance, key, rate limit, daily cap).++ */++ available: boolean;++ reason?: string | null;++ daily_cap?: number | null;++ used_today?: number | null;++ latency_ms_p50?: number | null;++ /**++ * Share of calls in the last day that returned at least one result.++ */++ answered_rate?: number | null;++ terms_url?: string | null;++ checked_at: string;++}++/** [email protected] (owner: search) *//*** search.write-result@1: the answer of PUT /api/v1/documents/:owner/:type/:id (search.document.write). applied: stored (or a tombstone recorded); unchanged: the same revision with the same content. A revision older than the stored one is a 409 problem search.stale_revision; the same revision with different content is 409 search.revision_conflict.nnew file mode 100644@@@ -0,0 +1,23 @@++{++ "id": "search.fabric.query",++ "version": "1.0",++ "owner": "search",++ "status": "active",++ "visibility": "public",++ "description": "One search over several scopes (plan 2026-10-28 \u00a74.5, the Search Fabric): network (Search's index, permission-aware as search.query.run), mine (the person's own private documents), web (OpenVibe's open index, then paid providers in a ladder, cached), with route.explain saying what answered and what it cost. Anonymous callers get network results and web results from the open index and the cache; a signed-in person or a first-party service (X-OV-Subject for mine) also reaches paid providers within OpenVibe's daily caps. Providers never receive an account identifier. The same operation is the SDK's createSearchClient().query() and the MCP tool openvibe.search.",++ "permissions": [++ "search:read"++ ],++ "resourceConstraints": [++ "none"++ ],++ "quotaClass": "search-query",++ "events": [],++ "implementedBy": [++ "POST /api/v1/query",++ "GET /api/v1/query",++ "GET /api/v1/query/providers"++ ],++ "inputSchema": "search.fabric-request@1",++ "outputSchema": "search.fabric-result@1"++}@@@ -21,6 +21,7 @@},"capabilities": ["search.document.write",++ "search.fabric.query","search.query.delegate","search.query.run"],@@@ -73,7 +74,7 @@],"window": "automatic only while ovhost waits for readiness after the restart (30 s in host.example.json); manual afterwards, as long as no blocker applies","blockers": {-- "none": "the schema code only adds (CREATE … IF NOT EXISTS, ADD COLUMN; no DROP, RENAME or table rebuild), which an older release ignores"++ "none": "the schema code only adds (CREATE \u2026 IF NOT EXISTS, ADD COLUMN; no DROP, RENAME or table rebuild), which an older release ignores"}},"contracts": {@@@ -1,6 +1,6 @@{"name": "openvibe-contracts",-- "version": "0.224.0",++ "version": "0.225.0","description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.","main": "index.js","types": "generated/typescript/index.d.ts",
@@ -4,6 +4,40 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
@@ -4,6 +4,40 @@ All notable changes to `openvibe-contracts`. Releases are git tags (`vX.Y.Z`) th
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
from `https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/<tag>`. Before v0.30.0,
the notes were in the tag and commit messages (`git tag -n1`).
the notes were in the tag and commit messages (`git tag -n1`).
+## 0.225.0 — 2026-10-28
+
+- **The Search Fabric** (plan 2026-10-28 §4.5; the owner, 10-28: "a shared sdk/api enabled multi purpose search system
+ for OpenVibe to reuse across sites and more"): one search over several scopes, routed the cheapest way that answers.
+ - **`search.fabric.query`** (public, owned by `search`): `POST /api/v1/query` (or `GET /api/v1/query?q=&scopes=`), and
+ `GET /api/v1/query/providers`. It is the SDK's `createSearchClient().query()` and the MCP tool `openvibe.search`.
+ - **`search.fabric-request@1`:**
+ - `q` and `scopes`: `network`, `mine`, `web`, and `news`, `images`, `video`, `products`, `people`, `places`,
+ `code` (accepted now; v1 answers them as network results by kind);
+ - `filters` (owner, type, lang, site);
+ - `freshness`;
+ - `depth`: `quick` reads only the indexes and caches, `standard` climbs the provider ladder until a step
+ answers, `deep` asks every step;
+ - `answer`, `limit` and `cursor`.
+ - **`search.fabric-result@1`:**
+ - `results`, each with its scope and kind (a document in Search's index, or a web page with its provider,
+ URL, date and when it was read);
+ - `groups` (counts per scope) and `citations`;
+ - an optional `answer`. It is labelled "Written by AI from these sources" and is never without citations.
+ - `route.explain`: step by step, what was asked, what answered, from the cache or not, why a step was
+ skipped, and what it cost.
+
+ The query is never echoed (the `?q=` rule).
+ - **`search.provider-offer@1`:** a web provider as the ladder and Route see it. It gives the scopes, the price
+ per call, whether the provider has its own index, availability (balance, key, rate limit, daily cap),
+ latency, answered rate and terms.
+ - **Who may use what:**
+ - anonymous callers get network results, plus web results from the open index and the cache;
+ - a signed-in person, or a first-party service, also reaches the paid providers within OpenVibe's daily caps;
+ - `mine` needs a person;
+ - providers never receive an account identifier.
+
+ Fixtures, valid and invalid, for all three schemas.
+
## 0.224.0 — 2026-10-28
## 0.224.0 — 2026-10-28
- **A `crawl` source type for OpenVibe.Sources** (the owner, 2026-10-28: "aggregate all websites and select deals on all
- **A `crawl` source type for OpenVibe.Sources** (the owner, 2026-10-28: "aggregate all websites and select deals on all
@@ -266,6 +266,33 @@
@@ -266,6 +266,33 @@
"compatibility": "backward",
"compatibility": "backward",
"status": "active"
"status": "active"
},
},
+ {
+ "id": "search.fabric-request",
+ "version": "1.0.0",
+ "owner": "search",
+ "schema": "search/fabric-request.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "search.fabric-result",
+ "version": "1.0.0",
+ "owner": "search",
+ "schema": "search/fabric-result.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
+ {
+ "id": "search.provider-offer",
+ "version": "1.0.0",
+ "owner": "search",
+ "schema": "search/provider-offer.v1.json",
+ "visibility": "public",
+ "compatibility": "backward",
+ "status": "active"
+ },
{
{
"id": "search.write-result",
"id": "search.write-result",
"version": "1.0.0",
"version": "1.0.0",
new file mode 100644
new file mode 100644
@@ -0,0 +1,104 @@
@@ -0,0 +1,104 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/search/fabric-request.v1.json",
+ "title": "SearchFabricRequest",
+ "description": "search.fabric-request@1: the body of POST /api/v1/query (or the query string of GET /api/v1/query, scopes comma-separated), capability search.fabric.query. One search over several scopes, routed the cheapest way that answers (plan 2026-10-28 \u00a74.5). network: Search's own index, permission-aware exactly as search.query.run; mine: the caller's own private documents (a signed-in person, or a service with X-OV-Subject); web: OpenVibe's open index first, then paid providers in a ladder, each result keeping its provider, date and URL. Providers never receive an account identifier. A scope the caller may not use (mine without a person; web's paid providers for an anonymous caller, who gets cached and open-index results only) is reported in route.explain, never an error. The other scopes are facets of the same indexes and are accepted for forward compatibility; v1 answers them as network results filtered by kind.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "q"
+ ],
+ "properties": {
+ "q": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 200,
+ "description": "What to find."
+ },
+ "scopes": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 10,
+ "uniqueItems": true,
+ "items": {
+ "enum": [
+ "network",
+ "mine",
+ "web",
+ "news",
+ "images",
+ "video",
+ "products",
+ "people",
+ "places",
+ "code"
+ ]
+ },
+ "default": [
+ "network"
+ ],
+ "description": "Where to look; results are grouped by scope. Default: network."
+ },
+ "filters": {
+ "type": "object",
+ "additionalProperties": false,
+ "description": "Narrow the network and mine scopes (never widen what the caller may see).",
+ "properties": {
+ "owner": {
+ "type": "string",
+ "pattern": "^[a-z][a-z0-9_-]{0,31}$"
+ },
+ "type": {
+ "type": "string",
+ "pattern": "^[a-z][a-z0-9_-]{0,31}$"
+ },
+ "lang": {
+ "type": "string",
+ "pattern": "^[a-zA-Z]{2,3}(-[A-Za-z0-9]{2,8})*$"
+ },
+ "site": {
+ "type": "string",
+ "maxLength": 253,
+ "pattern": "^[a-z0-9.-]+$",
+ "description": "web: results from this host only."
+ }
+ }
+ },
+ "freshness": {
+ "enum": [
+ "any",
+ "day",
+ "week",
+ "month",
+ "year"
+ ],
+ "default": "any",
+ "description": "How recent results must be, where the source dates them."
+ },
+ "depth": {
+ "enum": [
+ "quick",
+ "standard",
+ "deep"
+ ],
+ "default": "standard",
+ "description": "quick: indexes and caches only (no paid provider); standard: the ladder until a step answers; deep: every step, merged."
+ },
+ "answer": {
+ "type": "boolean",
+ "default": false,
+ "description": "Ask for a short cited answer written by AI from the results. Never without citations; labelled AI. A deployment may decline (answer: null, with the reason in route.explain)."
+ },
+ "limit": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 50,
+ "default": 20
+ },
+ "cursor": {
+ "type": "string",
+ "maxLength": 512,
+ "description": "next_cursor of the previous page (network and mine only)."
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,296 @@
@@ -0,0 +1,296 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/search/fabric-result.v1.json",
+ "title": "SearchFabricResult",
+ "description": "search.fabric-result@1: the answer of search.fabric.query. results come grouped by scope order (the room's own first when the caller asked for it); every web result keeps its provider, URL and date; route.explain says, step by step, what was asked, what answered, from cache or not, and what it cost. The query is never echoed: a page renders results without writing the query into its HTML (the ?q= rule).",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "results",
+ "groups",
+ "route",
+ "next_cursor"
+ ],
+ "properties": {
+ "results": {
+ "type": "array",
+ "maxItems": 100,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "scope",
+ "kind",
+ "title",
+ "url"
+ ],
+ "properties": {
+ "scope": {
+ "enum": [
+ "network",
+ "mine",
+ "web",
+ "news",
+ "images",
+ "video",
+ "products",
+ "people",
+ "places",
+ "code"
+ ]
+ },
+ "kind": {
+ "enum": [
+ "document",
+ "page"
+ ],
+ "description": "document: in Search's index (owner, type, id set); page: a web page (provider set)."
+ },
+ "title": {
+ "type": "string",
+ "maxLength": 300
+ },
+ "url": {
+ "type": "string",
+ "maxLength": 2048,
+ "format": "uri"
+ },
+ "snippet": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 600,
+ "description": "Plain text; never HTML."
+ },
+ "site": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 253
+ },
+ "image": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 2048
+ },
+ "published_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 40
+ },
+ "retrieved_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 40,
+ "description": "When a web page was read (by the provider or the open index)."
+ },
+ "provider": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 40,
+ "description": "page: who found it (open_index, deepseek, wikipedia, brave, \u2026)."
+ },
+ "owner": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 32
+ },
+ "type": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 32
+ },
+ "id": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 200
+ },
+ "score": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "description": "Rank within its scope (higher first); not comparable across scopes."
+ }
+ }
+ }
+ },
+ "groups": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "description": "How many results each scope gave on this page."
+ },
+ "answer": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "required": [
+ "text",
+ "citations",
+ "label"
+ ],
+ "properties": {
+ "text": {
+ "type": "string",
+ "maxLength": 2000
+ },
+ "citations": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 20,
+ "items": {
+ "type": "integer",
+ "minimum": 1
+ }
+ },
+ "label": {
+ "const": "Written by AI from these sources"
+ }
+ }
+ },
+ "citations": {
+ "type": "array",
+ "maxItems": 20,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "n",
+ "url",
+ "title"
+ ],
+ "properties": {
+ "n": {
+ "type": "integer",
+ "minimum": 1
+ },
+ "url": {
+ "type": "string",
+ "maxLength": 2048
+ },
+ "title": {
+ "type": "string",
+ "maxLength": 300
+ },
+ "provider": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 40
+ },
+ "retrieved_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 40
+ }
+ }
+ }
+ },
+ "route": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "explain",
+ "cost_usd"
+ ],
+ "properties": {
+ "explain": {
+ "type": "array",
+ "maxItems": 20,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "scope",
+ "step",
+ "ok"
+ ],
+ "properties": {
+ "scope": {
+ "enum": [
+ "network",
+ "mine",
+ "web",
+ "news",
+ "images",
+ "video",
+ "products",
+ "people",
+ "places",
+ "code"
+ ]
+ },
+ "step": {
+ "type": "string",
+ "maxLength": 40,
+ "description": "index, open_index, cache, deepseek, wikipedia, \u2026"
+ },
+ "ok": {
+ "type": "boolean"
+ },
+ "count": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "ms": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "cached": {
+ "type": "boolean"
+ },
+ "cost_usd": {
+ "type": "number",
+ "minimum": 0
+ },
+ "skipped": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 160,
+ "description": "Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down)."
+ }
+ }
+ }
+ },
+ "cost_usd": {
+ "type": "number",
+ "minimum": 0,
+ "description": "What this query cost OpenVibe (paid provider calls; cached answers cost 0)."
+ }
+ }
+ },
+ "next_cursor": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 512
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,103 @@
@@ -0,0 +1,103 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/search/provider-offer.v1.json",
+ "title": "SearchProviderOffer",
+ "description": "search.provider-offer@1: one web search provider as the Search Fabric's ladder and Route see it (GET /api/v1/query/providers, capability search.fabric.query): what it covers, what it costs, whether it is usable now and how it has answered. Prices are the vendor's published ones as of checked_at; nothing here is a secret.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "provider",
+ "scopes",
+ "price_usd_per_call",
+ "available",
+ "checked_at"
+ ],
+ "properties": {
+ "provider": {
+ "type": "string",
+ "pattern": "^[a-z][a-z0-9_]{1,39}$"
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 80
+ },
+ "scopes": {
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "enum": [
+ "network",
+ "mine",
+ "web",
+ "news",
+ "images",
+ "video",
+ "products",
+ "people",
+ "places",
+ "code"
+ ]
+ }
+ },
+ "price_usd_per_call": {
+ "type": "number",
+ "minimum": 0
+ },
+ "independent_index": {
+ "type": "boolean",
+ "description": "Searches its own crawl rather than reselling another engine's."
+ },
+ "available": {
+ "type": "boolean",
+ "description": "Configured and not standing down (balance, key, rate limit, daily cap)."
+ },
+ "reason": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 160
+ },
+ "daily_cap": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "used_today": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "latency_ms_p50": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "answered_rate": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0,
+ "maximum": 1,
+ "description": "Share of calls in the last day that returned at least one result."
+ },
+ "terms_url": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 2048
+ },
+ "checked_at": {
+ "type": "string",
+ "maxLength": 40
+ }
+ }
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
+{
+ "q": ""
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
+{
+ "q": "x",
+ "limit": 500
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
+{
+ "q": "x",
+ "scopes": [
+ "everything"
+ ]
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
+{
+ "q": "notes",
+ "scopes": [
+ "mine"
+ ],
+ "filters": {
+ "owner": "community",
+ "type": "paste"
+ },
+ "answer": false,
+ "depth": "quick"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
+{
+ "q": "lofi streams"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
+{
+ "q": "surf_utopia world record",
+ "scopes": [
+ "network",
+ "web"
+ ],
+ "freshness": "month",
+ "depth": "standard",
+ "limit": 10
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,14 @@
@@ -0,0 +1,14 @@
+{
+ "results": [],
+ "groups": {},
+ "answer": {
+ "text": "Trust me.",
+ "citations": [],
+ "label": "Written by AI from these sources"
+ },
+ "route": {
+ "explain": [],
+ "cost_usd": 0
+ },
+ "next_cursor": null
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,16 @@
@@ -0,0 +1,16 @@
+{
+ "results": [
+ {
+ "scope": "web",
+ "kind": "html",
+ "title": "x",
+ "url": "https://x.org/"
+ }
+ ],
+ "groups": {},
+ "route": {
+ "explain": [],
+ "cost_usd": 0
+ },
+ "next_cursor": null
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,88 @@
@@ -0,0 +1,88 @@
+{
+ "results": [
+ {
+ "scope": "network",
+ "kind": "document",
+ "title": "surf_utopia in 1:02.4",
+ "url": "https://openvibe.live/clips/482",
+ "snippet": "A clean line through every stage.",
+ "site": "openvibe.live",
+ "image": null,
+ "published_at": "2026-10-27T21:04:00Z",
+ "retrieved_at": null,
+ "provider": null,
+ "owner": "media-hub",
+ "type": "clip",
+ "id": "482",
+ "score": 0.82
+ },
+ {
+ "scope": "web",
+ "kind": "page",
+ "title": "Surf (Counter-Strike) - Wikipedia",
+ "url": "https://en.wikipedia.org/wiki/Surf_(video_game_mode)",
+ "snippet": "Surfing is a game mode in Counter-Strike\u2026",
+ "site": "en.wikipedia.org",
+ "image": null,
+ "published_at": null,
+ "retrieved_at": "2026-10-28T11:20:00Z",
+ "provider": "wikipedia",
+ "owner": null,
+ "type": null,
+ "id": null,
+ "score": 0.61
+ }
+ ],
+ "groups": {
+ "network": 1,
+ "web": 1
+ },
+ "answer": null,
+ "citations": [
+ {
+ "n": 1,
+ "url": "https://en.wikipedia.org/wiki/Surf_(video_game_mode)",
+ "title": "Surf (Counter-Strike) - Wikipedia",
+ "provider": "wikipedia",
+ "retrieved_at": "2026-10-28T11:20:00Z"
+ }
+ ],
+ "route": {
+ "explain": [
+ {
+ "scope": "network",
+ "step": "index",
+ "ok": true,
+ "count": 1,
+ "ms": 18,
+ "cached": false,
+ "cost_usd": 0
+ },
+ {
+ "scope": "web",
+ "step": "open_index",
+ "ok": true,
+ "count": 0,
+ "ms": 9,
+ "cost_usd": 0
+ },
+ {
+ "scope": "web",
+ "step": "deepseek",
+ "ok": true,
+ "count": 1,
+ "ms": 1420,
+ "cached": true,
+ "cost_usd": 0
+ },
+ {
+ "scope": "web",
+ "step": "brave",
+ "ok": false,
+ "skipped": "an earlier step answered"
+ }
+ ],
+ "cost_usd": 0
+ },
+ "next_cursor": null
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,43 @@
@@ -0,0 +1,43 @@
+{
+ "results": [
+ {
+ "scope": "web",
+ "kind": "page",
+ "title": "A",
+ "url": "https://example.org/a",
+ "provider": "deepseek"
+ }
+ ],
+ "groups": {
+ "web": 1
+ },
+ "answer": {
+ "text": "Surf maps are ramps you slide along [1].",
+ "citations": [
+ 1
+ ],
+ "label": "Written by AI from these sources"
+ },
+ "citations": [
+ {
+ "n": 1,
+ "url": "https://example.org/a",
+ "title": "A",
+ "provider": "deepseek",
+ "retrieved_at": "2026-10-28T11:20:00Z"
+ }
+ ],
+ "route": {
+ "explain": [
+ {
+ "scope": "web",
+ "step": "deepseek",
+ "ok": true,
+ "count": 1,
+ "cost_usd": 0.00075
+ }
+ ],
+ "cost_usd": 0.00075
+ },
+ "next_cursor": null
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
+{
+ "provider": "x",
+ "scopes": [
+ "web"
+ ],
+ "price_usd_per_call": -1,
+ "available": true,
+ "checked_at": "2026-10-28T11:00:00Z"
+}
new file mode 100644
new file mode 100644
@@ -0,0 +1,18 @@
@@ -0,0 +1,18 @@
+{
+ "provider": "deepseek",
+ "name": "DeepSeek Search",
+ "scopes": [
+ "web",
+ "news"
+ ],
+ "price_usd_per_call": 0.00075,
+ "independent_index": false,
+ "available": true,
+ "reason": null,
+ "daily_cap": 1500,
+ "used_today": 212,
+ "latency_ms_p50": 1380,
+ "answered_rate": 0.97,
+ "terms_url": "https://api-docs.deepseek.com/guides/search",
+ "checked_at": "2026-10-28T11:00:00Z"
+}
@@ -3664,6 +3664,524 @@
@@ -3664,6 +3664,524 @@
}
}
}
}
},
},
+ "search.fabric-request": {
+ "version": "1.0.0",
+ "owner": "search",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/search/fabric-request.v1.json",
+ "title": "SearchFabricRequest",
+ "description": "search.fabric-request@1: the body of POST /api/v1/query (or the query string of GET /api/v1/query, scopes comma-separated), capability search.fabric.query. One search over several scopes, routed the cheapest way that answers (plan 2026-10-28 §4.5). network: Search's own index, permission-aware exactly as search.query.run; mine: the caller's own private documents (a signed-in person, or a service with X-OV-Subject); web: OpenVibe's open index first, then paid providers in a ladder, each result keeping its provider, date and URL. Providers never receive an account identifier. A scope the caller may not use (mine without a person; web's paid providers for an anonymous caller, who gets cached and open-index results only) is reported in route.explain, never an error. The other scopes are facets of the same indexes and are accepted for forward compatibility; v1 answers them as network results filtered by kind.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "q"
+ ],
+ "properties": {
+ "q": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 200,
+ "description": "What to find."
+ },
+ "scopes": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 10,
+ "uniqueItems": true,
+ "items": {
+ "enum": [
+ "network",
+ "mine",
+ "web",
+ "news",
+ "images",
+ "video",
+ "products",
+ "people",
+ "places",
+ "code"
+ ]
+ },
+ "default": [
+ "network"
+ ],
+ "description": "Where to look; results are grouped by scope. Default: network."
+ },
+ "filters": {
+ "type": "object",
+ "additionalProperties": false,
+ "description": "Narrow the network and mine scopes (never widen what the caller may see).",
+ "properties": {
+ "owner": {
+ "type": "string",
+ "pattern": "^[a-z][a-z0-9_-]{0,31}$"
+ },
+ "type": {
+ "type": "string",
+ "pattern": "^[a-z][a-z0-9_-]{0,31}$"
+ },
+ "lang": {
+ "type": "string",
+ "pattern": "^[a-zA-Z]{2,3}(-[A-Za-z0-9]{2,8})*$"
+ },
+ "site": {
+ "type": "string",
+ "maxLength": 253,
+ "pattern": "^[a-z0-9.-]+$",
+ "description": "web: results from this host only."
+ }
+ }
+ },
+ "freshness": {
+ "enum": [
+ "any",
+ "day",
+ "week",
+ "month",
+ "year"
+ ],
+ "default": "any",
+ "description": "How recent results must be, where the source dates them."
+ },
+ "depth": {
+ "enum": [
+ "quick",
+ "standard",
+ "deep"
+ ],
+ "default": "standard",
+ "description": "quick: indexes and caches only (no paid provider); standard: the ladder until a step answers; deep: every step, merged."
+ },
+ "answer": {
+ "type": "boolean",
+ "default": false,
+ "description": "Ask for a short cited answer written by AI from the results. Never without citations; labelled AI. A deployment may decline (answer: null, with the reason in route.explain)."
+ },
+ "limit": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 50,
+ "default": 20
+ },
+ "cursor": {
+ "type": "string",
+ "maxLength": 512,
+ "description": "next_cursor of the previous page (network and mine only)."
+ }
+ }
+ }
+ },
+ "search.fabric-result": {
+ "version": "1.0.0",
+ "owner": "search",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/search/fabric-result.v1.json",
+ "title": "SearchFabricResult",
+ "description": "search.fabric-result@1: the answer of search.fabric.query. results come grouped by scope order (the room's own first when the caller asked for it); every web result keeps its provider, URL and date; route.explain says, step by step, what was asked, what answered, from cache or not, and what it cost. The query is never echoed: a page renders results without writing the query into its HTML (the ?q= rule).",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "results",
+ "groups",
+ "route",
+ "next_cursor"
+ ],
+ "properties": {
+ "results": {
+ "type": "array",
+ "maxItems": 100,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "scope",
+ "kind",
+ "title",
+ "url"
+ ],
+ "properties": {
+ "scope": {
+ "enum": [
+ "network",
+ "mine",
+ "web",
+ "news",
+ "images",
+ "video",
+ "products",
+ "people",
+ "places",
+ "code"
+ ]
+ },
+ "kind": {
+ "enum": [
+ "document",
+ "page"
+ ],
+ "description": "document: in Search's index (owner, type, id set); page: a web page (provider set)."
+ },
+ "title": {
+ "type": "string",
+ "maxLength": 300
+ },
+ "url": {
+ "type": "string",
+ "maxLength": 2048,
+ "format": "uri"
+ },
+ "snippet": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 600,
+ "description": "Plain text; never HTML."
+ },
+ "site": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 253
+ },
+ "image": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 2048
+ },
+ "published_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 40
+ },
+ "retrieved_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 40,
+ "description": "When a web page was read (by the provider or the open index)."
+ },
+ "provider": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 40,
+ "description": "page: who found it (open_index, deepseek, wikipedia, brave, …)."
+ },
+ "owner": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 32
+ },
+ "type": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 32
+ },
+ "id": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 200
+ },
+ "score": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "description": "Rank within its scope (higher first); not comparable across scopes."
+ }
+ }
+ }
+ },
+ "groups": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "description": "How many results each scope gave on this page."
+ },
+ "answer": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "required": [
+ "text",
+ "citations",
+ "label"
+ ],
+ "properties": {
+ "text": {
+ "type": "string",
+ "maxLength": 2000
+ },
+ "citations": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 20,
+ "items": {
+ "type": "integer",
+ "minimum": 1
+ }
+ },
+ "label": {
+ "const": "Written by AI from these sources"
+ }
+ }
+ },
+ "citations": {
+ "type": "array",
+ "maxItems": 20,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "n",
+ "url",
+ "title"
+ ],
+ "properties": {
+ "n": {
+ "type": "integer",
+ "minimum": 1
+ },
+ "url": {
+ "type": "string",
+ "maxLength": 2048
+ },
+ "title": {
+ "type": "string",
+ "maxLength": 300
+ },
+ "provider": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 40
+ },
+ "retrieved_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 40
+ }
+ }
+ }
+ },
+ "route": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "explain",
+ "cost_usd"
+ ],
+ "properties": {
+ "explain": {
+ "type": "array",
+ "maxItems": 20,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "scope",
+ "step",
+ "ok"
+ ],
+ "properties": {
+ "scope": {
+ "enum": [
+ "network",
+ "mine",
+ "web",
+ "news",
+ "images",
+ "video",
+ "products",
+ "people",
+ "places",
+ "code"
+ ]
+ },
+ "step": {
+ "type": "string",
+ "maxLength": 40,
+ "description": "index, open_index, cache, deepseek, wikipedia, …"
+ },
+ "ok": {
+ "type": "boolean"
+ },
+ "count": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "ms": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "cached": {
+ "type": "boolean"
+ },
+ "cost_usd": {
+ "type": "number",
+ "minimum": 0
+ },
+ "skipped": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 160,
+ "description": "Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down)."
+ }
+ }
+ }
+ },
+ "cost_usd": {
+ "type": "number",
+ "minimum": 0,
+ "description": "What this query cost OpenVibe (paid provider calls; cached answers cost 0)."
+ }
+ }
+ },
+ "next_cursor": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 512
+ }
+ }
+ }
+ },
+ "search.provider-offer": {
+ "version": "1.0.0",
+ "owner": "search",
+ "status": "active",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://openvibe.network/contracts/search/provider-offer.v1.json",
+ "title": "SearchProviderOffer",
+ "description": "search.provider-offer@1: one web search provider as the Search Fabric's ladder and Route see it (GET /api/v1/query/providers, capability search.fabric.query): what it covers, what it costs, whether it is usable now and how it has answered. Prices are the vendor's published ones as of checked_at; nothing here is a secret.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "provider",
+ "scopes",
+ "price_usd_per_call",
+ "available",
+ "checked_at"
+ ],
+ "properties": {
+ "provider": {
+ "type": "string",
+ "pattern": "^[a-z][a-z0-9_]{1,39}$"
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 80
+ },
+ "scopes": {
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "enum": [
+ "network",
+ "mine",
+ "web",
+ "news",
+ "images",
+ "video",
+ "products",
+ "people",
+ "places",
+ "code"
+ ]
+ }
+ },
+ "price_usd_per_call": {
+ "type": "number",
+ "minimum": 0
+ },
+ "independent_index": {
+ "type": "boolean",
+ "description": "Searches its own crawl rather than reselling another engine's."
+ },
+ "available": {
+ "type": "boolean",
+ "description": "Configured and not standing down (balance, key, rate limit, daily cap)."
+ },
+ "reason": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 160
+ },
+ "daily_cap": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "used_today": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "latency_ms_p50": {
+ "type": [
+ "integer",
+ "null"
+ ],
+ "minimum": 0
+ },
+ "answered_rate": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "minimum": 0,
+ "maximum": 1,
+ "description": "Share of calls in the last day that returned at least one result."
+ },
+ "terms_url": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 2048
+ },
+ "checked_at": {
+ "type": "string",
+ "maxLength": 40
+ }
+ }
+ }
+ },
"search.write-result": {
"search.write-result": {
"version": "1.0.0",
"version": "1.0.0",
"owner": "search",
"owner": "search",
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Actor API",
"title": "OpenVibe.Actor API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Actor as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.AI API",
"title": "OpenVibe.AI API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.AI as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Billing API",
"title": "OpenVibe.Billing API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Billing as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Blog API",
"title": "OpenVibe.Blog API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Blog as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Bot API",
"title": "OpenVibe.Bot API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Bot as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Chat API",
"title": "OpenVibe.Chat API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Chat as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Codes API",
"title": "OpenVibe.Codes API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Codes as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Community API",
"title": "OpenVibe.Community API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Community as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Coupons API",
"title": "OpenVibe.Coupons API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Coupons as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Deals API",
"title": "OpenVibe.Deals API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Deals as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Events API",
"title": "OpenVibe.Events API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Events as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Food API",
"title": "OpenVibe.Food API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Food as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Games API",
"title": "OpenVibe.Games API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Games as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Host API",
"title": "OpenVibe.Host API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Host as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -180,8 +180,8 @@
@@ -180,8 +180,8 @@
"service": "search",
"service": "search",
"name": "OpenVibe.Search",
"name": "OpenVibe.Search",
"origin": "https://search.openvibe.network",
"origin": "https://search.openvibe.network",
- "operations": 8,
- "capabilities": 3
+ "operations": 11,
+ "capabilities": 4
},
},
{
{
"service": "services",
"service": "services",
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Inventory API",
"title": "OpenVibe.Inventory API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Inventory as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Live API",
"title": "OpenVibe.Live API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Live as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.MediaHub API",
"title": "OpenVibe.MediaHub API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.MediaHub as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Media API",
"title": "OpenVibe.Media API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Media as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Network API",
"title": "OpenVibe.Network API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Network as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.News API",
"title": "OpenVibe.News API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.News as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenRestream API",
"title": "OpenRestream API",
- "version": "0.224.0",
- "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenRestream as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Play API",
"title": "OpenVibe.Play API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Play as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Quest API",
"title": "OpenVibe.Quest API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Quest as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Reviews API",
"title": "OpenVibe.Reviews API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Reviews as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Run API",
"title": "OpenVibe.Run API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Run as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Search API",
"title": "OpenVibe.Search API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Search as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -502,6 +502,438 @@
@@ -502,6 +502,438 @@
}
}
}
}
},
},
+ "/api/v1/query": {
+ "get": {
+ "operationId": "get_api_v1_query",
+ "summary": "One search over several scopes (plan 2026-10-28 §4.5, the Search Fabric): network (Search's index, permission-aware as search.query.run), mine (the person's own private documents), web (OpenVibe's ope",
+ "description": "**search.fabric.query** (public): One search over several scopes (plan 2026-10-28 §4.5, the Search Fabric): network (Search's index, permission-aware as search.query.run), mine (the person's own private documents), web (OpenVibe's open index, then paid providers in a ladder, cached), with route.explain saying what answered and what it cost. Anonymous callers get network results and web results from the open index and the cache; a signed-in person or a first-party service (X-OV-Subject for mine) also reaches paid providers within OpenVibe's daily caps. Providers never receive an account identifier. The same operation is the SDK's createSearchClient().query() and the MCP tool openvibe.search.",
+ "tags": [
+ "search.fabric"
+ ],
+ "x-openvibe-capabilities": [
+ "search.fabric.query"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "search-query",
+ "security": [
+ {
+ "openvibeToken": [
+ "search.fabric.query"
+ ]
+ }
+ ],
+ "x-openvibe-input": {
+ "$ref": "#/components/schemas/search.fabric-request.v1"
+ },
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 200,
+ "description": "What to find."
+ },
+ "description": "What to find."
+ },
+ {
+ "name": "scopes",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 10,
+ "uniqueItems": true,
+ "items": {
+ "enum": [
+ "network",
+ "mine",
+ "web",
+ "news",
+ "images",
+ "video",
+ "products",
+ "people",
+ "places",
+ "code"
+ ]
+ },
+ "default": [
+ "network"
+ ],
+ "description": "Where to look; results are grouped by scope. Default: network."
+ },
+ "description": "Where to look; results are grouped by scope. Default: network."
+ },
+ {
+ "name": "filters",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "object",
+ "additionalProperties": false,
+ "description": "Narrow the network and mine scopes (never widen what the caller may see).",
+ "properties": {
+ "owner": {
+ "type": "string",
+ "pattern": "^[a-z][a-z0-9_-]{0,31}$"
+ },
+ "type": {
+ "type": "string",
+ "pattern": "^[a-z][a-z0-9_-]{0,31}$"
+ },
+ "lang": {
+ "type": "string",
+ "pattern": "^[a-zA-Z]{2,3}(-[A-Za-z0-9]{2,8})*$"
+ },
+ "site": {
+ "type": "string",
+ "maxLength": 253,
+ "pattern": "^[a-z0-9.-]+$",
+ "description": "web: results from this host only."
+ }
+ }
+ },
+ "description": "Narrow the network and mine scopes (never widen what the caller may see)."
+ },
+ {
+ "name": "freshness",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "enum": [
+ "any",
+ "day",
+ "week",
+ "month",
+ "year"
+ ],
+ "default": "any",
+ "description": "How recent results must be, where the source dates them."
+ },
+ "description": "How recent results must be, where the source dates them."
+ },
+ {
+ "name": "depth",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "enum": [
+ "quick",
+ "standard",
+ "deep"
+ ],
+ "default": "standard",
+ "description": "quick: indexes and caches only (no paid provider); standard: the ladder until a step answers; deep: every step, merged."
+ },
+ "description": "quick: indexes and caches only (no paid provider); standard: the ladder until a step answers; deep: every step, merged."
+ },
+ {
+ "name": "answer",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "default": false,
+ "description": "Ask for a short cited answer written by AI from the results. Never without citations; labelled AI. A deployment may decline (answer: null, with the reason in route.explain)."
+ },
+ "description": "Ask for a short cited answer written by AI from the results. Never without citations; labelled AI. A deployment may decline (answer: null, with the reason in route.explain)."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 50,
+ "default": 20
+ }
+ },
+ {
+ "name": "cursor",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "maxLength": 512,
+ "description": "next_cursor of the previous page (network and mine only)."
+ },
+ "description": "next_cursor of the previous page (network and mine only)."
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/search.fabric-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ },
+ "post": {
+ "operationId": "post_api_v1_query",
+ "summary": "One search over several scopes (plan 2026-10-28 §4.5, the Search Fabric): network (Search's index, permission-aware as search.query.run), mine (the person's own private documents), web (OpenVibe's ope",
+ "description": "**search.fabric.query** (public): One search over several scopes (plan 2026-10-28 §4.5, the Search Fabric): network (Search's index, permission-aware as search.query.run), mine (the person's own private documents), web (OpenVibe's open index, then paid providers in a ladder, cached), with route.explain saying what answered and what it cost. Anonymous callers get network results and web results from the open index and the cache; a signed-in person or a first-party service (X-OV-Subject for mine) also reaches paid providers within OpenVibe's daily caps. Providers never receive an account identifier. The same operation is the SDK's createSearchClient().query() and the MCP tool openvibe.search.",
+ "tags": [
+ "search.fabric"
+ ],
+ "x-openvibe-capabilities": [
+ "search.fabric.query"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "search-query",
+ "security": [
+ {
+ "openvibeToken": [
+ "search.fabric.query"
+ ]
+ }
+ ],
+ "requestBody": {
+ "required": false,
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/search.fabric-request.v1"
+ }
+ }
+ }
+ },
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/search.fabric-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/v1/query/providers": {
+ "get": {
+ "operationId": "get_api_v1_query_providers",
+ "summary": "One search over several scopes (plan 2026-10-28 §4.5, the Search Fabric): network (Search's index, permission-aware as search.query.run), mine (the person's own private documents), web (OpenVibe's ope",
+ "description": "**search.fabric.query** (public): One search over several scopes (plan 2026-10-28 §4.5, the Search Fabric): network (Search's index, permission-aware as search.query.run), mine (the person's own private documents), web (OpenVibe's open index, then paid providers in a ladder, cached), with route.explain saying what answered and what it cost. Anonymous callers get network results and web results from the open index and the cache; a signed-in person or a first-party service (X-OV-Subject for mine) also reaches paid providers within OpenVibe's daily caps. Providers never receive an account identifier. The same operation is the SDK's createSearchClient().query() and the MCP tool openvibe.search.",
+ "tags": [
+ "search.fabric"
+ ],
+ "x-openvibe-capabilities": [
+ "search.fabric.query"
+ ],
+ "x-openvibe-visibility": [
+ "public"
+ ],
+ "x-openvibe-quota-class": "search-query",
+ "security": [
+ {
+ "openvibeToken": [
+ "search.fabric.query"
+ ]
+ }
+ ],
+ "x-openvibe-input": {
+ "$ref": "#/components/schemas/search.fabric-request.v1"
+ },
+ "parameters": [
+ {
+ "name": "q",
+ "in": "query",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 200,
+ "description": "What to find."
+ },
+ "description": "What to find."
+ },
+ {
+ "name": "scopes",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 10,
+ "uniqueItems": true,
+ "items": {
+ "enum": [
+ "network",
+ "mine",
+ "web",
+ "news",
+ "images",
+ "video",
+ "products",
+ "people",
+ "places",
+ "code"
+ ]
+ },
+ "default": [
+ "network"
+ ],
+ "description": "Where to look; results are grouped by scope. Default: network."
+ },
+ "description": "Where to look; results are grouped by scope. Default: network."
+ },
+ {
+ "name": "filters",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "object",
+ "additionalProperties": false,
+ "description": "Narrow the network and mine scopes (never widen what the caller may see).",
+ "properties": {
+ "owner": {
+ "type": "string",
+ "pattern": "^[a-z][a-z0-9_-]{0,31}$"
+ },
+ "type": {
+ "type": "string",
+ "pattern": "^[a-z][a-z0-9_-]{0,31}$"
+ },
+ "lang": {
+ "type": "string",
+ "pattern": "^[a-zA-Z]{2,3}(-[A-Za-z0-9]{2,8})*$"
+ },
+ "site": {
+ "type": "string",
+ "maxLength": 253,
+ "pattern": "^[a-z0-9.-]+$",
+ "description": "web: results from this host only."
+ }
+ }
+ },
+ "description": "Narrow the network and mine scopes (never widen what the caller may see)."
+ },
+ {
+ "name": "freshness",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "enum": [
+ "any",
+ "day",
+ "week",
+ "month",
+ "year"
+ ],
+ "default": "any",
+ "description": "How recent results must be, where the source dates them."
+ },
+ "description": "How recent results must be, where the source dates them."
+ },
+ {
+ "name": "depth",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "enum": [
+ "quick",
+ "standard",
+ "deep"
+ ],
+ "default": "standard",
+ "description": "quick: indexes and caches only (no paid provider); standard: the ladder until a step answers; deep: every step, merged."
+ },
+ "description": "quick: indexes and caches only (no paid provider); standard: the ladder until a step answers; deep: every step, merged."
+ },
+ {
+ "name": "answer",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "default": false,
+ "description": "Ask for a short cited answer written by AI from the results. Never without citations; labelled AI. A deployment may decline (answer: null, with the reason in route.explain)."
+ },
+ "description": "Ask for a short cited answer written by AI from the results. Never without citations; labelled AI. A deployment may decline (answer: null, with the reason in route.explain)."
+ },
+ {
+ "name": "limit",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 50,
+ "default": 20
+ }
+ },
+ {
+ "name": "cursor",
+ "in": "query",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "maxLength": 512,
+ "description": "next_cursor of the previous page (network and mine only)."
+ },
+ "description": "next_cursor of the previous page (network and mine only)."
+ }
+ ],
+ "responses": {
+ "2XX": {
+ "description": "Success",
+ "content": {
+ "application/json": {
+ "schema": {
+ "$ref": "#/components/schemas/search.fabric-result.v1"
+ }
+ }
+ }
+ },
+ "default": {
+ "description": "An error (RFC 9457 problem details)",
+ "content": {
+ "application/problem+json": {
+ "schema": {
+ "$ref": "#/components/schemas/errors.problem.v1"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/api/v1/search": {
"/api/v1/search": {
"get": {
"get": {
"operationId": "get_api_v1_search",
"operationId": "get_api_v1_search",
@@ -865,6 +1297,402 @@
@@ -865,6 +1297,402 @@
}
}
]
]
},
},
+ "search.fabric-request.v1": {
+ "title": "SearchFabricRequest",
+ "description": "search.fabric-request@1: the body of POST /api/v1/query (or the query string of GET /api/v1/query, scopes comma-separated), capability search.fabric.query. One search over several scopes, routed the cheapest way that answers (plan 2026-10-28 §4.5). network: Search's own index, permission-aware exactly as search.query.run; mine: the caller's own private documents (a signed-in person, or a service with X-OV-Subject); web: OpenVibe's open index first, then paid providers in a ladder, each result keeping its provider, date and URL. Providers never receive an account identifier. A scope the caller may not use (mine without a person; web's paid providers for an anonymous caller, who gets cached and open-index results only) is reported in route.explain, never an error. The other scopes are facets of the same indexes and are accepted for forward compatibility; v1 answers them as network results filtered by kind.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "q"
+ ],
+ "properties": {
+ "q": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 200,
+ "description": "What to find."
+ },
+ "scopes": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 10,
+ "uniqueItems": true,
+ "items": {
+ "enum": [
+ "network",
+ "mine",
+ "web",
+ "news",
+ "images",
+ "video",
+ "products",
+ "people",
+ "places",
+ "code"
+ ]
+ },
+ "default": [
+ "network"
+ ],
+ "description": "Where to look; results are grouped by scope. Default: network."
+ },
+ "filters": {
+ "type": "object",
+ "additionalProperties": false,
+ "description": "Narrow the network and mine scopes (never widen what the caller may see).",
+ "properties": {
+ "owner": {
+ "type": "string",
+ "pattern": "^[a-z][a-z0-9_-]{0,31}$"
+ },
+ "type": {
+ "type": "string",
+ "pattern": "^[a-z][a-z0-9_-]{0,31}$"
+ },
+ "lang": {
+ "type": "string",
+ "pattern": "^[a-zA-Z]{2,3}(-[A-Za-z0-9]{2,8})*$"
+ },
+ "site": {
+ "type": "string",
+ "maxLength": 253,
+ "pattern": "^[a-z0-9.-]+$",
+ "description": "web: results from this host only."
+ }
+ }
+ },
+ "freshness": {
+ "enum": [
+ "any",
+ "day",
+ "week",
+ "month",
+ "year"
+ ],
+ "default": "any",
+ "description": "How recent results must be, where the source dates them."
+ },
+ "depth": {
+ "enum": [
+ "quick",
+ "standard",
+ "deep"
+ ],
+ "default": "standard",
+ "description": "quick: indexes and caches only (no paid provider); standard: the ladder until a step answers; deep: every step, merged."
+ },
+ "answer": {
+ "type": "boolean",
+ "default": false,
+ "description": "Ask for a short cited answer written by AI from the results. Never without citations; labelled AI. A deployment may decline (answer: null, with the reason in route.explain)."
+ },
+ "limit": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 50,
+ "default": 20
+ },
+ "cursor": {
+ "type": "string",
+ "maxLength": 512,
+ "description": "next_cursor of the previous page (network and mine only)."
+ }
+ }
+ },
+ "search.fabric-result.v1": {
+ "title": "SearchFabricResult",
+ "description": "search.fabric-result@1: the answer of search.fabric.query. results come grouped by scope order (the room's own first when the caller asked for it); every web result keeps its provider, URL and date; route.explain says, step by step, what was asked, what answered, from cache or not, and what it cost. The query is never echoed: a page renders results without writing the query into its HTML (the ?q= rule).",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "results",
+ "groups",
+ "route",
+ "next_cursor"
+ ],
+ "properties": {
+ "results": {
+ "type": "array",
+ "maxItems": 100,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "scope",
+ "kind",
+ "title",
+ "url"
+ ],
+ "properties": {
+ "scope": {
+ "enum": [
+ "network",
+ "mine",
+ "web",
+ "news",
+ "images",
+ "video",
+ "products",
+ "people",
+ "places",
+ "code"
+ ]
+ },
+ "kind": {
+ "enum": [
+ "document",
+ "page"
+ ],
+ "description": "document: in Search's index (owner, type, id set); page: a web page (provider set)."
+ },
+ "title": {
+ "type": "string",
+ "maxLength": 300
+ },
+ "url": {
+ "type": "string",
+ "maxLength": 2048,
+ "format": "uri"
+ },
+ "snippet": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 600,
+ "description": "Plain text; never HTML."
+ },
+ "site": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 253
+ },
+ "image": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 2048
+ },
+ "published_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 40
+ },
+ "retrieved_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 40,
+ "description": "When a web page was read (by the provider or the open index)."
+ },
+ "provider": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 40,
+ "description": "page: who found it (open_index, deepseek, wikipedia, brave, …)."
+ },
+ "owner": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 32
+ },
+ "type": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 32
+ },
+ "id": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 200
+ },
+ "score": {
+ "type": [
+ "number",
+ "null"
+ ],
+ "description": "Rank within its scope (higher first); not comparable across scopes."
+ }
+ }
+ }
+ },
+ "groups": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "description": "How many results each scope gave on this page."
+ },
+ "answer": {
+ "type": [
+ "object",
+ "null"
+ ],
+ "additionalProperties": false,
+ "required": [
+ "text",
+ "citations",
+ "label"
+ ],
+ "properties": {
+ "text": {
+ "type": "string",
+ "maxLength": 2000
+ },
+ "citations": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 20,
+ "items": {
+ "type": "integer",
+ "minimum": 1
+ }
+ },
+ "label": {
+ "const": "Written by AI from these sources"
+ }
+ }
+ },
+ "citations": {
+ "type": "array",
+ "maxItems": 20,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "n",
+ "url",
+ "title"
+ ],
+ "properties": {
+ "n": {
+ "type": "integer",
+ "minimum": 1
+ },
+ "url": {
+ "type": "string",
+ "maxLength": 2048
+ },
+ "title": {
+ "type": "string",
+ "maxLength": 300
+ },
+ "provider": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 40
+ },
+ "retrieved_at": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 40
+ }
+ }
+ }
+ },
+ "route": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "explain",
+ "cost_usd"
+ ],
+ "properties": {
+ "explain": {
+ "type": "array",
+ "maxItems": 20,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "scope",
+ "step",
+ "ok"
+ ],
+ "properties": {
+ "scope": {
+ "enum": [
+ "network",
+ "mine",
+ "web",
+ "news",
+ "images",
+ "video",
+ "products",
+ "people",
+ "places",
+ "code"
+ ]
+ },
+ "step": {
+ "type": "string",
+ "maxLength": 40,
+ "description": "index, open_index, cache, deepseek, wikipedia, …"
+ },
+ "ok": {
+ "type": "boolean"
+ },
+ "count": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "ms": {
+ "type": "integer",
+ "minimum": 0
+ },
+ "cached": {
+ "type": "boolean"
+ },
+ "cost_usd": {
+ "type": "number",
+ "minimum": 0
+ },
+ "skipped": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 160,
+ "description": "Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down)."
+ }
+ }
+ }
+ },
+ "cost_usd": {
+ "type": "number",
+ "minimum": 0,
+ "description": "What this query cost OpenVibe (paid provider calls; cached answers cost 0)."
+ }
+ }
+ },
+ "next_cursor": {
+ "type": [
+ "string",
+ "null"
+ ],
+ "maxLength": 512
+ }
+ }
+ },
"search.index-document.v1": {
"search.index-document.v1": {
"title": "IndexDocument",
"title": "IndexDocument",
"description": "What an owning service tells OpenVibe.Search about one of its resources (roadmap §15.12, §4.2 A). The owner stays the source of truth; Search keeps a revision-ordered, permission-aware copy for discovery. A document with deleted=true is a tombstone: it removes the resource from every result and wins over any upsert with the same or an older revision.",
"description": "What an owning service tells OpenVibe.Search about one of its resources (roadmap §15.12, §4.2 A). The owner stays the source of truth; Search keeps a revision-ordered, permission-aware copy for discovery. A document with deleted=true is a tombstone: it removes the resource from every result and wins over any upsert with the same or an older revision.",
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Services API",
"title": "OpenVibe.Services API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Services as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Sources API",
"title": "OpenVibe.Sources API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Sources as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Space API",
"title": "OpenVibe.Space API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Space as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tips API",
"title": "OpenVibe.Tips API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Tips as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Tools API",
"title": "OpenVibe.Tools API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Tools as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Trade API",
"title": "OpenVibe.Trade API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Trade as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.VIP API",
"title": "OpenVibe.VIP API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.VIP as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Watch API",
"title": "OpenVibe.Watch API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Watch as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Wiki API",
"title": "OpenVibe.Wiki API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Wiki as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Work API",
"title": "OpenVibe.Work API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Work as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -3,8 +3,8 @@
@@ -3,8 +3,8 @@
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
"info": {
"info": {
"title": "OpenVibe.Zone API",
"title": "OpenVibe.Zone API",
- "version": "0.224.0",
- "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.224.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
+ "version": "0.225.0",
+ "description": "Routes of OpenVibe.Zone as the OpenVibe contracts describe them (openvibe-contracts 0.225.0): each operation lists the capabilities it performs; a token for the service's audience must carry one of them unless the route is open. Generated by openvibe-contracts lib/openapi.js; do not edit.",
"license": {
"license": {
"name": "MIT",
"name": "MIT",
"identifier": "MIT"
"identifier": "MIT"
@@ -6134,6 +6134,5275 @@ export interface SearchQueryResult {
@@ -6134,6 +6134,5275 @@ export interface SearchQueryResult {
};
};
}
}
+/** [email protected] (owner: search) */
+/**
+ * search.fabric-request@1: the body of POST /api/v1/query (or the query string of GET /api/v1/query, scopes comma-separated), capability search.fabric.query. One search over several scopes, routed the cheapest way that answers (plan 2026-10-28 §4.5). network: Search's own index, permission-aware exactly as search.query.run; mine: the caller's own private documents (a signed-in person, or a service with X-OV-Subject); web: OpenVibe's open index first, then paid providers in a ladder, each result keeping its provider, date and URL. Providers never receive an account identifier. A scope the caller may not use (mine without a person; web's paid providers for an anonymous caller, who gets cached and open-index results only) is reported in route.explain, never an error. The other scopes are facets of the same indexes and are accepted for forward compatibility; v1 answers them as network results filtered by kind.
+ */
+export interface SearchFabricRequest {
+ /**
+ * What to find.
+ */
+ q: string;
+ /**
+ * Where to look; results are grouped by scope. Default: network.
+ *
+ * @minItems 1
+ * @maxItems 10
+ */
+ scopes?:
+ | ["network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code"]
+ | [
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code"
+ ]
+ | [
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code"
+ ]
+ | [
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code"
+ ]
+ | [
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code"
+ ]
+ | [
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code"
+ ]
+ | [
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code"
+ ]
+ | [
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code"
+ ]
+ | [
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code"
+ ]
+ | [
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code"
+ ];
+ /**
+ * Narrow the network and mine scopes (never widen what the caller may see).
+ */
+ filters?: {
+ owner?: string;
+ type?: string;
+ lang?: string;
+ /**
+ * web: results from this host only.
+ */
+ site?: string;
+ };
+ /**
+ * How recent results must be, where the source dates them.
+ */
+ freshness?: "any" | "day" | "week" | "month" | "year";
+ /**
+ * quick: indexes and caches only (no paid provider); standard: the ladder until a step answers; deep: every step, merged.
+ */
+ depth?: "quick" | "standard" | "deep";
+ /**
+ * Ask for a short cited answer written by AI from the results. Never without citations; labelled AI. A deployment may decline (answer: null, with the reason in route.explain).
+ */
+ answer?: boolean;
+ limit?: number;
+ /**
+ * next_cursor of the previous page (network and mine only).
+ */
+ cursor?: string;
+}
+
+/** [email protected] (owner: search) */
+/**
+ * search.fabric-result@1: the answer of search.fabric.query. results come grouped by scope order (the room's own first when the caller asked for it); every web result keeps its provider, URL and date; route.explain says, step by step, what was asked, what answered, from cache or not, and what it cost. The query is never echoed: a page renders results without writing the query into its HTML (the ?q= rule).
+ */
+export interface SearchFabricResult {
+ /**
+ * @maxItems 100
+ */
+ results: {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * document: in Search's index (owner, type, id set); page: a web page (provider set).
+ */
+ kind: "document" | "page";
+ title: string;
+ url: string;
+ /**
+ * Plain text; never HTML.
+ */
+ snippet?: string | null;
+ site?: string | null;
+ image?: string | null;
+ published_at?: string | null;
+ /**
+ * When a web page was read (by the provider or the open index).
+ */
+ retrieved_at?: string | null;
+ /**
+ * page: who found it (open_index, deepseek, wikipedia, brave, …).
+ */
+ provider?: string | null;
+ owner?: string | null;
+ type?: string | null;
+ id?: string | null;
+ /**
+ * Rank within its scope (higher first); not comparable across scopes.
+ */
+ score?: number | null;
+ }[];
+ /**
+ * How many results each scope gave on this page.
+ */
+ groups: {
+ [k: string]: number | undefined;
+ };
+ answer?: {
+ text: string;
+ /**
+ * @minItems 1
+ * @maxItems 20
+ */
+ citations:
+ | [number]
+ | [number, number]
+ | [number, number, number]
+ | [number, number, number, number]
+ | [number, number, number, number, number]
+ | [number, number, number, number, number, number]
+ | [number, number, number, number, number, number, number]
+ | [number, number, number, number, number, number, number, number]
+ | [number, number, number, number, number, number, number, number, number]
+ | [number, number, number, number, number, number, number, number, number, number]
+ | [number, number, number, number, number, number, number, number, number, number, number]
+ | [number, number, number, number, number, number, number, number, number, number, number, number]
+ | [number, number, number, number, number, number, number, number, number, number, number, number, number]
+ | [number, number, number, number, number, number, number, number, number, number, number, number, number, number]
+ | [
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number
+ ]
+ | [
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number
+ ]
+ | [
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number
+ ]
+ | [
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number
+ ]
+ | [
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number
+ ]
+ | [
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number,
+ number
+ ];
+ label: "Written by AI from these sources";
+ } | null;
+ /**
+ * @maxItems 20
+ */
+ citations?:
+ | []
+ | [
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ }
+ ]
+ | [
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ }
+ ]
+ | [
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ }
+ ]
+ | [
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ }
+ ]
+ | [
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ }
+ ]
+ | [
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ }
+ ]
+ | [
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ }
+ ]
+ | [
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ }
+ ]
+ | [
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ }
+ ]
+ | [
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ }
+ ]
+ | [
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ }
+ ]
+ | [
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ }
+ ]
+ | [
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ }
+ ]
+ | [
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ }
+ ]
+ | [
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ }
+ ]
+ | [
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ }
+ ]
+ | [
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ }
+ ]
+ | [
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ }
+ ]
+ | [
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ }
+ ]
+ | [
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ },
+ {
+ n: number;
+ url: string;
+ title: string;
+ provider?: string | null;
+ retrieved_at?: string | null;
+ }
+ ];
+ route: {
+ /**
+ * @maxItems 20
+ */
+ explain:
+ | []
+ | [
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ }
+ ]
+ | [
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ }
+ ]
+ | [
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ }
+ ]
+ | [
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ }
+ ]
+ | [
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ }
+ ]
+ | [
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ }
+ ]
+ | [
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ }
+ ]
+ | [
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ }
+ ]
+ | [
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ }
+ ]
+ | [
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ }
+ ]
+ | [
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ }
+ ]
+ | [
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ }
+ ]
+ | [
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ }
+ ]
+ | [
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ }
+ ]
+ | [
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ }
+ ]
+ | [
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ }
+ ]
+ | [
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ }
+ ]
+ | [
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ }
+ ]
+ | [
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ }
+ ]
+ | [
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ },
+ {
+ scope: "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code";
+ /**
+ * index, open_index, cache, deepseek, wikipedia, …
+ */
+ step: string;
+ ok: boolean;
+ count?: number;
+ ms?: number;
+ cached?: boolean;
+ cost_usd?: number;
+ /**
+ * Why the step did not run (not allowed for this caller, quick depth, an earlier step answered, provider standing down).
+ */
+ skipped?: string | null;
+ }
+ ];
+ /**
+ * What this query cost OpenVibe (paid provider calls; cached answers cost 0).
+ */
+ cost_usd: number;
+ };
+ next_cursor: string | null;
+}
+
+/** [email protected] (owner: search) */
+/**
+ * search.provider-offer@1: one web search provider as the Search Fabric's ladder and Route see it (GET /api/v1/query/providers, capability search.fabric.query): what it covers, what it costs, whether it is usable now and how it has answered. Prices are the vendor's published ones as of checked_at; nothing here is a secret.
+ */
+export interface SearchProviderOffer {
+ provider: string;
+ name?: string;
+ /**
+ * @minItems 1
+ */
+ scopes: [
+ "network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code",
+ ...("network" | "mine" | "web" | "news" | "images" | "video" | "products" | "people" | "places" | "code")[]
+ ];
+ price_usd_per_call: number;
+ /**
+ * Searches its own crawl rather than reselling another engine's.
+ */
+ independent_index?: boolean;
+ /**
+ * Configured and not standing down (balance, key, rate limit, daily cap).
+ */
+ available: boolean;
+ reason?: string | null;
+ daily_cap?: number | null;
+ used_today?: number | null;
+ latency_ms_p50?: number | null;
+ /**
+ * Share of calls in the last day that returned at least one result.
+ */
+ answered_rate?: number | null;
+ terms_url?: string | null;
+ checked_at: string;
+}
+
/** [email protected] (owner: search) */
/** [email protected] (owner: search) */
/**
/**
* search.write-result@1: the answer of PUT /api/v1/documents/:owner/:type/:id (search.document.write). applied: stored (or a tombstone recorded); unchanged: the same revision with the same content. A revision older than the stored one is a 409 problem search.stale_revision; the same revision with different content is 409 search.revision_conflict.
* search.write-result@1: the answer of PUT /api/v1/documents/:owner/:type/:id (search.document.write). applied: stored (or a tombstone recorded); unchanged: the same revision with the same content. A revision older than the stored one is a 409 problem search.stale_revision; the same revision with different content is 409 search.revision_conflict.
new file mode 100644
new file mode 100644
@@ -0,0 +1,23 @@
@@ -0,0 +1,23 @@
+{
+ "id": "search.fabric.query",
+ "version": "1.0",
+ "owner": "search",
+ "status": "active",
+ "visibility": "public",
+ "description": "One search over several scopes (plan 2026-10-28 \u00a74.5, the Search Fabric): network (Search's index, permission-aware as search.query.run), mine (the person's own private documents), web (OpenVibe's open index, then paid providers in a ladder, cached), with route.explain saying what answered and what it cost. Anonymous callers get network results and web results from the open index and the cache; a signed-in person or a first-party service (X-OV-Subject for mine) also reaches paid providers within OpenVibe's daily caps. Providers never receive an account identifier. The same operation is the SDK's createSearchClient().query() and the MCP tool openvibe.search.",
+ "permissions": [
+ "search:read"
+ ],
+ "resourceConstraints": [
+ "none"
+ ],
+ "quotaClass": "search-query",
+ "events": [],
+ "implementedBy": [
+ "POST /api/v1/query",
+ "GET /api/v1/query",
+ "GET /api/v1/query/providers"
+ ],
+ "inputSchema": "search.fabric-request@1",
+ "outputSchema": "search.fabric-result@1"
+}
@@ -21,6 +21,7 @@
@@ -21,6 +21,7 @@
},
},
"capabilities": [
"capabilities": [
"search.document.write",
"search.document.write",
+ "search.fabric.query",
"search.query.delegate",
"search.query.delegate",
"search.query.run"
"search.query.run"
],
],
@@ -73,7 +74,7 @@
@@ -73,7 +74,7 @@
],
],
"window": "automatic only while ovhost waits for readiness after the restart (30 s in host.example.json); manual afterwards, as long as no blocker applies",
"window": "automatic only while ovhost waits for readiness after the restart (30 s in host.example.json); manual afterwards, as long as no blocker applies",
"blockers": {
"blockers": {
- "none": "the schema code only adds (CREATE … IF NOT EXISTS, ADD COLUMN; no DROP, RENAME or table rebuild), which an older release ignores"
+ "none": "the schema code only adds (CREATE \u2026 IF NOT EXISTS, ADD COLUMN; no DROP, RENAME or table rebuild), which an older release ignores"
}
}
},
},
"contracts": {
"contracts": {
@@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
{
{
"name": "openvibe-contracts",
"name": "openvibe-contracts",
- "version": "0.224.0",
+ "version": "0.225.0",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"main": "index.js",
"types": "generated/typescript/index.d.ts",
"types": "generated/typescript/index.d.ts",