| @@ -0,0 +1,515 @@ |
| +{ |
| + "$schema": "http://json-schema.org/draft-07/schema#", |
| + "title": "Config", |
| + "description": "Application configuration loaded from the TOML config file.\n\nAll config structs derive `schemars::JsonSchema` so the full schema can be printed via `search_hub config-schema`.\n\n# Example\n\n```ignore let cfg = search_hub::config::Config::load(); let engines = cfg.engines.clone(); println!(\"{} engines enabled\", engines.len()); ```", |
| + "type": "object", |
| + "properties": { |
| + "bangs": { |
| + "description": "User-defined shortcut overrides and additions.", |
| + "type": "array", |
| + "items": { |
| + "$ref": "#/definitions/BangOverride" |
| + } |
| + }, |
| + "db_path": { |
| + "description": "Default bookmark database path.", |
| + "default": null, |
| + "type": [ |
| + "string", |
| + "null" |
| + ] |
| + }, |
| + "engines": { |
| + "description": "Per-engine configuration. Each entry defines an enabled search engine.", |
| + "type": "array", |
| + "items": { |
| + "$ref": "#/definitions/EngineConfig" |
| + } |
| + }, |
| + "exclude_urls": { |
| + "description": "Hostnames to exclude from content fetching.", |
| + "default": null, |
| + "type": [ |
| + "array", |
| + "null" |
| + ], |
| + "items": { |
| + "type": "string" |
| + } |
| + }, |
| + "tagging": { |
| + "description": "Tagging-specific configuration (always present; defaults apply when `[tagging]` is absent).", |
| + "allOf": [ |
| + { |
| + "$ref": "#/definitions/TaggingConfig" |
| + } |
| + ] |
| + }, |
| + "web": { |
| + "description": "Web server configuration (always present; defaults apply when `[web]` is absent).", |
| + "allOf": [ |
| + { |
| + "$ref": "#/definitions/WebConfig" |
| + } |
| + ] |
| + } |
| + }, |
| + "definitions": { |
| + "BangOverride": { |
| + "description": "User-defined override or addition to auto-generated shortcuts.", |
| + "type": "object", |
| + "required": [ |
| + "trigger" |
| + ], |
| + "properties": { |
| + "enabled": { |
| + "description": "Set to `false` to suppress an auto-generated shortcut.", |
| + "default": null, |
| + "type": [ |
| + "boolean", |
| + "null" |
| + ] |
| + }, |
| + "name": { |
| + "description": "Optional display name override.", |
| + "type": [ |
| + "string", |
| + "null" |
| + ] |
| + }, |
| + "trigger": { |
| + "description": "The trigger keyword (e.g. \"w\" for !w).", |
| + "type": "string" |
| + }, |
| + "url": { |
| + "description": "Optional override URL template with `{}` placeholder.", |
| + "type": [ |
| + "string", |
| + "null" |
| + ] |
| + } |
| + } |
| + }, |
| + "EngineConfig": { |
| + "description": "Configuration for a single search engine instance.", |
| + "oneOf": [ |
| + { |
| + "description": "crates.io registry (public or private)", |
| + "type": "object", |
| + "required": [ |
| + "type" |
| + ], |
| + "properties": { |
| + "bang_enabled": { |
| + "default": null, |
| + "type": [ |
| + "boolean", |
| + "null" |
| + ] |
| + }, |
| + "bang_url": { |
| + "default": null, |
| + "type": [ |
| + "string", |
| + "null" |
| + ] |
| + }, |
| + "shortcode": { |
| + "default": null, |
| + "type": [ |
| + "string", |
| + "null" |
| + ] |
| + }, |
| + "timeout_secs": { |
| + "default": null, |
| + "type": [ |
| + "number", |
| + "null" |
| + ], |
| + "format": "float" |
| + }, |
| + "type": { |
| + "type": "string", |
| + "enum": [ |
| + "crates_io" |
| + ] |
| + }, |
| + "url": { |
| + "default": null, |
| + "type": [ |
| + "string", |
| + "null" |
| + ] |
| + } |
| + } |
| + }, |
| + { |
| + "description": "SearXNG meta-search engine", |
| + "type": "object", |
| + "required": [ |
| + "instance", |
| + "type" |
| + ], |
| + "properties": { |
| + "bang_enabled": { |
| + "default": null, |
| + "type": [ |
| + "boolean", |
| + "null" |
| + ] |
| + }, |
| + "bang_url": { |
| + "default": null, |
| + "type": [ |
| + "string", |
| + "null" |
| + ] |
| + }, |
| + "instance": { |
| + "type": "string" |
| + }, |
| + "shortcode": { |
| + "default": null, |
| + "type": [ |
| + "string", |
| + "null" |
| + ] |
| + }, |
| + "timeout_secs": { |
| + "default": null, |
| + "type": [ |
| + "number", |
| + "null" |
| + ], |
| + "format": "float" |
| + }, |
| + "type": { |
| + "type": "string", |
| + "enum": [ |
| + "searxng" |
| + ] |
| + } |
| + } |
| + }, |
| + { |
| + "description": "Wikipedia search (language-specific)", |
| + "type": "object", |
| + "required": [ |
| + "type" |
| + ], |
| + "properties": { |
| + "bang_enabled": { |
| + "default": null, |
| + "type": [ |
| + "boolean", |
| + "null" |
| + ] |
| + }, |
| + "bang_url": { |
| + "default": null, |
| + "type": [ |
| + "string", |
| + "null" |
| + ] |
| + }, |
| + "lang": { |
| + "description": "Language code (e.g. \"en\", \"fr\", \"de\"). Defaults to \"en\" if omitted.", |
| + "default": null, |
| + "type": [ |
| + "string", |
| + "null" |
| + ] |
| + }, |
| + "shortcode": { |
| + "default": null, |
| + "type": [ |
| + "string", |
| + "null" |
| + ] |
| + }, |
| + "timeout_secs": { |
| + "default": null, |
| + "type": [ |
| + "number", |
| + "null" |
| + ], |
| + "format": "float" |
| + }, |
| + "type": { |
| + "type": "string", |
| + "enum": [ |
| + "wikipedia" |
| + ] |
| + } |
| + } |
| + }, |
| + { |
| + "description": "MDN Web Docs search (language-specific)", |
| + "type": "object", |
| + "required": [ |
| + "type" |
| + ], |
| + "properties": { |
| + "bang_enabled": { |
| + "default": null, |
| + "type": [ |
| + "boolean", |
| + "null" |
| + ] |
| + }, |
| + "bang_url": { |
| + "default": null, |
| + "type": [ |
| + "string", |
| + "null" |
| + ] |
| + }, |
| + "locale": { |
| + "description": "Locale code (e.g. \"en-US\", \"fr\", \"de\"). Defaults to \"en-US\" if omitted.", |
| + "default": null, |
| + "type": [ |
| + "string", |
| + "null" |
| + ] |
| + }, |
| + "shortcode": { |
| + "default": null, |
| + "type": [ |
| + "string", |
| + "null" |
| + ] |
| + }, |
| + "timeout_secs": { |
| + "default": null, |
| + "type": [ |
| + "number", |
| + "null" |
| + ], |
| + "format": "float" |
| + }, |
| + "type": { |
| + "type": "string", |
| + "enum": [ |
| + "mdn" |
| + ] |
| + } |
| + } |
| + }, |
| + { |
| + "description": "Generic HTML-scraped search engine (configurable URL + CSS selector)", |
| + "type": "object", |
| + "required": [ |
| + "name", |
| + "selector", |
| + "type", |
| + "url" |
| + ], |
| + "properties": { |
| + "bang_enabled": { |
| + "default": null, |
| + "type": [ |
| + "boolean", |
| + "null" |
| + ] |
| + }, |
| + "bang_url": { |
| + "default": null, |
| + "type": [ |
| + "string", |
| + "null" |
| + ] |
| + }, |
| + "name": { |
| + "description": "Display name for this engine (e.g. \"DuckDuckGo\", \"Stack Overflow\").", |
| + "type": "string" |
| + }, |
| + "selector": { |
| + "description": "CSS selector targeting the result container.", |
| + "type": "string" |
| + }, |
| + "shortcode": { |
| + "default": null, |
| + "type": [ |
| + "string", |
| + "null" |
| + ] |
| + }, |
| + "timeout_secs": { |
| + "default": null, |
| + "type": [ |
| + "number", |
| + "null" |
| + ], |
| + "format": "float" |
| + }, |
| + "type": { |
| + "type": "string", |
| + "enum": [ |
| + "generic" |
| + ] |
| + }, |
| + "url": { |
| + "description": "URL template with `{}` placeholder for the query.", |
| + "type": "string" |
| + } |
| + } |
| + } |
| + ] |
| + }, |
| + "TagDef": { |
| + "description": "A named tag with positive and negative example texts for semantic similarity.\n\n# Example\n\n```rust use search_hub::tagging::TagDef;\n\nlet tag = TagDef { name: \"rust\".into(), examples: vec![\"serde serialization\".into(), \"tokio async runtime\".into()], negatives: vec![], }; assert_eq!(tag.name, \"rust\"); ```", |
| + "type": "object", |
| + "required": [ |
| + "examples", |
| + "name" |
| + ], |
| + "properties": { |
| + "examples": { |
| + "description": "Positive example phrases that exemplify this tag.", |
| + "type": "array", |
| + "items": { |
| + "type": "string" |
| + } |
| + }, |
| + "name": { |
| + "description": "The tag label (e.g. \"rust\", \"web\").", |
| + "type": "string" |
| + }, |
| + "negatives": { |
| + "description": "Negative example phrases that should NOT match this tag.", |
| + "default": [], |
| + "type": "array", |
| + "items": { |
| + "type": "string" |
| + } |
| + } |
| + } |
| + }, |
| + "TaggingConfig": { |
| + "description": "Tagging-specific configuration options.", |
| + "type": "object", |
| + "properties": { |
| + "enabled": { |
| + "description": "Whether auto-tagging is enabled (default: false).", |
| + "default": false, |
| + "type": [ |
| + "boolean", |
| + "null" |
| + ] |
| + }, |
| + "max_tags": { |
| + "description": "Max tags to assign per bookmark (default: 5).", |
| + "default": 5, |
| + "type": [ |
| + "integer", |
| + "null" |
| + ], |
| + "format": "uint", |
| + "minimum": 0.0 |
| + }, |
| + "onnx_model": { |
| + "description": "ONNX embedding model name (default: \"BGESmallENV15\").", |
| + "default": "BGESmallENV15", |
| + "type": [ |
| + "string", |
| + "null" |
| + ] |
| + }, |
| + "override_tags": { |
| + "description": "If true, use only user-provided [[tags]] and ignore built-in tag defaults.", |
| + "default": false, |
| + "type": [ |
| + "boolean", |
| + "null" |
| + ] |
| + }, |
| + "reranker_enabled": { |
| + "description": "Whether to use the cross-encoder reranker (default: true).", |
| + "default": false, |
| + "type": [ |
| + "boolean", |
| + "null" |
| + ] |
| + }, |
| + "reranker_model": { |
| + "description": "Cross-encoder reranker model code (default: \"rozgo/bge-reranker-v2-m3\").", |
| + "default": "rozgo/bge-reranker-v2-m3", |
| + "type": [ |
| + "string", |
| + "null" |
| + ] |
| + }, |
| + "tag_weight": { |
| + "description": "Weight multiplier for the tags column in FTS5 search ranking (default: 3.0).", |
| + "default": 3.0, |
| + "type": [ |
| + "number", |
| + "null" |
| + ], |
| + "format": "double" |
| + }, |
| + "tags": { |
| + "description": "Custom tag definitions. If non-empty and `override_tags` is false, these replace the hardcoded defaults (nested under `[tagging]` in TOML).", |
| + "type": "array", |
| + "items": { |
| + "$ref": "#/definitions/TagDef" |
| + } |
| + }, |
| + "threshold": { |
| + "description": "Tagging threshold (0.0 to 1.0, default: 0.6).", |
| + "default": 0.35, |
| + "type": [ |
| + "number", |
| + "null" |
| + ], |
| + "format": "double" |
| + }, |
| + "truncation": { |
| + "description": "Max characters to use from page content for tagging (default: 4000).", |
| + "default": 4000, |
| + "type": [ |
| + "integer", |
| + "null" |
| + ], |
| + "format": "uint", |
| + "minimum": 0.0 |
| + } |
| + } |
| + }, |
| + "WebConfig": { |
| + "description": "Web server configuration options.", |
| + "type": "object", |
| + "properties": { |
| + "bind_address": { |
| + "description": "Server bind address (default: \"127.0.0.1\").", |
| + "default": null, |
| + "type": [ |
| + "string", |
| + "null" |
| + ] |
| + }, |
| + "page_size": { |
| + "description": "Results per page (default: 20).", |
| + "default": null, |
| + "type": [ |
| + "integer", |
| + "null" |
| + ], |
| + "format": "uint", |
| + "minimum": 0.0 |
| + }, |
| + "workers": { |
| + "description": "Actix worker threads (default: 2).", |
| + "default": null, |
| + "type": [ |
| + "integer", |
| + "null" |
| + ], |
| + "format": "uint", |
| + "minimum": 0.0 |
| + } |
| + } |
| + } |
| + } |
| +} |