Constant SCHEMA_JSONC
Source pub const SCHEMA_JSONC: &str = "{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"settings.schema.jsonc\",\n \"title\": \"Innate Settings\",\n \"description\": \"~/.innate/settings.json \u{2014} Innate knowledge layer configuration. Configure with: innate install\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\",\n \"description\": \"JSON Schema reference (auto-written by innate on save)\"\n },\n\n // \u{2500}\u{2500} LLM \u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\n \"llm\": {\n \"description\": \"Generative LLM used for knowledge distillation (innate evolve). If absent, Innate falls back to heuristic distillation.\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"provider\", \"model_id\"],\n \"properties\": {\n \"provider\": {\n \"type\": \"string\",\n \"enum\": [\"openai\", \"anthropic\"],\n \"description\": \"API wire format. Use \\\"openai\\\" for any OpenAI-compatible endpoint (DeepSeek, Ollama, Qwen, Mistral, \u{2026}). Use \\\"anthropic\\\" for api.anthropic.com.\"\n },\n \"base_url\": {\n \"type\": \"string\",\n \"description\": \"Override the default API base URL. Defaults: openai \u{2192} https://api.openai.com/v1 | anthropic \u{2192} https://api.anthropic.com. Trailing slash is stripped automatically.\"\n },\n \"model_id\": {\n \"type\": \"string\",\n \"description\": \"Model identifier sent verbatim in the API request body. Examples: gpt-4o-mini, claude-haiku-4-5-20251001, qwen3.7-max, deepseek-chat.\"\n },\n \"api_key\": {\n \"type\": \"string\",\n \"description\": \"API key (file stored at mode 0600). Env var override chain: INNATE_LLM_API_KEY \u{2192} OPENAI_API_KEY (openai) / ANTHROPIC_API_KEY (anthropic).\"\n }\n }\n },\n\n // \u{2500}\u{2500} Embedding \u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\n \"embedding\": {\n \"description\": \"Embedding model for semantic recall (innate recall). If absent, Innate uses a hash-based dummy embedder (no semantic similarity).\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"model_id\"],\n \"properties\": {\n \"provider\": {\n \"type\": \"string\",\n \"enum\": [\"openai\"],\n \"default\": \"openai\",\n \"description\": \"Always \\\"openai\\\" \u{2014} only OpenAI-compatible embedding APIs are supported. Anthropic has no embedding API.\"\n },\n \"base_url\": {\n \"type\": \"string\",\n \"description\": \"Override the default embedding API base URL. Defaults to https://api.openai.com/v1.\"\n },\n \"model_id\": {\n \"type\": \"string\",\n \"description\": \"Embedding model ID. Examples: text-embedding-3-small, text-embedding-3-large, qwen3-embedding.\"\n },\n \"api_key\": {\n \"type\": \"string\",\n \"description\": \"API key. Env var override chain: INNATE_LLM_API_KEY \u{2192} OPENAI_API_KEY.\"\n },\n \"dim\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"default\": 1536,\n \"description\": \"Embedding vector dimension \u{2014} must match what the model actually produces. Common values: text-embedding-3-small=1536, text-embedding-3-large=3072, qwen3-embedding=2560. Mismatch causes silent cosine-similarity errors.\"\n }\n }\n },\n\n // \u{2500}\u{2500} Daemon \u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\n \"daemon\": {\n \"description\": \"Background daemon that watches session log files and triggers innate evolve after each session ends.\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"watch_dirs\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"default\": [\"~/.innate/sessions\"],\n \"description\": \"Directories the daemon tails for .log / .json hook files. Supports ~ expansion. The default directory (~/.innate/sessions) is created automatically.\"\n },\n \"auto_start\": {\n \"type\": \"boolean\",\n \"default\": true,\n \"description\": \"Automatically spawn the daemon process when the MCP server starts (innate mcp). The daemon is idempotent \u{2014} a second spawn is a no-op.\"\n }\n }\n },\n\n // \u{2500}\u{2500} Backup \u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\u{2500}\n \"backup\": {\n \"description\": \"Automatic database backup to Cloudflare R2 object storage.\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"enable\": {\n \"type\": \"boolean\",\n \"default\": false,\n \"description\": \"Master switch. Backup is disabled by default \u{2014} set to true to enable.\"\n },\n \"r2\": {\n \"description\": \"Cloudflare R2 credentials. Required when enable=true.\",\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"required\": [\"account_id\", \"bucket\"],\n \"properties\": {\n \"account_id\": {\n \"type\": \"string\",\n \"description\": \"Cloudflare account ID \u{2014} visible in the R2 dashboard URL (dash.cloudflare.com/<account_id>/r2).\"\n },\n \"bucket\": {\n \"type\": \"string\",\n \"description\": \"R2 bucket name.\"\n },\n \"access_key_id\": {\n \"type\": \"string\",\n \"description\": \"R2 API token access key ID (generated in R2 \u{2192} Manage R2 API tokens). Env override: INNATE_R2_ACCESS_KEY_ID.\"\n },\n \"secret_access_key\": {\n \"type\": \"string\",\n \"description\": \"R2 API token secret access key. Env override: INNATE_R2_SECRET_ACCESS_KEY.\"\n },\n \"prefix\": {\n \"type\": \"string\",\n \"default\": \"\",\n \"description\": \"Optional key prefix prepended to every backup object (e.g. \\\"innate/\\\" \u{2192} innate/2024-01-01T00:00:00Z.db.gz).\"\n }\n }\n },\n \"auto_backup_interval_hours\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"default\": 24,\n \"description\": \"Minimum hours between automatic backups. A backup is skipped if one already ran within this window. Use innate backup now --force to bypass.\"\n },\n \"retention_days\": {\n \"type\": \"integer\",\n \"minimum\": 1,\n \"default\": 60,\n \"description\": \"Delete remote backups older than this many days during the next backup run.\"\n },\n \"min_backups\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"default\": 5,\n \"description\": \"Always retain at least this many backup files regardless of age (prevents over-pruning).\"\n }\n }\n }\n }\n}\n";