{"owner":"CortexReach","repo":"memory-lancedb-pro","hasSkills":true,"totalSkillsCount":2,"totalTokensCount":10275,"categories":["plugin-manifest","anthropic-skill"],"hasMcp":false,"mcpConfig":null,"found":["openclaw.plugin.json","skills/lesson/SKILL.md"],"skills":{"openclaw.plugin.json":"{\n  \"id\": \"memory-lancedb-pro\",\n  \"name\": \"Memory (LanceDB Pro)\",\n  \"description\": \"Enhanced LanceDB-backed long-term memory with hybrid retrieval, multi-scope isolation, long-context chunking, and management CLI\",\n  \"version\": \"1.1.0-beta.11\",\n  \"kind\": \"memory\",\n  \"skills\": [\n    \"./skills\"\n  ],\n  \"commandAliases\": [\n    {\n      \"name\": \"dreaming\",\n      \"kind\": \"runtime-slash\",\n      \"cliCommand\": \"memory\"\n    }\n  ],\n  \"cliCommands\": [\n    {\n      \"name\": \"memory-pro\",\n      \"description\": \"Enhanced memory management commands (LanceDB Pro)\",\n      \"hasSubcommands\": true\n    }\n  ],\n  \"hooks\": {\n    \"allowConversationAccess\": true\n  },\n  \"configSchema\": {\n    \"type\": \"object\",\n    \"additionalProperties\": false,\n    \"properties\": {\n      \"embedding\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"provider\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"openai-compatible\",\n              \"azure-openai\"\n            ]\n          },\n          \"apiKey\": {\n            \"oneOf\": [\n              {\n                \"type\": \"string\",\n                \"minLength\": 1\n              },\n              {\n                \"type\": \"object\",\n                \"additionalProperties\": true,\n                \"required\": [\n                  \"source\",\n                  \"id\"\n                ],\n                \"properties\": {\n                  \"source\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"env\",\n                      \"file\"\n                    ]\n                  },\n                  \"provider\": {\n                    \"type\": \"string\"\n                  },\n                  \"id\": {\n                    \"type\": \"string\",\n                    \"minLength\": 1\n                  }\n                }\n              },\n              {\n                \"type\": \"array\",\n                \"items\": {\n                  \"oneOf\": [\n                    {\n                      \"type\": \"string\",\n                      \"minLength\": 1\n                    },\n                    {\n                      \"type\": \"object\",\n                      \"additionalProperties\": true,\n                      \"required\": [\n                        \"source\",\n                        \"id\"\n                      ],\n                      \"properties\": {\n                        \"source\": {\n                          \"type\": \"string\",\n                          \"enum\": [\n                            \"env\",\n                            \"file\"\n                          ]\n                        },\n                        \"provider\": {\n                          \"type\": \"string\"\n                        },\n                        \"id\": {\n                          \"type\": \"string\",\n                          \"minLength\": 1\n                        }\n                      }\n                    }\n                  ]\n                },\n                \"minItems\": 1\n              }\n            ],\n            \"description\": \"Single API key, SecretRef, or array of keys/SecretRefs for round-robin rotation\"\n          },\n          \"model\": {\n            \"type\": \"string\"\n          },\n          \"baseURL\": {\n            \"type\": \"string\"\n          },\n          \"dimensions\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"description\": \"Internal vector dimensions for LanceDB schema sizing and local embedding validation\"\n          },\n          \"requestDimensions\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"description\": \"Optional dimensions/output_dimension value to send to embedding providers that support variable output sizes\"\n          },\n          \"omitDimensions\": {\n            \"type\": \"boolean\",\n            \"description\": \"When true, omit dimensions/output_dimension from embedding requests even if requestDimensions is configured\"\n          },\n          \"taskQuery\": {\n            \"type\": \"string\",\n            \"description\": \"Embedding task for queries (provider-specific, e.g. Jina: retrieval.query)\"\n          },\n          \"taskPassage\": {\n            \"type\": \"string\",\n            \"description\": \"Embedding task for passages/documents (provider-specific, e.g. Jina: retrieval.passage)\"\n          },\n          \"normalized\": {\n            \"type\": \"boolean\",\n            \"description\": \"Request normalized embeddings when supported by the provider (e.g. Jina v5)\"\n          },\n          \"maxInputChars\": {\n            \"type\": \"integer\",\n            \"minimum\": 100,\n            \"description\": \"Maximum characters sent to the embedding provider per request. With automatic chunking enabled, longer documents are split before this cap is applied to each provider request; with chunking disabled, excess text is truncated.\"\n          },\n          \"chunking\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Enable automatic chunking for documents exceeding embedding context limits\"\n          },\n          \"astChunking\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"description\": \"Experimental code-boundary-aware chunking for supported code blocks. Disabled by default and falls back to normal chunking when unsupported.\",\n            \"properties\": {\n              \"enabled\": {\n                \"type\": \"boolean\",\n                \"default\": false,\n                \"description\": \"Enable code-boundary-aware chunking for JavaScript, TypeScript, and Python code blocks\"\n              },\n              \"languages\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"javascript\",\n                    \"typescript\",\n                    \"python\"\n                  ]\n                },\n                \"default\": [\n                  \"javascript\",\n                  \"typescript\",\n                  \"python\"\n                ],\n                \"description\": \"Languages eligible for code-boundary-aware chunking\"\n              }\n            }\n          },\n          \"clientTimeoutMs\": {\n            \"type\": \"integer\",\n            \"minimum\": 1000,\n            \"default\": 30000,\n            \"description\": \"OpenAI-compatible SDK HTTP timeout in milliseconds for embedding requests. Startup health checks use a separate shorter abort signal.\"\n          },\n          \"apiVersion\": {\n            \"type\": \"string\",\n            \"description\": \"API version for Azure OpenAI (e.g. 2024-02-01). Only used when provider is azure-openai.\"\n          }\n        },\n        \"required\": [\n          \"apiKey\"\n        ]\n      },\n      \"dbPath\": {\n        \"type\": \"string\"\n      },\n      \"maxInputChars\": {\n        \"type\": \"integer\",\n        \"minimum\": 100,\n        \"description\": \"Legacy top-level alias for embedding.maxInputChars.\"\n      },\n      \"storageMaintenance\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"description\": \"Optional LanceDB table maintenance for pruning old version snapshots with table.optimize(). Disabled by default.\",\n        \"properties\": {\n          \"autoCleanup\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"enabled\": {\n                \"type\": \"boolean\",\n                \"default\": false,\n                \"description\": \"Enable scheduled LanceDB table.optimize() cleanup.\"\n              },\n              \"intervalHours\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"default\": 24,\n                \"description\": \"Hours between scheduled storage maintenance runs.\"\n              },\n              \"retentionDays\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"default\": 7,\n                \"description\": \"Keep LanceDB table versions newer than this many days.\"\n              },\n              \"initialDelayMs\": {\n                \"type\": \"integer\",\n                \"minimum\": 0,\n                \"default\": 300000,\n                \"description\": \"Delay before the first storage maintenance run after service start.\"\n              }\n            }\n          },\n          \"readConsistencyIntervalSeconds\": {\n            \"type\": \"integer\",\n            \"minimum\": 0,\n            \"default\": 0,\n            \"description\": \"Seconds between checks for LanceDB table updates committed by other processes (e.g. a CLI delete-bulk while this service holds a long-lived read handle). 0 means strong consistency: every read checks for updates.\"\n          }\n        }\n      },\n      \"redisUrl\": {\n        \"type\": \"string\",\n        \"description\": \"Optional shortcut for enabling Redis distributed write locking. Prefer locking.redis.url for new configs.\"\n      },\n      \"locking\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"description\": \"Optional external locking configuration for high-concurrency or multi-instance deployments.\",\n        \"properties\": {\n          \"redis\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"enabled\": {\n                \"type\": \"boolean\",\n                \"default\": false,\n                \"description\": \"Use Redis SET NX PX write locks before mutating LanceDB. When enabled, Redis lock failures fail writes closed instead of falling back to local file locks.\"\n              },\n              \"url\": {\n                \"type\": \"string\",\n                \"description\": \"Redis connection URL. May include ${ENV_VAR} placeholders.\"\n              },\n              \"keyPrefix\": {\n                \"type\": \"string\",\n                \"default\": \"memory-lancedb-pro:write-lock\",\n                \"description\": \"Prefix for Redis lock keys.\"\n              },\n              \"ttlMs\": {\n                \"type\": \"integer\",\n                \"minimum\": 1000,\n                \"default\": 60000,\n                \"description\": \"Redis lock TTL in milliseconds.\"\n              },\n              \"acquireTimeoutMs\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"default\": 5000,\n                \"description\": \"Maximum time to wait for the Redis lock before failing the write so the caller can retry later.\"\n              },\n              \"retryDelayMs\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"default\": 50,\n                \"description\": \"Initial Redis lock retry delay in milliseconds. Retries use exponential backoff.\"\n              },\n              \"connectTimeoutMs\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"default\": 1000,\n                \"description\": \"Redis connection timeout in milliseconds.\"\n              }\n            }\n          }\n        }\n      },\n      \"enableManagementTools\": {\n        \"type\": \"boolean\",\n        \"default\": false,\n        \"description\": \"Enable management/debug tools such as memory_list, memory_stats, and governance-oriented self-improvement review/extract actions\"\n      },\n      \"manualStoreSupersede\": {\n        \"type\": \"boolean\",\n        \"default\": false,\n        \"description\": \"Manual-priority store lane: a memory_store that finds a similar existing memory supersedes it instead of being rejected as a duplicate; the manual text always lands verbatim. Off by default to preserve the classic duplicate check.\"\n      },\n      \"sessionStrategy\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"memoryReflection\",\n          \"systemSessionMemory\",\n          \"none\"\n        ],\n        \"default\": \"none\",\n        \"description\": \"Choose session pipeline: plugin memory-reflection, built-in session-memory, or none. Default none keeps session summaries disabled unless explicitly enabled.\"\n      },\n      \"autoCapture\": {\n        \"type\": \"boolean\",\n        \"default\": true\n      },\n      \"autoRecall\": {\n        \"type\": \"boolean\",\n        \"default\": false\n      },\n      \"autoRecallMinLength\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 200,\n        \"default\": 15,\n        \"description\": \"Minimum prompt length (in characters) to trigger auto-recall. Prompts shorter than this are skipped. Default: 15 for English, 6 for CJK.\"\n      },\n      \"autoRecallMinRepeated\": {\n        \"type\": \"integer\",\n        \"minimum\": 0,\n        \"maximum\": 100,\n        \"default\": 8,\n        \"description\": \"Minimum number of turns before the same memory can be recalled again in the same session. Set to 0 to disable deduplication.\"\n      },\n      \"autoRecallBadRecallDecayMs\": {\n        \"type\": \"integer\",\n        \"minimum\": 0,\n        \"default\": 86400000,\n        \"$comment\": \"No maximum: 0 disables decay; very large values also effectively disable. Unlike sibling autoRecall* integers, this is a time window with no natural upper bound.\",\n        \"description\": \"If a memory's last auto-recall injection was more than this many ms ago, its bad_recall_count is reset to 0 on the next injection. 0 disables decay. Default: 86400000 (24 hours).\"\n      },\n      \"autoRecallSuppressionDurationMs\": {\n        \"type\": \"integer\",\n        \"minimum\": 0,\n        \"default\": 1800000,\n        \"$comment\": \"No maximum: 0 effectively disables suppression; large values allow long quarantine windows.\",\n        \"description\": \"When bad_recall_count reaches the suppression threshold, the memory is suppressed from auto-recall for this many ms from now. Default: 1800000 (30 minutes).\"\n      },\n      \"autoRecallTimeoutMs\": {\n        \"type\": \"integer\",\n        \"minimum\": 500,\n        \"maximum\": 60000,\n        \"default\": 5000,\n        \"description\": \"Timeout for the entire auto-recall pipeline (embedding + search + rerank) in milliseconds.\"\n      },\n      \"startupCheckTimeoutMs\": {\n        \"type\": \"integer\",\n        \"minimum\": 1000,\n        \"maximum\": 120000,\n        \"default\": 8000,\n        \"description\": \"Outer time budget in milliseconds for each startup health check phase (embedding, retrieval). Raise on hosts where a cold boot exceeds 8 seconds; the checks run after startup and never block the gateway.\"\n      },\n      \"autoRecallMaxItems\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 20,\n        \"default\": 3,\n        \"description\": \"Maximum number of memories auto-injected per turn.\"\n      },\n      \"autoRecallMaxChars\": {\n        \"type\": \"integer\",\n        \"minimum\": 64,\n        \"maximum\": 8000,\n        \"default\": 600,\n        \"description\": \"Maximum total character budget for auto-injected memory summaries.\"\n      },\n      \"autoRecallPerItemMaxChars\": {\n        \"type\": \"integer\",\n        \"minimum\": 32,\n        \"maximum\": 1000,\n        \"default\": 180,\n        \"description\": \"Maximum character budget per auto-injected memory summary.\"\n      },\n      \"autoRecallMaxQueryLength\": {\n        \"type\": \"integer\",\n        \"minimum\": 100,\n        \"maximum\": 10000,\n        \"default\": 2000,\n        \"description\": \"Maximum character length of the auto-recall query before truncation. Default: 2000.\"\n      },\n      \"maxRecallPerTurn\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 50,\n        \"default\": 10,\n        \"description\": \"Hard per-turn injection cap applied after dedup. Acts as a safety ceiling on top of autoRecallMaxItems to prevent context inflation. Default: 10.\"\n      },\n      \"recallMode\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"full\",\n          \"summary\",\n          \"adaptive\",\n          \"off\"\n        ],\n        \"default\": \"full\",\n        \"description\": \"Auto-recall depth mode. 'full': inject with configured per-item budget. 'summary': L0 abstracts only (compact). 'adaptive': analyze query intent to auto-select category and depth. 'off': disable auto-recall injection.\"\n      },\n      \"autoRecallExcludeAgents\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"string\"\n        },\n        \"description\": \"Agent/session patterns excluded from auto-recall and reflection injection. Supports exact match, wildcard prefix (e.g. pi-), and temp:*.\"\n      },\n      \"autoRecallIncludeAgents\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"string\"\n        },\n        \"default\": [],\n        \"description\": \"Whitelist mode for auto-recall injection. Only agents in this list receive auto-recall. Agent resolution falls back to 'main' when no explicit agentId is available. If both include and exclude are set, autoRecallIncludeAgents takes precedence (whitelist wins).\"\n      },\n      \"captureAssistant\": {\n        \"type\": \"boolean\"\n      },\n      \"smartExtraction\": {\n        \"type\": \"boolean\",\n        \"default\": true,\n        \"description\": \"Enable LLM-powered memory extraction. Falls back to regex capture when false.\"\n      },\n      \"extractMinMessages\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 100,\n        \"default\": 4,\n        \"description\": \"Minimum conversation messages required before smart extraction runs.\"\n      },\n      \"autoCaptureContextTurns\": {\n        \"type\": \"integer\",\n        \"minimum\": 0,\n        \"maximum\": 10,\n        \"default\": 0,\n        \"description\": \"Rolling context window for auto-capture extraction: how many recent user turns (with their assistant replies) stay in the transcript across extractions as context. 0 disables retention; each extraction then sees only its own call's turns.\"\n      },\n      \"batchChunkSize\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 50,\n        \"default\": 10,\n        \"description\": \"Per-call chunk bound for the batched pipeline LLM stages: admission utility, dedup decider, and merge writer. Larger bursts split into ceil(N/batchChunkSize) calls. Values above 50 are clamped.\"\n      },\n      \"extractMaxChars\": {\n        \"type\": \"integer\",\n        \"minimum\": 256,\n        \"maximum\": 100000,\n        \"default\": 8000,\n        \"description\": \"Maximum conversation characters sent to the smart extraction LLM.\"\n      },\n      \"admissionControl\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"description\": \"A-MAC-style admission governance on the smart-extraction write path. Rejects low-value candidates before persistence while preserving downstream dedup behavior for admitted candidates.\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": false\n          },\n          \"preset\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"balanced\",\n              \"conservative\",\n              \"high-recall\"\n            ],\n            \"default\": \"balanced\",\n            \"description\": \"Named admission tuning preset. Explicit admissionControl fields still override the selected preset.\"\n          },\n          \"model\": {\n            \"type\": \"string\",\n            \"description\": \"Optional absolute override: when set, every admission LLM call uses this model, regardless of modelAffinity.\"\n          },\n          \"modelAffinity\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"global\",\n              \"lane\"\n            ],\n            \"default\": \"global\",\n            \"description\": \"lane routes reflection-mapped admission calls to memoryReflection.model instead of the global llm model; global uses the plugin's global llm model for every lane.\"\n          },\n          \"utilityMode\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"standalone\",\n              \"off\",\n              \"batch\"\n            ],\n            \"default\": \"standalone\",\n            \"description\": \"standalone scores each candidate with its own LLM call; batch scores a whole extraction's candidates with one call per chunk of up to 10; off disables utility scoring entirely.\"\n          },\n          \"rejectThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.45\n          },\n          \"admitThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.6\n          },\n          \"utilityVetoThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.25,\n            \"description\": \"Utility scores at or below this are rejected regardless of the weighted composite (0 disables the veto)\"\n          },\n          \"noveltyCandidatePoolSize\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 20,\n            \"default\": 8\n          },\n          \"auditMetadata\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"persistRejectedAudits\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"rejectedAuditFilePath\": {\n            \"type\": \"string\",\n            \"description\": \"Optional JSONL file path for durable admission reject audit records. Defaults to a file beside the plugin memory data directory.\"\n          },\n          \"recency\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"halfLifeDays\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"maximum\": 365,\n                \"default\": 14\n              }\n            }\n          },\n          \"weights\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"utility\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.1\n              },\n              \"confidence\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.1\n              },\n              \"novelty\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.1\n              },\n              \"recency\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.1\n              },\n              \"typePrior\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.6\n              }\n            }\n          },\n          \"typePriors\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"profile\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.95\n              },\n              \"preferences\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.9\n              },\n              \"entities\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.75\n              },\n              \"events\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.45\n              },\n              \"cases\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.8\n              },\n              \"patterns\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.85\n              }\n            }\n          }\n        }\n      },\n      \"retrieval\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"mode\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"hybrid\",\n              \"vector\"\n            ],\n            \"default\": \"hybrid\"\n          },\n          \"vectorWeight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.7\n          },\n          \"bm25Weight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"minScore\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"rerank\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"cross-encoder\",\n              \"lightweight\",\n              \"none\"\n            ],\n            \"default\": \"cross-encoder\"\n          },\n          \"rerankApiKey\": {\n            \"oneOf\": [\n              {\n                \"type\": \"string\",\n                \"minLength\": 1\n              },\n              {\n                \"type\": \"object\",\n                \"additionalProperties\": true,\n                \"required\": [\n                  \"source\",\n                  \"id\"\n                ],\n                \"properties\": {\n                  \"source\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"env\",\n                      \"file\"\n                    ]\n                  },\n                  \"provider\": {\n                    \"type\": \"string\"\n                  },\n                  \"id\": {\n                    \"type\": \"string\",\n                    \"minLength\": 1\n                  }\n                }\n              }\n            ],\n            \"description\": \"API key for reranker service (enables cross-encoder reranking)\"\n          },\n          \"rerankModel\": {\n            \"type\": \"string\",\n            \"default\": \"jina-reranker-v3\",\n            \"description\": \"Reranker model name\"\n          },\n          \"rerankEndpoint\": {\n            \"type\": \"string\",\n            \"default\": \"https://api.jina.ai/v1/rerank\",\n            \"description\": \"Reranker API endpoint URL. Compatible with Jina-compatible endpoints and dedicated adapters such as TEI, SiliconFlow, Voyage, Pinecone, and DashScope.\"\n          },\n          \"rerankTimeoutMs\": {\n            \"type\": \"integer\",\n            \"minimum\": 500,\n            \"default\": 5000,\n            \"description\": \"Rerank API timeout in milliseconds (default: 5000). Increase for local/CPU-based rerank servers.\"\n          },\n          \"rerankProvider\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"jina\",\n              \"siliconflow\",\n              \"voyage\",\n              \"pinecone\",\n              \"dashscope\",\n              \"tei\"\n            ],\n            \"default\": \"jina\",\n            \"description\": \"Reranker provider format. Determines request/response shape and auth header. Use tei for Hugging Face Text Embeddings Inference /rerank endpoints. DashScope uses gte-rerank-v2 with endpoint https://dashscope.aliyuncs.com/api/v1/services/rerank/text-rerank/text-rerank.\"\n          },\n          \"candidatePoolSize\": {\n            \"type\": \"integer\",\n            \"minimum\": 10,\n            \"maximum\": 100,\n            \"default\": 20\n          },\n          \"recencyHalfLifeDays\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 365,\n            \"default\": 14,\n            \"description\": \"Half-life in days for recency boost. Newer memories get higher scores. Set 0 to disable.\"\n          },\n          \"recencyWeight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 0.5,\n            \"default\": 0.1,\n            \"description\": \"Maximum recency boost factor added to score\"\n          },\n          \"filterNoise\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Filter out noise memories (agent denials, meta-questions, boilerplate)\"\n          },\n          \"neighborEnrichment\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"default\": {\n              \"enabled\": false,\n              \"maxPerResult\": 2\n            },\n            \"description\": \"Default-off retrieval-time BM25 neighbor enrichment for hybrid search results.\",\n            \"properties\": {\n              \"enabled\": {\n                \"type\": \"boolean\",\n                \"default\": false,\n                \"description\": \"Attach bounded same-scope BM25 neighbors to each top-level hybrid retrieval result.\"\n              },\n              \"maxPerResult\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"maximum\": 5,\n                \"default\": 2,\n                \"description\": \"Maximum supplemental neighbors to attach per top-level result.\"\n              }\n            }\n          },\n          \"disableNativeCosine\": {\n            \"type\": \"boolean\",\n            \"default\": false,\n            \"description\": \"Disable LanceDB native vector search and rank scoped rows with JavaScript cosine. Enable on AVX-only Linux x64 CPUs that crash with SIGILL in LanceDB native vector search.\"\n          },\n          \"lengthNormAnchor\": {\n            \"type\": \"integer\",\n            \"minimum\": 0,\n            \"maximum\": 5000,\n            \"default\": 500,\n            \"description\": \"Length normalization anchor in chars. Entries longer than this get score penalized. Set 0 to disable.\"\n          },\n          \"hardMinScore\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.35,\n            \"description\": \"Hard cutoff after all scoring stages. Results below this score are discarded.\"\n          },\n          \"timeDecayHalfLifeDays\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 365,\n            \"default\": 60,\n            \"description\": \"Time decay half-life in days. Old entries lose score gradually. Floor at 0.5x. Set 0 to disable.\"\n          },\n          \"reinforcementFactor\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 2,\n            \"default\": 0.5,\n            \"description\": \"Access reinforcement factor for time decay. Frequently recalled memories decay slower. 0 to disable.\"\n          },\n          \"maxHalfLifeMultiplier\": {\n            \"type\": \"number\",\n            \"minimum\": 1,\n            \"maximum\": 10,\n            \"default\": 3,\n            \"description\": \"Maximum half-life multiplier from access reinforcement. Prevents frequently accessed memories from becoming immortal.\"\n          }\n        }\n      },\n      \"decay\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"recencyHalfLifeDays\": {\n            \"type\": \"number\",\n            \"minimum\": 1,\n            \"maximum\": 365,\n            \"default\": 30\n          },\n          \"recencyWeight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.4\n          },\n          \"frequencyWeight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"intrinsicWeight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"staleThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"searchBoostMin\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"importanceModulation\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 10,\n            \"default\": 1.5\n          },\n          \"betaCore\": {\n            \"type\": \"number\",\n            \"minimum\": 0.1,\n            \"maximum\": 5,\n            \"default\": 0.8\n          },\n          \"betaWorking\": {\n            \"type\": \"number\",\n            \"minimum\": 0.1,\n            \"maximum\": 5,\n            \"default\": 1\n          },\n          \"betaPeripheral\": {\n            \"type\": \"number\",\n            \"minimum\": 0.1,\n            \"maximum\": 5,\n            \"default\": 1.3\n          },\n          \"coreDecayFloor\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.9\n          },\n          \"workingDecayFloor\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.7\n          },\n          \"peripheralDecayFloor\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.5\n          }\n        }\n      },\n      \"tier\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"coreAccessThreshold\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 1000,\n            \"default\": 10\n          },\n          \"coreCompositeThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.7\n          },\n          \"coreImportanceThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.8\n          },\n          \"peripheralCompositeThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.15\n          },\n          \"peripheralAgeDays\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 3650,\n            \"default\": 60\n          },\n          \"workingAccessThreshold\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 1000,\n            \"default\": 3\n          },\n          \"workingCompositeThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.4\n          }\n        }\n      },\n      \"sessionMemory\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"description\": \"Deprecated legacy switch. Kept for compatibility and mapped to sessionStrategy.\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": false,\n            \"description\": \"Deprecated. true -> sessionStrategy=systemSessionMemory, false -> sessionStrategy=none. Disabled by default.\"\n          },\n          \"messageCount\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 100,\n            \"default\": 15,\n            \"description\": \"Legacy compatibility field. Mapped to memoryReflection.messageCount.\"\n          }\n        }\n      },\n      \"selfImprovement\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"beforeResetNote\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"skipSubagentBootstrap\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"ensureLearningFiles\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"maxEntries\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"default\": 500,\n            \"description\": \"Maximum number of entries to retain per .learnings file before new appends are skipped.\"\n          }\n        }\n      },\n      \"canonicalCorpus\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Index canonical OpenClaw memory files into LanceDB while keeping the files as source of truth.\"\n          },\n          \"syncOnSearch\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Refresh canonical corpus entries opportunistically before memory runtime searches.\"\n          },\n          \"syncIntervalMs\": {\n            \"type\": \"integer\",\n            \"minimum\": 0,\n            \"default\": 60000,\n            \"description\": \"Minimum interval between opportunistic canonical corpus sync attempts.\"\n          },\n          \"includeMemoryDir\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Index MEMORY.md and memory/**/*.md from configured OpenClaw workspaces.\"\n          },\n          \"includeSessionTranscripts\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Index recent OpenClaw session JSONL transcripts as grounded session-source search results.\"\n          },\n          \"includeDreamingArtifacts\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Index memory/dreaming/**/*.md as dream-report public artifacts.\"\n          },\n          \"maxSessionFilesPerAgent\": {\n            \"type\": \"integer\",\n            \"minimum\": 0,\n            \"default\": 25,\n            \"description\": \"Maximum recent session transcript files to index per agent.\"\n          },\n          \"maxFileBytes\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"default\": 1000000,\n            \"description\": \"Skip canonical corpus files larger than this size.\"\n          }\n        }\n      },\n      \"dreaming\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\"\n          },\n          \"frequency\": {\n            \"type\": \"string\"\n          },\n          \"model\": {\n            \"type\": \"string\"\n          },\n          \"timezone\": {\n            \"type\": \"string\"\n          },\n          \"verboseLogging\": {\n            \"type\": \"boolean\"\n          },\n          \"storage\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"mode\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"inline\",\n                  \"separate\",\n                  \"both\"\n                ]\n              },\n              \"separateReports\": {\n                \"type\": \"boolean\"\n              }\n            }\n          },\n          \"execution\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"defaults\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"speed\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"fast\",\n                      \"balanced\",\n                      \"slow\"\n                    ]\n                  },\n                  \"thinking\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"low\",\n                      \"medium\",\n                      \"high\"\n                    ]\n                  },\n                  \"budget\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"cheap\",\n                      \"medium\",\n                      \"expensive\"\n                    ]\n                  },\n                  \"model\": {\n                    \"type\": \"string\"\n                  },\n                  \"maxOutputTokens\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 1\n                  },\n                  \"temperature\": {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"maximum\": 2\n                  },\n                  \"timeoutMs\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 1000\n                  }\n                }\n              }\n            }\n          },\n          \"phases\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"light\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"enabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"lookbackDays\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"limit\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"dedupeSimilarity\": {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"maximum\": 1\n                  },\n                  \"sources\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"daily\",\n                        \"sessions\",\n                        \"recall\"\n                      ]\n                    }\n                  },\n                  \"execution\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"speed\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"fast\",\n                          \"balanced\",\n                          \"slow\"\n                        ]\n                      },\n                      \"thinking\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"low\",\n                          \"medium\",\n                          \"high\"\n                        ]\n                      },\n                      \"budget\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"cheap\",\n                          \"medium\",\n                          \"expensive\"\n                        ]\n                      },\n                      \"model\": {\n                        \"type\": \"string\"\n                      },\n                      \"maxOutputTokens\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1\n                      },\n                      \"temperature\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 2\n                      },\n                      \"timeoutMs\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1000\n                      }\n                    }\n                  }\n                }\n              },\n              \"deep\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"enabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"limit\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"minScore\": {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"maximum\": 1\n                  },\n                  \"minRecallCount\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"minUniqueQueries\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"recencyHalfLifeDays\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"maxAgeDays\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 1\n                  },\n                  \"sources\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"daily\",\n                        \"memory\",\n                        \"sessions\",\n                        \"logs\",\n                        \"recall\"\n                      ]\n                    }\n                  },\n                  \"recovery\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"triggerBelowHealth\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 1\n                      },\n                      \"lookbackDays\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 0\n                      },\n                      \"maxRecoveredCandidates\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 0\n                      },\n                      \"minRecoveryConfidence\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 1\n                      },\n                      \"autoWriteMinConfidence\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 1\n                      }\n                    }\n                  },\n                  \"execution\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"speed\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"fast\",\n                          \"balanced\",\n                          \"slow\"\n                        ]\n                      },\n                      \"thinking\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"low\",\n                          \"medium\",\n                          \"high\"\n                        ]\n                      },\n                      \"budget\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"cheap\",\n                          \"medium\",\n                          \"expensive\"\n                        ]\n                      },\n                      \"model\": {\n                        \"type\": \"string\"\n                      },\n                      \"maxOutputTokens\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1\n                      },\n                      \"temperature\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 2\n                      },\n                      \"timeoutMs\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1000\n                      }\n                    }\n                  }\n                }\n              },\n              \"rem\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"enabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"lookbackDays\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"limit\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"minPatternStrength\": {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"maximum\": 1\n                  },\n                  \"sources\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"memory\",\n                        \"daily\",\n                        \"deep\"\n                      ]\n                    }\n                  },\n                  \"execution\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"speed\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"fast\",\n                          \"balanced\",\n                          \"slow\"\n                        ]\n                      },\n                      \"thinking\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"low\",\n                          \"medium\",\n                          \"high\"\n                        ]\n                      },\n                      \"budget\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"cheap\",\n                          \"medium\",\n                          \"expensive\"\n                        ]\n                      },\n                      \"model\": {\n                        \"type\": \"string\"\n                      },\n                      \"maxOutputTokens\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1\n                      },\n                      \"temperature\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 2\n                      },\n                      \"timeoutMs\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1000\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      },\n      \"memoryReflection\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"storeToLanceDB\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"writeLegacyCombined\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"injectMode\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"inheritance-only\",\n              \"inheritance+derived\"\n            ],\n            \"default\": \"inheritance+derived\"\n          },\n          \"agentId\": {\n            \"type\": \"string\",\n            \"description\": \"Optional dedicated agent id used to run reflection generation (for example: memory-distiller).\"\n          },\n          \"model\": {\n            \"type\": \"string\",\n            \"description\": \"Optional provider/model override used to generate the reflection. Falls back to the reflection agent's primary model, then the plugin llm.model.\"\n          },\n          \"messageCount\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 500,\n            \"default\": 120\n","skills/lesson/SKILL.md":"---\nname: lesson\ndescription: Store a lesson learned from the current conversation. Triggered by /lesson command. Use when Master signals that the recent conversation contains a pitfall, fix, or key insight that should be persisted to long-term memory.\nmetadata: { \"openclaw\": { \"requires\": { \"config\": [\"plugins.entries.memory-lancedb-pro.enabled\"] } } }\n---\n\n# Lesson Extraction & Storage\n\nWhen triggered, extract and store lessons from the **recent conversation context**.\n\n## Steps\n\n1. **Scan recent context** — identify the pitfall, bug fix, or key insight just discussed\n2. **Store technical layer** (category: fact, importance ≥ 0.8):\n   ```\n   Pitfall: [symptom]. Cause: [root cause]. Fix: [solution]. Prevention: [how to avoid].\n   ```\n3. **Store principle layer** (category: decision, importance ≥ 0.85):\n   ```\n   Decision principle ([tag]): [behavioral rule]. Trigger: [when]. Action: [what to do].\n   ```\n4. **Verify** — `memory_recall` with anchor keywords to confirm both entries retrievable\n5. **Report** — tell Master what was stored (brief summary)\n\n## Rules\n\n- Keep entries short and atomic (< 500 chars each)\n- If the lesson also affects a checklist or SKILL.md, update those files too\n- If no clear lesson is found in recent context, ask Master what to store\n"},"files":{"openclaw.plugin.json":"{\n  \"id\": \"memory-lancedb-pro\",\n  \"name\": \"Memory (LanceDB Pro)\",\n  \"description\": \"Enhanced LanceDB-backed long-term memory with hybrid retrieval, multi-scope isolation, long-context chunking, and management CLI\",\n  \"version\": \"1.1.0-beta.11\",\n  \"kind\": \"memory\",\n  \"skills\": [\n    \"./skills\"\n  ],\n  \"commandAliases\": [\n    {\n      \"name\": \"dreaming\",\n      \"kind\": \"runtime-slash\",\n      \"cliCommand\": \"memory\"\n    }\n  ],\n  \"cliCommands\": [\n    {\n      \"name\": \"memory-pro\",\n      \"description\": \"Enhanced memory management commands (LanceDB Pro)\",\n      \"hasSubcommands\": true\n    }\n  ],\n  \"hooks\": {\n    \"allowConversationAccess\": true\n  },\n  \"configSchema\": {\n    \"type\": \"object\",\n    \"additionalProperties\": false,\n    \"properties\": {\n      \"embedding\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"provider\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"openai-compatible\",\n              \"azure-openai\"\n            ]\n          },\n          \"apiKey\": {\n            \"oneOf\": [\n              {\n                \"type\": \"string\",\n                \"minLength\": 1\n              },\n              {\n                \"type\": \"object\",\n                \"additionalProperties\": true,\n                \"required\": [\n                  \"source\",\n                  \"id\"\n                ],\n                \"properties\": {\n                  \"source\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"env\",\n                      \"file\"\n                    ]\n                  },\n                  \"provider\": {\n                    \"type\": \"string\"\n                  },\n                  \"id\": {\n                    \"type\": \"string\",\n                    \"minLength\": 1\n                  }\n                }\n              },\n              {\n                \"type\": \"array\",\n                \"items\": {\n                  \"oneOf\": [\n                    {\n                      \"type\": \"string\",\n                      \"minLength\": 1\n                    },\n                    {\n                      \"type\": \"object\",\n                      \"additionalProperties\": true,\n                      \"required\": [\n                        \"source\",\n                        \"id\"\n                      ],\n                      \"properties\": {\n                        \"source\": {\n                          \"type\": \"string\",\n                          \"enum\": [\n                            \"env\",\n                            \"file\"\n                          ]\n                        },\n                        \"provider\": {\n                          \"type\": \"string\"\n                        },\n                        \"id\": {\n                          \"type\": \"string\",\n                          \"minLength\": 1\n                        }\n                      }\n                    }\n                  ]\n                },\n                \"minItems\": 1\n              }\n            ],\n            \"description\": \"Single API key, SecretRef, or array of keys/SecretRefs for round-robin rotation\"\n          },\n          \"model\": {\n            \"type\": \"string\"\n          },\n          \"baseURL\": {\n            \"type\": \"string\"\n          },\n          \"dimensions\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"description\": \"Internal vector dimensions for LanceDB schema sizing and local embedding validation\"\n          },\n          \"requestDimensions\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"description\": \"Optional dimensions/output_dimension value to send to embedding providers that support variable output sizes\"\n          },\n          \"omitDimensions\": {\n            \"type\": \"boolean\",\n            \"description\": \"When true, omit dimensions/output_dimension from embedding requests even if requestDimensions is configured\"\n          },\n          \"taskQuery\": {\n            \"type\": \"string\",\n            \"description\": \"Embedding task for queries (provider-specific, e.g. Jina: retrieval.query)\"\n          },\n          \"taskPassage\": {\n            \"type\": \"string\",\n            \"description\": \"Embedding task for passages/documents (provider-specific, e.g. Jina: retrieval.passage)\"\n          },\n          \"normalized\": {\n            \"type\": \"boolean\",\n            \"description\": \"Request normalized embeddings when supported by the provider (e.g. Jina v5)\"\n          },\n          \"maxInputChars\": {\n            \"type\": \"integer\",\n            \"minimum\": 100,\n            \"description\": \"Maximum characters sent to the embedding provider per request. With automatic chunking enabled, longer documents are split before this cap is applied to each provider request; with chunking disabled, excess text is truncated.\"\n          },\n          \"chunking\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Enable automatic chunking for documents exceeding embedding context limits\"\n          },\n          \"astChunking\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"description\": \"Experimental code-boundary-aware chunking for supported code blocks. Disabled by default and falls back to normal chunking when unsupported.\",\n            \"properties\": {\n              \"enabled\": {\n                \"type\": \"boolean\",\n                \"default\": false,\n                \"description\": \"Enable code-boundary-aware chunking for JavaScript, TypeScript, and Python code blocks\"\n              },\n              \"languages\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"javascript\",\n                    \"typescript\",\n                    \"python\"\n                  ]\n                },\n                \"default\": [\n                  \"javascript\",\n                  \"typescript\",\n                  \"python\"\n                ],\n                \"description\": \"Languages eligible for code-boundary-aware chunking\"\n              }\n            }\n          },\n          \"clientTimeoutMs\": {\n            \"type\": \"integer\",\n            \"minimum\": 1000,\n            \"default\": 30000,\n            \"description\": \"OpenAI-compatible SDK HTTP timeout in milliseconds for embedding requests. Startup health checks use a separate shorter abort signal.\"\n          },\n          \"apiVersion\": {\n            \"type\": \"string\",\n            \"description\": \"API version for Azure OpenAI (e.g. 2024-02-01). Only used when provider is azure-openai.\"\n          }\n        },\n        \"required\": [\n          \"apiKey\"\n        ]\n      },\n      \"dbPath\": {\n        \"type\": \"string\"\n      },\n      \"maxInputChars\": {\n        \"type\": \"integer\",\n        \"minimum\": 100,\n        \"description\": \"Legacy top-level alias for embedding.maxInputChars.\"\n      },\n      \"storageMaintenance\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"description\": \"Optional LanceDB table maintenance for pruning old version snapshots with table.optimize(). Disabled by default.\",\n        \"properties\": {\n          \"autoCleanup\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"enabled\": {\n                \"type\": \"boolean\",\n                \"default\": false,\n                \"description\": \"Enable scheduled LanceDB table.optimize() cleanup.\"\n              },\n              \"intervalHours\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"default\": 24,\n                \"description\": \"Hours between scheduled storage maintenance runs.\"\n              },\n              \"retentionDays\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"default\": 7,\n                \"description\": \"Keep LanceDB table versions newer than this many days.\"\n              },\n              \"initialDelayMs\": {\n                \"type\": \"integer\",\n                \"minimum\": 0,\n                \"default\": 300000,\n                \"description\": \"Delay before the first storage maintenance run after service start.\"\n              }\n            }\n          },\n          \"readConsistencyIntervalSeconds\": {\n            \"type\": \"integer\",\n            \"minimum\": 0,\n            \"default\": 0,\n            \"description\": \"Seconds between checks for LanceDB table updates committed by other processes (e.g. a CLI delete-bulk while this service holds a long-lived read handle). 0 means strong consistency: every read checks for updates.\"\n          }\n        }\n      },\n      \"redisUrl\": {\n        \"type\": \"string\",\n        \"description\": \"Optional shortcut for enabling Redis distributed write locking. Prefer locking.redis.url for new configs.\"\n      },\n      \"locking\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"description\": \"Optional external locking configuration for high-concurrency or multi-instance deployments.\",\n        \"properties\": {\n          \"redis\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"enabled\": {\n                \"type\": \"boolean\",\n                \"default\": false,\n                \"description\": \"Use Redis SET NX PX write locks before mutating LanceDB. When enabled, Redis lock failures fail writes closed instead of falling back to local file locks.\"\n              },\n              \"url\": {\n                \"type\": \"string\",\n                \"description\": \"Redis connection URL. May include ${ENV_VAR} placeholders.\"\n              },\n              \"keyPrefix\": {\n                \"type\": \"string\",\n                \"default\": \"memory-lancedb-pro:write-lock\",\n                \"description\": \"Prefix for Redis lock keys.\"\n              },\n              \"ttlMs\": {\n                \"type\": \"integer\",\n                \"minimum\": 1000,\n                \"default\": 60000,\n                \"description\": \"Redis lock TTL in milliseconds.\"\n              },\n              \"acquireTimeoutMs\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"default\": 5000,\n                \"description\": \"Maximum time to wait for the Redis lock before failing the write so the caller can retry later.\"\n              },\n              \"retryDelayMs\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"default\": 50,\n                \"description\": \"Initial Redis lock retry delay in milliseconds. Retries use exponential backoff.\"\n              },\n              \"connectTimeoutMs\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"default\": 1000,\n                \"description\": \"Redis connection timeout in milliseconds.\"\n              }\n            }\n          }\n        }\n      },\n      \"enableManagementTools\": {\n        \"type\": \"boolean\",\n        \"default\": false,\n        \"description\": \"Enable management/debug tools such as memory_list, memory_stats, and governance-oriented self-improvement review/extract actions\"\n      },\n      \"manualStoreSupersede\": {\n        \"type\": \"boolean\",\n        \"default\": false,\n        \"description\": \"Manual-priority store lane: a memory_store that finds a similar existing memory supersedes it instead of being rejected as a duplicate; the manual text always lands verbatim. Off by default to preserve the classic duplicate check.\"\n      },\n      \"sessionStrategy\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"memoryReflection\",\n          \"systemSessionMemory\",\n          \"none\"\n        ],\n        \"default\": \"none\",\n        \"description\": \"Choose session pipeline: plugin memory-reflection, built-in session-memory, or none. Default none keeps session summaries disabled unless explicitly enabled.\"\n      },\n      \"autoCapture\": {\n        \"type\": \"boolean\",\n        \"default\": true\n      },\n      \"autoRecall\": {\n        \"type\": \"boolean\",\n        \"default\": false\n      },\n      \"autoRecallMinLength\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 200,\n        \"default\": 15,\n        \"description\": \"Minimum prompt length (in characters) to trigger auto-recall. Prompts shorter than this are skipped. Default: 15 for English, 6 for CJK.\"\n      },\n      \"autoRecallMinRepeated\": {\n        \"type\": \"integer\",\n        \"minimum\": 0,\n        \"maximum\": 100,\n        \"default\": 8,\n        \"description\": \"Minimum number of turns before the same memory can be recalled again in the same session. Set to 0 to disable deduplication.\"\n      },\n      \"autoRecallBadRecallDecayMs\": {\n        \"type\": \"integer\",\n        \"minimum\": 0,\n        \"default\": 86400000,\n        \"$comment\": \"No maximum: 0 disables decay; very large values also effectively disable. Unlike sibling autoRecall* integers, this is a time window with no natural upper bound.\",\n        \"description\": \"If a memory's last auto-recall injection was more than this many ms ago, its bad_recall_count is reset to 0 on the next injection. 0 disables decay. Default: 86400000 (24 hours).\"\n      },\n      \"autoRecallSuppressionDurationMs\": {\n        \"type\": \"integer\",\n        \"minimum\": 0,\n        \"default\": 1800000,\n        \"$comment\": \"No maximum: 0 effectively disables suppression; large values allow long quarantine windows.\",\n        \"description\": \"When bad_recall_count reaches the suppression threshold, the memory is suppressed from auto-recall for this many ms from now. Default: 1800000 (30 minutes).\"\n      },\n      \"autoRecallTimeoutMs\": {\n        \"type\": \"integer\",\n        \"minimum\": 500,\n        \"maximum\": 60000,\n        \"default\": 5000,\n        \"description\": \"Timeout for the entire auto-recall pipeline (embedding + search + rerank) in milliseconds.\"\n      },\n      \"startupCheckTimeoutMs\": {\n        \"type\": \"integer\",\n        \"minimum\": 1000,\n        \"maximum\": 120000,\n        \"default\": 8000,\n        \"description\": \"Outer time budget in milliseconds for each startup health check phase (embedding, retrieval). Raise on hosts where a cold boot exceeds 8 seconds; the checks run after startup and never block the gateway.\"\n      },\n      \"autoRecallMaxItems\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 20,\n        \"default\": 3,\n        \"description\": \"Maximum number of memories auto-injected per turn.\"\n      },\n      \"autoRecallMaxChars\": {\n        \"type\": \"integer\",\n        \"minimum\": 64,\n        \"maximum\": 8000,\n        \"default\": 600,\n        \"description\": \"Maximum total character budget for auto-injected memory summaries.\"\n      },\n      \"autoRecallPerItemMaxChars\": {\n        \"type\": \"integer\",\n        \"minimum\": 32,\n        \"maximum\": 1000,\n        \"default\": 180,\n        \"description\": \"Maximum character budget per auto-injected memory summary.\"\n      },\n      \"autoRecallMaxQueryLength\": {\n        \"type\": \"integer\",\n        \"minimum\": 100,\n        \"maximum\": 10000,\n        \"default\": 2000,\n        \"description\": \"Maximum character length of the auto-recall query before truncation. Default: 2000.\"\n      },\n      \"maxRecallPerTurn\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 50,\n        \"default\": 10,\n        \"description\": \"Hard per-turn injection cap applied after dedup. Acts as a safety ceiling on top of autoRecallMaxItems to prevent context inflation. Default: 10.\"\n      },\n      \"recallMode\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"full\",\n          \"summary\",\n          \"adaptive\",\n          \"off\"\n        ],\n        \"default\": \"full\",\n        \"description\": \"Auto-recall depth mode. 'full': inject with configured per-item budget. 'summary': L0 abstracts only (compact). 'adaptive': analyze query intent to auto-select category and depth. 'off': disable auto-recall injection.\"\n      },\n      \"autoRecallExcludeAgents\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"string\"\n        },\n        \"description\": \"Agent/session patterns excluded from auto-recall and reflection injection. Supports exact match, wildcard prefix (e.g. pi-), and temp:*.\"\n      },\n      \"autoRecallIncludeAgents\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"string\"\n        },\n        \"default\": [],\n        \"description\": \"Whitelist mode for auto-recall injection. Only agents in this list receive auto-recall. Agent resolution falls back to 'main' when no explicit agentId is available. If both include and exclude are set, autoRecallIncludeAgents takes precedence (whitelist wins).\"\n      },\n      \"captureAssistant\": {\n        \"type\": \"boolean\"\n      },\n      \"smartExtraction\": {\n        \"type\": \"boolean\",\n        \"default\": true,\n        \"description\": \"Enable LLM-powered memory extraction. Falls back to regex capture when false.\"\n      },\n      \"extractMinMessages\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 100,\n        \"default\": 4,\n        \"description\": \"Minimum conversation messages required before smart extraction runs.\"\n      },\n      \"autoCaptureContextTurns\": {\n        \"type\": \"integer\",\n        \"minimum\": 0,\n        \"maximum\": 10,\n        \"default\": 0,\n        \"description\": \"Rolling context window for auto-capture extraction: how many recent user turns (with their assistant replies) stay in the transcript across extractions as context. 0 disables retention; each extraction then sees only its own call's turns.\"\n      },\n      \"batchChunkSize\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 50,\n        \"default\": 10,\n        \"description\": \"Per-call chunk bound for the batched pipeline LLM stages: admission utility, dedup decider, and merge writer. Larger bursts split into ceil(N/batchChunkSize) calls. Values above 50 are clamped.\"\n      },\n      \"extractMaxChars\": {\n        \"type\": \"integer\",\n        \"minimum\": 256,\n        \"maximum\": 100000,\n        \"default\": 8000,\n        \"description\": \"Maximum conversation characters sent to the smart extraction LLM.\"\n      },\n      \"admissionControl\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"description\": \"A-MAC-style admission governance on the smart-extraction write path. Rejects low-value candidates before persistence while preserving downstream dedup behavior for admitted candidates.\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": false\n          },\n          \"preset\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"balanced\",\n              \"conservative\",\n              \"high-recall\"\n            ],\n            \"default\": \"balanced\",\n            \"description\": \"Named admission tuning preset. Explicit admissionControl fields still override the selected preset.\"\n          },\n          \"model\": {\n            \"type\": \"string\",\n            \"description\": \"Optional absolute override: when set, every admission LLM call uses this model, regardless of modelAffinity.\"\n          },\n          \"modelAffinity\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"global\",\n              \"lane\"\n            ],\n            \"default\": \"global\",\n            \"description\": \"lane routes reflection-mapped admission calls to memoryReflection.model instead of the global llm model; global uses the plugin's global llm model for every lane.\"\n          },\n          \"utilityMode\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"standalone\",\n              \"off\",\n              \"batch\"\n            ],\n            \"default\": \"standalone\",\n            \"description\": \"standalone scores each candidate with its own LLM call; batch scores a whole extraction's candidates with one call per chunk of up to 10; off disables utility scoring entirely.\"\n          },\n          \"rejectThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.45\n          },\n          \"admitThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.6\n          },\n          \"utilityVetoThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.25,\n            \"description\": \"Utility scores at or below this are rejected regardless of the weighted composite (0 disables the veto)\"\n          },\n          \"noveltyCandidatePoolSize\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 20,\n            \"default\": 8\n          },\n          \"auditMetadata\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"persistRejectedAudits\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"rejectedAuditFilePath\": {\n            \"type\": \"string\",\n            \"description\": \"Optional JSONL file path for durable admission reject audit records. Defaults to a file beside the plugin memory data directory.\"\n          },\n          \"recency\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"halfLifeDays\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"maximum\": 365,\n                \"default\": 14\n              }\n            }\n          },\n          \"weights\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"utility\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.1\n              },\n              \"confidence\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.1\n              },\n              \"novelty\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.1\n              },\n              \"recency\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.1\n              },\n              \"typePrior\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.6\n              }\n            }\n          },\n          \"typePriors\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"profile\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.95\n              },\n              \"preferences\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.9\n              },\n              \"entities\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.75\n              },\n              \"events\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.45\n              },\n              \"cases\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.8\n              },\n              \"patterns\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.85\n              }\n            }\n          }\n        }\n      },\n      \"retrieval\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"mode\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"hybrid\",\n              \"vector\"\n            ],\n            \"default\": \"hybrid\"\n          },\n          \"vectorWeight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.7\n          },\n          \"bm25Weight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"minScore\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"rerank\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"cross-encoder\",\n              \"lightweight\",\n              \"none\"\n            ],\n            \"default\": \"cross-encoder\"\n          },\n          \"rerankApiKey\": {\n            \"oneOf\": [\n              {\n                \"type\": \"string\",\n                \"minLength\": 1\n              },\n              {\n                \"type\": \"object\",\n                \"additionalProperties\": true,\n                \"required\": [\n                  \"source\",\n                  \"id\"\n                ],\n                \"properties\": {\n                  \"source\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"env\",\n                      \"file\"\n                    ]\n                  },\n                  \"provider\": {\n                    \"type\": \"string\"\n                  },\n                  \"id\": {\n                    \"type\": \"string\",\n                    \"minLength\": 1\n                  }\n                }\n              }\n            ],\n            \"description\": \"API key for reranker service (enables cross-encoder reranking)\"\n          },\n          \"rerankModel\": {\n            \"type\": \"string\",\n            \"default\": \"jina-reranker-v3\",\n            \"description\": \"Reranker model name\"\n          },\n          \"rerankEndpoint\": {\n            \"type\": \"string\",\n            \"default\": \"https://api.jina.ai/v1/rerank\",\n            \"description\": \"Reranker API endpoint URL. Compatible with Jina-compatible endpoints and dedicated adapters such as TEI, SiliconFlow, Voyage, Pinecone, and DashScope.\"\n          },\n          \"rerankTimeoutMs\": {\n            \"type\": \"integer\",\n            \"minimum\": 500,\n            \"default\": 5000,\n            \"description\": \"Rerank API timeout in milliseconds (default: 5000). Increase for local/CPU-based rerank servers.\"\n          },\n          \"rerankProvider\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"jina\",\n              \"siliconflow\",\n              \"voyage\",\n              \"pinecone\",\n              \"dashscope\",\n              \"tei\"\n            ],\n            \"default\": \"jina\",\n            \"description\": \"Reranker provider format. Determines request/response shape and auth header. Use tei for Hugging Face Text Embeddings Inference /rerank endpoints. DashScope uses gte-rerank-v2 with endpoint https://dashscope.aliyuncs.com/api/v1/services/rerank/text-rerank/text-rerank.\"\n          },\n          \"candidatePoolSize\": {\n            \"type\": \"integer\",\n            \"minimum\": 10,\n            \"maximum\": 100,\n            \"default\": 20\n          },\n          \"recencyHalfLifeDays\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 365,\n            \"default\": 14,\n            \"description\": \"Half-life in days for recency boost. Newer memories get higher scores. Set 0 to disable.\"\n          },\n          \"recencyWeight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 0.5,\n            \"default\": 0.1,\n            \"description\": \"Maximum recency boost factor added to score\"\n          },\n          \"filterNoise\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Filter out noise memories (agent denials, meta-questions, boilerplate)\"\n          },\n          \"neighborEnrichment\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"default\": {\n              \"enabled\": false,\n              \"maxPerResult\": 2\n            },\n            \"description\": \"Default-off retrieval-time BM25 neighbor enrichment for hybrid search results.\",\n            \"properties\": {\n              \"enabled\": {\n                \"type\": \"boolean\",\n                \"default\": false,\n                \"description\": \"Attach bounded same-scope BM25 neighbors to each top-level hybrid retrieval result.\"\n              },\n              \"maxPerResult\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"maximum\": 5,\n                \"default\": 2,\n                \"description\": \"Maximum supplemental neighbors to attach per top-level result.\"\n              }\n            }\n          },\n          \"disableNativeCosine\": {\n            \"type\": \"boolean\",\n            \"default\": false,\n            \"description\": \"Disable LanceDB native vector search and rank scoped rows with JavaScript cosine. Enable on AVX-only Linux x64 CPUs that crash with SIGILL in LanceDB native vector search.\"\n          },\n          \"lengthNormAnchor\": {\n            \"type\": \"integer\",\n            \"minimum\": 0,\n            \"maximum\": 5000,\n            \"default\": 500,\n            \"description\": \"Length normalization anchor in chars. Entries longer than this get score penalized. Set 0 to disable.\"\n          },\n          \"hardMinScore\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.35,\n            \"description\": \"Hard cutoff after all scoring stages. Results below this score are discarded.\"\n          },\n          \"timeDecayHalfLifeDays\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 365,\n            \"default\": 60,\n            \"description\": \"Time decay half-life in days. Old entries lose score gradually. Floor at 0.5x. Set 0 to disable.\"\n          },\n          \"reinforcementFactor\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 2,\n            \"default\": 0.5,\n            \"description\": \"Access reinforcement factor for time decay. Frequently recalled memories decay slower. 0 to disable.\"\n          },\n          \"maxHalfLifeMultiplier\": {\n            \"type\": \"number\",\n            \"minimum\": 1,\n            \"maximum\": 10,\n            \"default\": 3,\n            \"description\": \"Maximum half-life multiplier from access reinforcement. Prevents frequently accessed memories from becoming immortal.\"\n          }\n        }\n      },\n      \"decay\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"recencyHalfLifeDays\": {\n            \"type\": \"number\",\n            \"minimum\": 1,\n            \"maximum\": 365,\n            \"default\": 30\n          },\n          \"recencyWeight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.4\n          },\n          \"frequencyWeight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"intrinsicWeight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"staleThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"searchBoostMin\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"importanceModulation\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 10,\n            \"default\": 1.5\n          },\n          \"betaCore\": {\n            \"type\": \"number\",\n            \"minimum\": 0.1,\n            \"maximum\": 5,\n            \"default\": 0.8\n          },\n          \"betaWorking\": {\n            \"type\": \"number\",\n            \"minimum\": 0.1,\n            \"maximum\": 5,\n            \"default\": 1\n          },\n          \"betaPeripheral\": {\n            \"type\": \"number\",\n            \"minimum\": 0.1,\n            \"maximum\": 5,\n            \"default\": 1.3\n          },\n          \"coreDecayFloor\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.9\n          },\n          \"workingDecayFloor\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.7\n          },\n          \"peripheralDecayFloor\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.5\n          }\n        }\n      },\n      \"tier\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"coreAccessThreshold\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 1000,\n            \"default\": 10\n          },\n          \"coreCompositeThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.7\n          },\n          \"coreImportanceThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.8\n          },\n          \"peripheralCompositeThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.15\n          },\n          \"peripheralAgeDays\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 3650,\n            \"default\": 60\n          },\n          \"workingAccessThreshold\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 1000,\n            \"default\": 3\n          },\n          \"workingCompositeThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.4\n          }\n        }\n      },\n      \"sessionMemory\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"description\": \"Deprecated legacy switch. Kept for compatibility and mapped to sessionStrategy.\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": false,\n            \"description\": \"Deprecated. true -> sessionStrategy=systemSessionMemory, false -> sessionStrategy=none. Disabled by default.\"\n          },\n          \"messageCount\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 100,\n            \"default\": 15,\n            \"description\": \"Legacy compatibility field. Mapped to memoryReflection.messageCount.\"\n          }\n        }\n      },\n      \"selfImprovement\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"beforeResetNote\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"skipSubagentBootstrap\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"ensureLearningFiles\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"maxEntries\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"default\": 500,\n            \"description\": \"Maximum number of entries to retain per .learnings file before new appends are skipped.\"\n          }\n        }\n      },\n      \"canonicalCorpus\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Index canonical OpenClaw memory files into LanceDB while keeping the files as source of truth.\"\n          },\n          \"syncOnSearch\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Refresh canonical corpus entries opportunistically before memory runtime searches.\"\n          },\n          \"syncIntervalMs\": {\n            \"type\": \"integer\",\n            \"minimum\": 0,\n            \"default\": 60000,\n            \"description\": \"Minimum interval between opportunistic canonical corpus sync attempts.\"\n          },\n          \"includeMemoryDir\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Index MEMORY.md and memory/**/*.md from configured OpenClaw workspaces.\"\n          },\n          \"includeSessionTranscripts\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Index recent OpenClaw session JSONL transcripts as grounded session-source search results.\"\n          },\n          \"includeDreamingArtifacts\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Index memory/dreaming/**/*.md as dream-report public artifacts.\"\n          },\n          \"maxSessionFilesPerAgent\": {\n            \"type\": \"integer\",\n            \"minimum\": 0,\n            \"default\": 25,\n            \"description\": \"Maximum recent session transcript files to index per agent.\"\n          },\n          \"maxFileBytes\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"default\": 1000000,\n            \"description\": \"Skip canonical corpus files larger than this size.\"\n          }\n        }\n      },\n      \"dreaming\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\"\n          },\n          \"frequency\": {\n            \"type\": \"string\"\n          },\n          \"model\": {\n            \"type\": \"string\"\n          },\n          \"timezone\": {\n            \"type\": \"string\"\n          },\n          \"verboseLogging\": {\n            \"type\": \"boolean\"\n          },\n          \"storage\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"mode\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"inline\",\n                  \"separate\",\n                  \"both\"\n                ]\n              },\n              \"separateReports\": {\n                \"type\": \"boolean\"\n              }\n            }\n          },\n          \"execution\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"defaults\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"speed\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"fast\",\n                      \"balanced\",\n                      \"slow\"\n                    ]\n                  },\n                  \"thinking\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"low\",\n                      \"medium\",\n                      \"high\"\n                    ]\n                  },\n                  \"budget\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"cheap\",\n                      \"medium\",\n                      \"expensive\"\n                    ]\n                  },\n                  \"model\": {\n                    \"type\": \"string\"\n                  },\n                  \"maxOutputTokens\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 1\n                  },\n                  \"temperature\": {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"maximum\": 2\n                  },\n                  \"timeoutMs\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 1000\n                  }\n                }\n              }\n            }\n          },\n          \"phases\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"light\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"enabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"lookbackDays\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"limit\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"dedupeSimilarity\": {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"maximum\": 1\n                  },\n                  \"sources\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"daily\",\n                        \"sessions\",\n                        \"recall\"\n                      ]\n                    }\n                  },\n                  \"execution\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"speed\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"fast\",\n                          \"balanced\",\n                          \"slow\"\n                        ]\n                      },\n                      \"thinking\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"low\",\n                          \"medium\",\n                          \"high\"\n                        ]\n                      },\n                      \"budget\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"cheap\",\n                          \"medium\",\n                          \"expensive\"\n                        ]\n                      },\n                      \"model\": {\n                        \"type\": \"string\"\n                      },\n                      \"maxOutputTokens\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1\n                      },\n                      \"temperature\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 2\n                      },\n                      \"timeoutMs\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1000\n                      }\n                    }\n                  }\n                }\n              },\n              \"deep\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"enabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"limit\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"minScore\": {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"maximum\": 1\n                  },\n                  \"minRecallCount\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"minUniqueQueries\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"recencyHalfLifeDays\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"maxAgeDays\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 1\n                  },\n                  \"sources\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"daily\",\n                        \"memory\",\n                        \"sessions\",\n                        \"logs\",\n                        \"recall\"\n                      ]\n                    }\n                  },\n                  \"recovery\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"triggerBelowHealth\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 1\n                      },\n                      \"lookbackDays\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 0\n                      },\n                      \"maxRecoveredCandidates\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 0\n                      },\n                      \"minRecoveryConfidence\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 1\n                      },\n                      \"autoWriteMinConfidence\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 1\n                      }\n                    }\n                  },\n                  \"execution\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"speed\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"fast\",\n                          \"balanced\",\n                          \"slow\"\n                        ]\n                      },\n                      \"thinking\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"low\",\n                          \"medium\",\n                          \"high\"\n                        ]\n                      },\n                      \"budget\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"cheap\",\n                          \"medium\",\n                          \"expensive\"\n                        ]\n                      },\n                      \"model\": {\n                        \"type\": \"string\"\n                      },\n                      \"maxOutputTokens\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1\n                      },\n                      \"temperature\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 2\n                      },\n                      \"timeoutMs\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1000\n                      }\n                    }\n                  }\n                }\n              },\n              \"rem\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"enabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"lookbackDays\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"limit\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"minPatternStrength\": {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"maximum\": 1\n                  },\n                  \"sources\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"memory\",\n                        \"daily\",\n                        \"deep\"\n                      ]\n                    }\n                  },\n                  \"execution\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"speed\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"fast\",\n                          \"balanced\",\n                          \"slow\"\n                        ]\n                      },\n                      \"thinking\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"low\",\n                          \"medium\",\n                          \"high\"\n                        ]\n                      },\n                      \"budget\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"cheap\",\n                          \"medium\",\n                          \"expensive\"\n                        ]\n                      },\n                      \"model\": {\n                        \"type\": \"string\"\n                      },\n                      \"maxOutputTokens\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1\n                      },\n                      \"temperature\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 2\n                      },\n                      \"timeoutMs\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1000\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      },\n      \"memoryReflection\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"storeToLanceDB\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"writeLegacyCombined\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"injectMode\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"inheritance-only\",\n              \"inheritance+derived\"\n            ],\n            \"default\": \"inheritance+derived\"\n          },\n          \"agentId\": {\n            \"type\": \"string\",\n            \"description\": \"Optional dedicated agent id used to run reflection generation (for example: memory-distiller).\"\n          },\n          \"model\": {\n            \"type\": \"string\",\n            \"description\": \"Optional provider/model override used to generate the reflection. Falls back to the reflection agent's primary model, then the plugin llm.model.\"\n          },\n          \"messageCount\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 500,\n            \"default\": 120\n","skills/lesson/SKILL.md":"---\nname: lesson\ndescription: Store a lesson learned from the current conversation. Triggered by /lesson command. Use when Master signals that the recent conversation contains a pitfall, fix, or key insight that should be persisted to long-term memory.\nmetadata: { \"openclaw\": { \"requires\": { \"config\": [\"plugins.entries.memory-lancedb-pro.enabled\"] } } }\n---\n\n# Lesson Extraction & Storage\n\nWhen triggered, extract and store lessons from the **recent conversation context**.\n\n## Steps\n\n1. **Scan recent context** — identify the pitfall, bug fix, or key insight just discussed\n2. **Store technical layer** (category: fact, importance ≥ 0.8):\n   ```\n   Pitfall: [symptom]. Cause: [root cause]. Fix: [solution]. Prevention: [how to avoid].\n   ```\n3. **Store principle layer** (category: decision, importance ≥ 0.85):\n   ```\n   Decision principle ([tag]): [behavioral rule]. Trigger: [when]. Action: [what to do].\n   ```\n4. **Verify** — `memory_recall` with anchor keywords to confirm both entries retrievable\n5. **Report** — tell Master what was stored (brief summary)\n\n## Rules\n\n- Keep entries short and atomic (< 500 chars each)\n- If the lesson also affects a checklist or SKILL.md, update those files too\n- If no clear lesson is found in recent context, ask Master what to store\n"},"items":[{"name":"SKILL.md","path":"skills/lesson/SKILL.md","rawUrl":"https://raw.githubusercontent.com/CortexReach/memory-lancedb-pro/HEAD/skills/lesson/SKILL.md","title":"lesson","category":"anthropic-skill","format":"markdown","content":"---\nname: lesson\ndescription: Store a lesson learned from the current conversation. Triggered by /lesson command. Use when Master signals that the recent conversation contains a pitfall, fix, or key insight that should be persisted to long-term memory.\nmetadata: { \"openclaw\": { \"requires\": { \"config\": [\"plugins.entries.memory-lancedb-pro.enabled\"] } } }\n---\n\n# Lesson Extraction & Storage\n\nWhen triggered, extract and store lessons from the **recent conversation context**.\n\n## Steps\n\n1. **Scan recent context** — identify the pitfall, bug fix, or key insight just discussed\n2. **Store technical layer** (category: fact, importance ≥ 0.8):\n   ```\n   Pitfall: [symptom]. Cause: [root cause]. Fix: [solution]. Prevention: [how to avoid].\n   ```\n3. **Store principle layer** (category: decision, importance ≥ 0.85):\n   ```\n   Decision principle ([tag]): [behavioral rule]. Trigger: [when]. Action: [what to do].\n   ```\n4. **Verify** — `memory_recall` with anchor keywords to confirm both entries retrievable\n5. **Report** — tell Master what was stored (brief summary)\n\n## Rules\n\n- Keep entries short and atomic (< 500 chars each)\n- If the lesson also affects a checklist or SKILL.md, update those files too\n- If no clear lesson is found in recent context, ask Master what to store\n","frontmatter":{"name":"lesson","description":"Store a lesson learned from the current conversation. Triggered by /lesson command. Use when Master signals that the recent conversation contains a pitfall, fix, or key insight that should be persisted to long-term memory.","metadata":{"openclaw":{"requires":{"config":["plugins.entries.memory-lancedb-pro.enabled"]}}}},"isInternal":false,"tokens":306,"sizeBytes":1290},{"name":"openclaw.plugin.json","path":"openclaw.plugin.json","rawUrl":"https://raw.githubusercontent.com/CortexReach/memory-lancedb-pro/HEAD/openclaw.plugin.json","title":"Plugin Plugin Manifest","category":"plugin-manifest","format":"json","content":"{\n  \"id\": \"memory-lancedb-pro\",\n  \"name\": \"Memory (LanceDB Pro)\",\n  \"description\": \"Enhanced LanceDB-backed long-term memory with hybrid retrieval, multi-scope isolation, long-context chunking, and management CLI\",\n  \"version\": \"1.1.0-beta.11\",\n  \"kind\": \"memory\",\n  \"skills\": [\n    \"./skills\"\n  ],\n  \"commandAliases\": [\n    {\n      \"name\": \"dreaming\",\n      \"kind\": \"runtime-slash\",\n      \"cliCommand\": \"memory\"\n    }\n  ],\n  \"cliCommands\": [\n    {\n      \"name\": \"memory-pro\",\n      \"description\": \"Enhanced memory management commands (LanceDB Pro)\",\n      \"hasSubcommands\": true\n    }\n  ],\n  \"hooks\": {\n    \"allowConversationAccess\": true\n  },\n  \"configSchema\": {\n    \"type\": \"object\",\n    \"additionalProperties\": false,\n    \"properties\": {\n      \"embedding\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"provider\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"openai-compatible\",\n              \"azure-openai\"\n            ]\n          },\n          \"apiKey\": {\n            \"oneOf\": [\n              {\n                \"type\": \"string\",\n                \"minLength\": 1\n              },\n              {\n                \"type\": \"object\",\n                \"additionalProperties\": true,\n                \"required\": [\n                  \"source\",\n                  \"id\"\n                ],\n                \"properties\": {\n                  \"source\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"env\",\n                      \"file\"\n                    ]\n                  },\n                  \"provider\": {\n                    \"type\": \"string\"\n                  },\n                  \"id\": {\n                    \"type\": \"string\",\n                    \"minLength\": 1\n                  }\n                }\n              },\n              {\n                \"type\": \"array\",\n                \"items\": {\n                  \"oneOf\": [\n                    {\n                      \"type\": \"string\",\n                      \"minLength\": 1\n                    },\n                    {\n                      \"type\": \"object\",\n                      \"additionalProperties\": true,\n                      \"required\": [\n                        \"source\",\n                        \"id\"\n                      ],\n                      \"properties\": {\n                        \"source\": {\n                          \"type\": \"string\",\n                          \"enum\": [\n                            \"env\",\n                            \"file\"\n                          ]\n                        },\n                        \"provider\": {\n                          \"type\": \"string\"\n                        },\n                        \"id\": {\n                          \"type\": \"string\",\n                          \"minLength\": 1\n                        }\n                      }\n                    }\n                  ]\n                },\n                \"minItems\": 1\n              }\n            ],\n            \"description\": \"Single API key, SecretRef, or array of keys/SecretRefs for round-robin rotation\"\n          },\n          \"model\": {\n            \"type\": \"string\"\n          },\n          \"baseURL\": {\n            \"type\": \"string\"\n          },\n          \"dimensions\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"description\": \"Internal vector dimensions for LanceDB schema sizing and local embedding validation\"\n          },\n          \"requestDimensions\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"description\": \"Optional dimensions/output_dimension value to send to embedding providers that support variable output sizes\"\n          },\n          \"omitDimensions\": {\n            \"type\": \"boolean\",\n            \"description\": \"When true, omit dimensions/output_dimension from embedding requests even if requestDimensions is configured\"\n          },\n          \"taskQuery\": {\n            \"type\": \"string\",\n            \"description\": \"Embedding task for queries (provider-specific, e.g. Jina: retrieval.query)\"\n          },\n          \"taskPassage\": {\n            \"type\": \"string\",\n            \"description\": \"Embedding task for passages/documents (provider-specific, e.g. Jina: retrieval.passage)\"\n          },\n          \"normalized\": {\n            \"type\": \"boolean\",\n            \"description\": \"Request normalized embeddings when supported by the provider (e.g. Jina v5)\"\n          },\n          \"maxInputChars\": {\n            \"type\": \"integer\",\n            \"minimum\": 100,\n            \"description\": \"Maximum characters sent to the embedding provider per request. With automatic chunking enabled, longer documents are split before this cap is applied to each provider request; with chunking disabled, excess text is truncated.\"\n          },\n          \"chunking\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Enable automatic chunking for documents exceeding embedding context limits\"\n          },\n          \"astChunking\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"description\": \"Experimental code-boundary-aware chunking for supported code blocks. Disabled by default and falls back to normal chunking when unsupported.\",\n            \"properties\": {\n              \"enabled\": {\n                \"type\": \"boolean\",\n                \"default\": false,\n                \"description\": \"Enable code-boundary-aware chunking for JavaScript, TypeScript, and Python code blocks\"\n              },\n              \"languages\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"javascript\",\n                    \"typescript\",\n                    \"python\"\n                  ]\n                },\n                \"default\": [\n                  \"javascript\",\n                  \"typescript\",\n                  \"python\"\n                ],\n                \"description\": \"Languages eligible for code-boundary-aware chunking\"\n              }\n            }\n          },\n          \"clientTimeoutMs\": {\n            \"type\": \"integer\",\n            \"minimum\": 1000,\n            \"default\": 30000,\n            \"description\": \"OpenAI-compatible SDK HTTP timeout in milliseconds for embedding requests. Startup health checks use a separate shorter abort signal.\"\n          },\n          \"apiVersion\": {\n            \"type\": \"string\",\n            \"description\": \"API version for Azure OpenAI (e.g. 2024-02-01). Only used when provider is azure-openai.\"\n          }\n        },\n        \"required\": [\n          \"apiKey\"\n        ]\n      },\n      \"dbPath\": {\n        \"type\": \"string\"\n      },\n      \"maxInputChars\": {\n        \"type\": \"integer\",\n        \"minimum\": 100,\n        \"description\": \"Legacy top-level alias for embedding.maxInputChars.\"\n      },\n      \"storageMaintenance\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"description\": \"Optional LanceDB table maintenance for pruning old version snapshots with table.optimize(). Disabled by default.\",\n        \"properties\": {\n          \"autoCleanup\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"enabled\": {\n                \"type\": \"boolean\",\n                \"default\": false,\n                \"description\": \"Enable scheduled LanceDB table.optimize() cleanup.\"\n              },\n              \"intervalHours\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"default\": 24,\n                \"description\": \"Hours between scheduled storage maintenance runs.\"\n              },\n              \"retentionDays\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"default\": 7,\n                \"description\": \"Keep LanceDB table versions newer than this many days.\"\n              },\n              \"initialDelayMs\": {\n                \"type\": \"integer\",\n                \"minimum\": 0,\n                \"default\": 300000,\n                \"description\": \"Delay before the first storage maintenance run after service start.\"\n              }\n            }\n          },\n          \"readConsistencyIntervalSeconds\": {\n            \"type\": \"integer\",\n            \"minimum\": 0,\n            \"default\": 0,\n            \"description\": \"Seconds between checks for LanceDB table updates committed by other processes (e.g. a CLI delete-bulk while this service holds a long-lived read handle). 0 means strong consistency: every read checks for updates.\"\n          }\n        }\n      },\n      \"redisUrl\": {\n        \"type\": \"string\",\n        \"description\": \"Optional shortcut for enabling Redis distributed write locking. Prefer locking.redis.url for new configs.\"\n      },\n      \"locking\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"description\": \"Optional external locking configuration for high-concurrency or multi-instance deployments.\",\n        \"properties\": {\n          \"redis\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"enabled\": {\n                \"type\": \"boolean\",\n                \"default\": false,\n                \"description\": \"Use Redis SET NX PX write locks before mutating LanceDB. When enabled, Redis lock failures fail writes closed instead of falling back to local file locks.\"\n              },\n              \"url\": {\n                \"type\": \"string\",\n                \"description\": \"Redis connection URL. May include ${ENV_VAR} placeholders.\"\n              },\n              \"keyPrefix\": {\n                \"type\": \"string\",\n                \"default\": \"memory-lancedb-pro:write-lock\",\n                \"description\": \"Prefix for Redis lock keys.\"\n              },\n              \"ttlMs\": {\n                \"type\": \"integer\",\n                \"minimum\": 1000,\n                \"default\": 60000,\n                \"description\": \"Redis lock TTL in milliseconds.\"\n              },\n              \"acquireTimeoutMs\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"default\": 5000,\n                \"description\": \"Maximum time to wait for the Redis lock before failing the write so the caller can retry later.\"\n              },\n              \"retryDelayMs\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"default\": 50,\n                \"description\": \"Initial Redis lock retry delay in milliseconds. Retries use exponential backoff.\"\n              },\n              \"connectTimeoutMs\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"default\": 1000,\n                \"description\": \"Redis connection timeout in milliseconds.\"\n              }\n            }\n          }\n        }\n      },\n      \"enableManagementTools\": {\n        \"type\": \"boolean\",\n        \"default\": false,\n        \"description\": \"Enable management/debug tools such as memory_list, memory_stats, and governance-oriented self-improvement review/extract actions\"\n      },\n      \"manualStoreSupersede\": {\n        \"type\": \"boolean\",\n        \"default\": false,\n        \"description\": \"Manual-priority store lane: a memory_store that finds a similar existing memory supersedes it instead of being rejected as a duplicate; the manual text always lands verbatim. Off by default to preserve the classic duplicate check.\"\n      },\n      \"sessionStrategy\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"memoryReflection\",\n          \"systemSessionMemory\",\n          \"none\"\n        ],\n        \"default\": \"none\",\n        \"description\": \"Choose session pipeline: plugin memory-reflection, built-in session-memory, or none. Default none keeps session summaries disabled unless explicitly enabled.\"\n      },\n      \"autoCapture\": {\n        \"type\": \"boolean\",\n        \"default\": true\n      },\n      \"autoRecall\": {\n        \"type\": \"boolean\",\n        \"default\": false\n      },\n      \"autoRecallMinLength\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 200,\n        \"default\": 15,\n        \"description\": \"Minimum prompt length (in characters) to trigger auto-recall. Prompts shorter than this are skipped. Default: 15 for English, 6 for CJK.\"\n      },\n      \"autoRecallMinRepeated\": {\n        \"type\": \"integer\",\n        \"minimum\": 0,\n        \"maximum\": 100,\n        \"default\": 8,\n        \"description\": \"Minimum number of turns before the same memory can be recalled again in the same session. Set to 0 to disable deduplication.\"\n      },\n      \"autoRecallBadRecallDecayMs\": {\n        \"type\": \"integer\",\n        \"minimum\": 0,\n        \"default\": 86400000,\n        \"$comment\": \"No maximum: 0 disables decay; very large values also effectively disable. Unlike sibling autoRecall* integers, this is a time window with no natural upper bound.\",\n        \"description\": \"If a memory's last auto-recall injection was more than this many ms ago, its bad_recall_count is reset to 0 on the next injection. 0 disables decay. Default: 86400000 (24 hours).\"\n      },\n      \"autoRecallSuppressionDurationMs\": {\n        \"type\": \"integer\",\n        \"minimum\": 0,\n        \"default\": 1800000,\n        \"$comment\": \"No maximum: 0 effectively disables suppression; large values allow long quarantine windows.\",\n        \"description\": \"When bad_recall_count reaches the suppression threshold, the memory is suppressed from auto-recall for this many ms from now. Default: 1800000 (30 minutes).\"\n      },\n      \"autoRecallTimeoutMs\": {\n        \"type\": \"integer\",\n        \"minimum\": 500,\n        \"maximum\": 60000,\n        \"default\": 5000,\n        \"description\": \"Timeout for the entire auto-recall pipeline (embedding + search + rerank) in milliseconds.\"\n      },\n      \"startupCheckTimeoutMs\": {\n        \"type\": \"integer\",\n        \"minimum\": 1000,\n        \"maximum\": 120000,\n        \"default\": 8000,\n        \"description\": \"Outer time budget in milliseconds for each startup health check phase (embedding, retrieval). Raise on hosts where a cold boot exceeds 8 seconds; the checks run after startup and never block the gateway.\"\n      },\n      \"autoRecallMaxItems\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 20,\n        \"default\": 3,\n        \"description\": \"Maximum number of memories auto-injected per turn.\"\n      },\n      \"autoRecallMaxChars\": {\n        \"type\": \"integer\",\n        \"minimum\": 64,\n        \"maximum\": 8000,\n        \"default\": 600,\n        \"description\": \"Maximum total character budget for auto-injected memory summaries.\"\n      },\n      \"autoRecallPerItemMaxChars\": {\n        \"type\": \"integer\",\n        \"minimum\": 32,\n        \"maximum\": 1000,\n        \"default\": 180,\n        \"description\": \"Maximum character budget per auto-injected memory summary.\"\n      },\n      \"autoRecallMaxQueryLength\": {\n        \"type\": \"integer\",\n        \"minimum\": 100,\n        \"maximum\": 10000,\n        \"default\": 2000,\n        \"description\": \"Maximum character length of the auto-recall query before truncation. Default: 2000.\"\n      },\n      \"maxRecallPerTurn\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 50,\n        \"default\": 10,\n        \"description\": \"Hard per-turn injection cap applied after dedup. Acts as a safety ceiling on top of autoRecallMaxItems to prevent context inflation. Default: 10.\"\n      },\n      \"recallMode\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"full\",\n          \"summary\",\n          \"adaptive\",\n          \"off\"\n        ],\n        \"default\": \"full\",\n        \"description\": \"Auto-recall depth mode. 'full': inject with configured per-item budget. 'summary': L0 abstracts only (compact). 'adaptive': analyze query intent to auto-select category and depth. 'off': disable auto-recall injection.\"\n      },\n      \"autoRecallExcludeAgents\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"string\"\n        },\n        \"description\": \"Agent/session patterns excluded from auto-recall and reflection injection. Supports exact match, wildcard prefix (e.g. pi-), and temp:*.\"\n      },\n      \"autoRecallIncludeAgents\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"string\"\n        },\n        \"default\": [],\n        \"description\": \"Whitelist mode for auto-recall injection. Only agents in this list receive auto-recall. Agent resolution falls back to 'main' when no explicit agentId is available. If both include and exclude are set, autoRecallIncludeAgents takes precedence (whitelist wins).\"\n      },\n      \"captureAssistant\": {\n        \"type\": \"boolean\"\n      },\n      \"smartExtraction\": {\n        \"type\": \"boolean\",\n        \"default\": true,\n        \"description\": \"Enable LLM-powered memory extraction. Falls back to regex capture when false.\"\n      },\n      \"extractMinMessages\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 100,\n        \"default\": 4,\n        \"description\": \"Minimum conversation messages required before smart extraction runs.\"\n      },\n      \"autoCaptureContextTurns\": {\n        \"type\": \"integer\",\n        \"minimum\": 0,\n        \"maximum\": 10,\n        \"default\": 0,\n        \"description\": \"Rolling context window for auto-capture extraction: how many recent user turns (with their assistant replies) stay in the transcript across extractions as context. 0 disables retention; each extraction then sees only its own call's turns.\"\n      },\n      \"batchChunkSize\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 50,\n        \"default\": 10,\n        \"description\": \"Per-call chunk bound for the batched pipeline LLM stages: admission utility, dedup decider, and merge writer. Larger bursts split into ceil(N/batchChunkSize) calls. Values above 50 are clamped.\"\n      },\n      \"extractMaxChars\": {\n        \"type\": \"integer\",\n        \"minimum\": 256,\n        \"maximum\": 100000,\n        \"default\": 8000,\n        \"description\": \"Maximum conversation characters sent to the smart extraction LLM.\"\n      },\n      \"admissionControl\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"description\": \"A-MAC-style admission governance on the smart-extraction write path. Rejects low-value candidates before persistence while preserving downstream dedup behavior for admitted candidates.\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": false\n          },\n          \"preset\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"balanced\",\n              \"conservative\",\n              \"high-recall\"\n            ],\n            \"default\": \"balanced\",\n            \"description\": \"Named admission tuning preset. Explicit admissionControl fields still override the selected preset.\"\n          },\n          \"model\": {\n            \"type\": \"string\",\n            \"description\": \"Optional absolute override: when set, every admission LLM call uses this model, regardless of modelAffinity.\"\n          },\n          \"modelAffinity\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"global\",\n              \"lane\"\n            ],\n            \"default\": \"global\",\n            \"description\": \"lane routes reflection-mapped admission calls to memoryReflection.model instead of the global llm model; global uses the plugin's global llm model for every lane.\"\n          },\n          \"utilityMode\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"standalone\",\n              \"off\",\n              \"batch\"\n            ],\n            \"default\": \"standalone\",\n            \"description\": \"standalone scores each candidate with its own LLM call; batch scores a whole extraction's candidates with one call per chunk of up to 10; off disables utility scoring entirely.\"\n          },\n          \"rejectThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.45\n          },\n          \"admitThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.6\n          },\n          \"utilityVetoThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.25,\n            \"description\": \"Utility scores at or below this are rejected regardless of the weighted composite (0 disables the veto)\"\n          },\n          \"noveltyCandidatePoolSize\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 20,\n            \"default\": 8\n          },\n          \"auditMetadata\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"persistRejectedAudits\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"rejectedAuditFilePath\": {\n            \"type\": \"string\",\n            \"description\": \"Optional JSONL file path for durable admission reject audit records. Defaults to a file beside the plugin memory data directory.\"\n          },\n          \"recency\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"halfLifeDays\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"maximum\": 365,\n                \"default\": 14\n              }\n            }\n          },\n          \"weights\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"utility\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.1\n              },\n              \"confidence\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.1\n              },\n              \"novelty\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.1\n              },\n              \"recency\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.1\n              },\n              \"typePrior\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.6\n              }\n            }\n          },\n          \"typePriors\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"profile\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.95\n              },\n              \"preferences\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.9\n              },\n              \"entities\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.75\n              },\n              \"events\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.45\n              },\n              \"cases\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.8\n              },\n              \"patterns\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.85\n              }\n            }\n          }\n        }\n      },\n      \"retrieval\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"mode\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"hybrid\",\n              \"vector\"\n            ],\n            \"default\": \"hybrid\"\n          },\n          \"vectorWeight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.7\n          },\n          \"bm25Weight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"minScore\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"rerank\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"cross-encoder\",\n              \"lightweight\",\n              \"none\"\n            ],\n            \"default\": \"cross-encoder\"\n          },\n          \"rerankApiKey\": {\n            \"oneOf\": [\n              {\n                \"type\": \"string\",\n                \"minLength\": 1\n              },\n              {\n                \"type\": \"object\",\n                \"additionalProperties\": true,\n                \"required\": [\n                  \"source\",\n                  \"id\"\n                ],\n                \"properties\": {\n                  \"source\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"env\",\n                      \"file\"\n                    ]\n                  },\n                  \"provider\": {\n                    \"type\": \"string\"\n                  },\n                  \"id\": {\n                    \"type\": \"string\",\n                    \"minLength\": 1\n                  }\n                }\n              }\n            ],\n            \"description\": \"API key for reranker service (enables cross-encoder reranking)\"\n          },\n          \"rerankModel\": {\n            \"type\": \"string\",\n            \"default\": \"jina-reranker-v3\",\n            \"description\": \"Reranker model name\"\n          },\n          \"rerankEndpoint\": {\n            \"type\": \"string\",\n            \"default\": \"https://api.jina.ai/v1/rerank\",\n            \"description\": \"Reranker API endpoint URL. Compatible with Jina-compatible endpoints and dedicated adapters such as TEI, SiliconFlow, Voyage, Pinecone, and DashScope.\"\n          },\n          \"rerankTimeoutMs\": {\n            \"type\": \"integer\",\n            \"minimum\": 500,\n            \"default\": 5000,\n            \"description\": \"Rerank API timeout in milliseconds (default: 5000). Increase for local/CPU-based rerank servers.\"\n          },\n          \"rerankProvider\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"jina\",\n              \"siliconflow\",\n              \"voyage\",\n              \"pinecone\",\n              \"dashscope\",\n              \"tei\"\n            ],\n            \"default\": \"jina\",\n            \"description\": \"Reranker provider format. Determines request/response shape and auth header. Use tei for Hugging Face Text Embeddings Inference /rerank endpoints. DashScope uses gte-rerank-v2 with endpoint https://dashscope.aliyuncs.com/api/v1/services/rerank/text-rerank/text-rerank.\"\n          },\n          \"candidatePoolSize\": {\n            \"type\": \"integer\",\n            \"minimum\": 10,\n            \"maximum\": 100,\n            \"default\": 20\n          },\n          \"recencyHalfLifeDays\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 365,\n            \"default\": 14,\n            \"description\": \"Half-life in days for recency boost. Newer memories get higher scores. Set 0 to disable.\"\n          },\n          \"recencyWeight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 0.5,\n            \"default\": 0.1,\n            \"description\": \"Maximum recency boost factor added to score\"\n          },\n          \"filterNoise\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Filter out noise memories (agent denials, meta-questions, boilerplate)\"\n          },\n          \"neighborEnrichment\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"default\": {\n              \"enabled\": false,\n              \"maxPerResult\": 2\n            },\n            \"description\": \"Default-off retrieval-time BM25 neighbor enrichment for hybrid search results.\",\n            \"properties\": {\n              \"enabled\": {\n                \"type\": \"boolean\",\n                \"default\": false,\n                \"description\": \"Attach bounded same-scope BM25 neighbors to each top-level hybrid retrieval result.\"\n              },\n              \"maxPerResult\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"maximum\": 5,\n                \"default\": 2,\n                \"description\": \"Maximum supplemental neighbors to attach per top-level result.\"\n              }\n            }\n          },\n          \"disableNativeCosine\": {\n            \"type\": \"boolean\",\n            \"default\": false,\n            \"description\": \"Disable LanceDB native vector search and rank scoped rows with JavaScript cosine. Enable on AVX-only Linux x64 CPUs that crash with SIGILL in LanceDB native vector search.\"\n          },\n          \"lengthNormAnchor\": {\n            \"type\": \"integer\",\n            \"minimum\": 0,\n            \"maximum\": 5000,\n            \"default\": 500,\n            \"description\": \"Length normalization anchor in chars. Entries longer than this get score penalized. Set 0 to disable.\"\n          },\n          \"hardMinScore\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.35,\n            \"description\": \"Hard cutoff after all scoring stages. Results below this score are discarded.\"\n          },\n          \"timeDecayHalfLifeDays\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 365,\n            \"default\": 60,\n            \"description\": \"Time decay half-life in days. Old entries lose score gradually. Floor at 0.5x. Set 0 to disable.\"\n          },\n          \"reinforcementFactor\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 2,\n            \"default\": 0.5,\n            \"description\": \"Access reinforcement factor for time decay. Frequently recalled memories decay slower. 0 to disable.\"\n          },\n          \"maxHalfLifeMultiplier\": {\n            \"type\": \"number\",\n            \"minimum\": 1,\n            \"maximum\": 10,\n            \"default\": 3,\n            \"description\": \"Maximum half-life multiplier from access reinforcement. Prevents frequently accessed memories from becoming immortal.\"\n          }\n        }\n      },\n      \"decay\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"recencyHalfLifeDays\": {\n            \"type\": \"number\",\n            \"minimum\": 1,\n            \"maximum\": 365,\n            \"default\": 30\n          },\n          \"recencyWeight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.4\n          },\n          \"frequencyWeight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"intrinsicWeight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"staleThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"searchBoostMin\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"importanceModulation\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 10,\n            \"default\": 1.5\n          },\n          \"betaCore\": {\n            \"type\": \"number\",\n            \"minimum\": 0.1,\n            \"maximum\": 5,\n            \"default\": 0.8\n          },\n          \"betaWorking\": {\n            \"type\": \"number\",\n            \"minimum\": 0.1,\n            \"maximum\": 5,\n            \"default\": 1\n          },\n          \"betaPeripheral\": {\n            \"type\": \"number\",\n            \"minimum\": 0.1,\n            \"maximum\": 5,\n            \"default\": 1.3\n          },\n          \"coreDecayFloor\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.9\n          },\n          \"workingDecayFloor\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.7\n          },\n          \"peripheralDecayFloor\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.5\n          }\n        }\n      },\n      \"tier\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"coreAccessThreshold\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 1000,\n            \"default\": 10\n          },\n          \"coreCompositeThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.7\n          },\n          \"coreImportanceThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.8\n          },\n          \"peripheralCompositeThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.15\n          },\n          \"peripheralAgeDays\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 3650,\n            \"default\": 60\n          },\n          \"workingAccessThreshold\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 1000,\n            \"default\": 3\n          },\n          \"workingCompositeThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.4\n          }\n        }\n      },\n      \"sessionMemory\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"description\": \"Deprecated legacy switch. Kept for compatibility and mapped to sessionStrategy.\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": false,\n            \"description\": \"Deprecated. true -> sessionStrategy=systemSessionMemory, false -> sessionStrategy=none. Disabled by default.\"\n          },\n          \"messageCount\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 100,\n            \"default\": 15,\n            \"description\": \"Legacy compatibility field. Mapped to memoryReflection.messageCount.\"\n          }\n        }\n      },\n      \"selfImprovement\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"beforeResetNote\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"skipSubagentBootstrap\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"ensureLearningFiles\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"maxEntries\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"default\": 500,\n            \"description\": \"Maximum number of entries to retain per .learnings file before new appends are skipped.\"\n          }\n        }\n      },\n      \"canonicalCorpus\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Index canonical OpenClaw memory files into LanceDB while keeping the files as source of truth.\"\n          },\n          \"syncOnSearch\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Refresh canonical corpus entries opportunistically before memory runtime searches.\"\n          },\n          \"syncIntervalMs\": {\n            \"type\": \"integer\",\n            \"minimum\": 0,\n            \"default\": 60000,\n            \"description\": \"Minimum interval between opportunistic canonical corpus sync attempts.\"\n          },\n          \"includeMemoryDir\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Index MEMORY.md and memory/**/*.md from configured OpenClaw workspaces.\"\n          },\n          \"includeSessionTranscripts\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Index recent OpenClaw session JSONL transcripts as grounded session-source search results.\"\n          },\n          \"includeDreamingArtifacts\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Index memory/dreaming/**/*.md as dream-report public artifacts.\"\n          },\n          \"maxSessionFilesPerAgent\": {\n            \"type\": \"integer\",\n            \"minimum\": 0,\n            \"default\": 25,\n            \"description\": \"Maximum recent session transcript files to index per agent.\"\n          },\n          \"maxFileBytes\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"default\": 1000000,\n            \"description\": \"Skip canonical corpus files larger than this size.\"\n          }\n        }\n      },\n      \"dreaming\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\"\n          },\n          \"frequency\": {\n            \"type\": \"string\"\n          },\n          \"model\": {\n            \"type\": \"string\"\n          },\n          \"timezone\": {\n            \"type\": \"string\"\n          },\n          \"verboseLogging\": {\n            \"type\": \"boolean\"\n          },\n          \"storage\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"mode\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"inline\",\n                  \"separate\",\n                  \"both\"\n                ]\n              },\n              \"separateReports\": {\n                \"type\": \"boolean\"\n              }\n            }\n          },\n          \"execution\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"defaults\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"speed\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"fast\",\n                      \"balanced\",\n                      \"slow\"\n                    ]\n                  },\n                  \"thinking\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"low\",\n                      \"medium\",\n                      \"high\"\n                    ]\n                  },\n                  \"budget\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"cheap\",\n                      \"medium\",\n                      \"expensive\"\n                    ]\n                  },\n                  \"model\": {\n                    \"type\": \"string\"\n                  },\n                  \"maxOutputTokens\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 1\n                  },\n                  \"temperature\": {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"maximum\": 2\n                  },\n                  \"timeoutMs\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 1000\n                  }\n                }\n              }\n            }\n          },\n          \"phases\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"light\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"enabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"lookbackDays\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"limit\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"dedupeSimilarity\": {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"maximum\": 1\n                  },\n                  \"sources\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"daily\",\n                        \"sessions\",\n                        \"recall\"\n                      ]\n                    }\n                  },\n                  \"execution\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"speed\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"fast\",\n                          \"balanced\",\n                          \"slow\"\n                        ]\n                      },\n                      \"thinking\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"low\",\n                          \"medium\",\n                          \"high\"\n                        ]\n                      },\n                      \"budget\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"cheap\",\n                          \"medium\",\n                          \"expensive\"\n                        ]\n                      },\n                      \"model\": {\n                        \"type\": \"string\"\n                      },\n                      \"maxOutputTokens\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1\n                      },\n                      \"temperature\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 2\n                      },\n                      \"timeoutMs\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1000\n                      }\n                    }\n                  }\n                }\n              },\n              \"deep\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"enabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"limit\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"minScore\": {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"maximum\": 1\n                  },\n                  \"minRecallCount\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"minUniqueQueries\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"recencyHalfLifeDays\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"maxAgeDays\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 1\n                  },\n                  \"sources\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"daily\",\n                        \"memory\",\n                        \"sessions\",\n                        \"logs\",\n                        \"recall\"\n                      ]\n                    }\n                  },\n                  \"recovery\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"triggerBelowHealth\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 1\n                      },\n                      \"lookbackDays\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 0\n                      },\n                      \"maxRecoveredCandidates\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 0\n                      },\n                      \"minRecoveryConfidence\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 1\n                      },\n                      \"autoWriteMinConfidence\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 1\n                      }\n                    }\n                  },\n                  \"execution\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"speed\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"fast\",\n                          \"balanced\",\n                          \"slow\"\n                        ]\n                      },\n                      \"thinking\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"low\",\n                          \"medium\",\n                          \"high\"\n                        ]\n                      },\n                      \"budget\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"cheap\",\n                          \"medium\",\n                          \"expensive\"\n                        ]\n                      },\n                      \"model\": {\n                        \"type\": \"string\"\n                      },\n                      \"maxOutputTokens\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1\n                      },\n                      \"temperature\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 2\n                      },\n                      \"timeoutMs\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1000\n                      }\n                    }\n                  }\n                }\n              },\n              \"rem\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"enabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"lookbackDays\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"limit\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"minPatternStrength\": {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"maximum\": 1\n                  },\n                  \"sources\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"memory\",\n                        \"daily\",\n                        \"deep\"\n                      ]\n                    }\n                  },\n                  \"execution\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"speed\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"fast\",\n                          \"balanced\",\n                          \"slow\"\n                        ]\n                      },\n                      \"thinking\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"low\",\n                          \"medium\",\n                          \"high\"\n                        ]\n                      },\n                      \"budget\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"cheap\",\n                          \"medium\",\n                          \"expensive\"\n                        ]\n                      },\n                      \"model\": {\n                        \"type\": \"string\"\n                      },\n                      \"maxOutputTokens\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1\n                      },\n                      \"temperature\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 2\n                      },\n                      \"timeoutMs\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1000\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      },\n      \"memoryReflection\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"storeToLanceDB\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"writeLegacyCombined\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"injectMode\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"inheritance-only\",\n              \"inheritance+derived\"\n            ],\n            \"default\": \"inheritance+derived\"\n          },\n          \"agentId\": {\n            \"type\": \"string\",\n            \"description\": \"Optional dedicated agent id used to run reflection generation (for example: memory-distiller).\"\n          },\n          \"model\": {\n            \"type\": \"string\",\n            \"description\": \"Optional provider/model override used to generate the reflection. Falls back to the reflection agent's primary model, then the plugin llm.model.\"\n          },\n          \"messageCount\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 500,\n            \"default\": 120\n","isInternal":false,"tokens":9969,"sizeBytes":50000}],"systemPromptSnippet":"<yakaai_skills repo=\"CortexReach/memory-lancedb-pro\">\n<!-- File: skills/lesson/SKILL.md (Tokens: ~306 | Category: anthropic-skill) -->\n---\nname: lesson\ndescription: Store a lesson learned from the current conversation. Triggered by /lesson command. Use when Master signals that the recent conversation contains a pitfall, fix, or key insight that should be persisted to long-term memory.\nmetadata: { \"openclaw\": { \"requires\": { \"config\": [\"plugins.entries.memory-lancedb-pro.enabled\"] } } }\n---\n\n# Lesson Extraction & Storage\n\nWhen triggered, extract and store lessons from the **recent conversation context**.\n\n## Steps\n\n1. **Scan recent context** — identify the pitfall, bug fix, or key insight just discussed\n2. **Store technical layer** (category: fact, importance ≥ 0.8):\n   ```\n   Pitfall: [symptom]. Cause: [root cause]. Fix: [solution]. Prevention: [how to avoid].\n   ```\n3. **Store principle layer** (category: decision, importance ≥ 0.85):\n   ```\n   Decision principle ([tag]): [behavioral rule]. Trigger: [when]. Action: [what to do].\n   ```\n4. **Verify** — `memory_recall` with anchor keywords to confirm both entries retrievable\n5. **Report** — tell Master what was stored (brief summary)\n\n## Rules\n\n- Keep entries short and atomic (< 500 chars each)\n- If the lesson also affects a checklist or SKILL.md, update those files too\n- If no clear lesson is found in recent context, ask Master what to store\n\n<!-- File: openclaw.plugin.json (Tokens: ~9969 | Category: plugin-manifest) -->\n{\n  \"id\": \"memory-lancedb-pro\",\n  \"name\": \"Memory (LanceDB Pro)\",\n  \"description\": \"Enhanced LanceDB-backed long-term memory with hybrid retrieval, multi-scope isolation, long-context chunking, and management CLI\",\n  \"version\": \"1.1.0-beta.11\",\n  \"kind\": \"memory\",\n  \"skills\": [\n    \"./skills\"\n  ],\n  \"commandAliases\": [\n    {\n      \"name\": \"dreaming\",\n      \"kind\": \"runtime-slash\",\n      \"cliCommand\": \"memory\"\n    }\n  ],\n  \"cliCommands\": [\n    {\n      \"name\": \"memory-pro\",\n      \"description\": \"Enhanced memory management commands (LanceDB Pro)\",\n      \"hasSubcommands\": true\n    }\n  ],\n  \"hooks\": {\n    \"allowConversationAccess\": true\n  },\n  \"configSchema\": {\n    \"type\": \"object\",\n    \"additionalProperties\": false,\n    \"properties\": {\n      \"embedding\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"provider\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"openai-compatible\",\n              \"azure-openai\"\n            ]\n          },\n          \"apiKey\": {\n            \"oneOf\": [\n              {\n                \"type\": \"string\",\n                \"minLength\": 1\n              },\n              {\n                \"type\": \"object\",\n                \"additionalProperties\": true,\n                \"required\": [\n                  \"source\",\n                  \"id\"\n                ],\n                \"properties\": {\n                  \"source\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"env\",\n                      \"file\"\n                    ]\n                  },\n                  \"provider\": {\n                    \"type\": \"string\"\n                  },\n                  \"id\": {\n                    \"type\": \"string\",\n                    \"minLength\": 1\n                  }\n                }\n              },\n              {\n                \"type\": \"array\",\n                \"items\": {\n                  \"oneOf\": [\n                    {\n                      \"type\": \"string\",\n                      \"minLength\": 1\n                    },\n                    {\n                      \"type\": \"object\",\n                      \"additionalProperties\": true,\n                      \"required\": [\n                        \"source\",\n                        \"id\"\n                      ],\n                      \"properties\": {\n                        \"source\": {\n                          \"type\": \"string\",\n                          \"enum\": [\n                            \"env\",\n                            \"file\"\n                          ]\n                        },\n                        \"provider\": {\n                          \"type\": \"string\"\n                        },\n                        \"id\": {\n                          \"type\": \"string\",\n                          \"minLength\": 1\n                        }\n                      }\n                    }\n                  ]\n                },\n                \"minItems\": 1\n              }\n            ],\n            \"description\": \"Single API key, SecretRef, or array of keys/SecretRefs for round-robin rotation\"\n          },\n          \"model\": {\n            \"type\": \"string\"\n          },\n          \"baseURL\": {\n            \"type\": \"string\"\n          },\n          \"dimensions\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"description\": \"Internal vector dimensions for LanceDB schema sizing and local embedding validation\"\n          },\n          \"requestDimensions\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"description\": \"Optional dimensions/output_dimension value to send to embedding providers that support variable output sizes\"\n          },\n          \"omitDimensions\": {\n            \"type\": \"boolean\",\n            \"description\": \"When true, omit dimensions/output_dimension from embedding requests even if requestDimensions is configured\"\n          },\n          \"taskQuery\": {\n            \"type\": \"string\",\n            \"description\": \"Embedding task for queries (provider-specific, e.g. Jina: retrieval.query)\"\n          },\n          \"taskPassage\": {\n            \"type\": \"string\",\n            \"description\": \"Embedding task for passages/documents (provider-specific, e.g. Jina: retrieval.passage)\"\n          },\n          \"normalized\": {\n            \"type\": \"boolean\",\n            \"description\": \"Request normalized embeddings when supported by the provider (e.g. Jina v5)\"\n          },\n          \"maxInputChars\": {\n            \"type\": \"integer\",\n            \"minimum\": 100,\n            \"description\": \"Maximum characters sent to the embedding provider per request. With automatic chunking enabled, longer documents are split before this cap is applied to each provider request; with chunking disabled, excess text is truncated.\"\n          },\n          \"chunking\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Enable automatic chunking for documents exceeding embedding context limits\"\n          },\n          \"astChunking\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"description\": \"Experimental code-boundary-aware chunking for supported code blocks. Disabled by default and falls back to normal chunking when unsupported.\",\n            \"properties\": {\n              \"enabled\": {\n                \"type\": \"boolean\",\n                \"default\": false,\n                \"description\": \"Enable code-boundary-aware chunking for JavaScript, TypeScript, and Python code blocks\"\n              },\n              \"languages\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"string\",\n                  \"enum\": [\n                    \"javascript\",\n                    \"typescript\",\n                    \"python\"\n                  ]\n                },\n                \"default\": [\n                  \"javascript\",\n                  \"typescript\",\n                  \"python\"\n                ],\n                \"description\": \"Languages eligible for code-boundary-aware chunking\"\n              }\n            }\n          },\n          \"clientTimeoutMs\": {\n            \"type\": \"integer\",\n            \"minimum\": 1000,\n            \"default\": 30000,\n            \"description\": \"OpenAI-compatible SDK HTTP timeout in milliseconds for embedding requests. Startup health checks use a separate shorter abort signal.\"\n          },\n          \"apiVersion\": {\n            \"type\": \"string\",\n            \"description\": \"API version for Azure OpenAI (e.g. 2024-02-01). Only used when provider is azure-openai.\"\n          }\n        },\n        \"required\": [\n          \"apiKey\"\n        ]\n      },\n      \"dbPath\": {\n        \"type\": \"string\"\n      },\n      \"maxInputChars\": {\n        \"type\": \"integer\",\n        \"minimum\": 100,\n        \"description\": \"Legacy top-level alias for embedding.maxInputChars.\"\n      },\n      \"storageMaintenance\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"description\": \"Optional LanceDB table maintenance for pruning old version snapshots with table.optimize(). Disabled by default.\",\n        \"properties\": {\n          \"autoCleanup\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"enabled\": {\n                \"type\": \"boolean\",\n                \"default\": false,\n                \"description\": \"Enable scheduled LanceDB table.optimize() cleanup.\"\n              },\n              \"intervalHours\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"default\": 24,\n                \"description\": \"Hours between scheduled storage maintenance runs.\"\n              },\n              \"retentionDays\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"default\": 7,\n                \"description\": \"Keep LanceDB table versions newer than this many days.\"\n              },\n              \"initialDelayMs\": {\n                \"type\": \"integer\",\n                \"minimum\": 0,\n                \"default\": 300000,\n                \"description\": \"Delay before the first storage maintenance run after service start.\"\n              }\n            }\n          },\n          \"readConsistencyIntervalSeconds\": {\n            \"type\": \"integer\",\n            \"minimum\": 0,\n            \"default\": 0,\n            \"description\": \"Seconds between checks for LanceDB table updates committed by other processes (e.g. a CLI delete-bulk while this service holds a long-lived read handle). 0 means strong consistency: every read checks for updates.\"\n          }\n        }\n      },\n      \"redisUrl\": {\n        \"type\": \"string\",\n        \"description\": \"Optional shortcut for enabling Redis distributed write locking. Prefer locking.redis.url for new configs.\"\n      },\n      \"locking\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"description\": \"Optional external locking configuration for high-concurrency or multi-instance deployments.\",\n        \"properties\": {\n          \"redis\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"enabled\": {\n                \"type\": \"boolean\",\n                \"default\": false,\n                \"description\": \"Use Redis SET NX PX write locks before mutating LanceDB. When enabled, Redis lock failures fail writes closed instead of falling back to local file locks.\"\n              },\n              \"url\": {\n                \"type\": \"string\",\n                \"description\": \"Redis connection URL. May include ${ENV_VAR} placeholders.\"\n              },\n              \"keyPrefix\": {\n                \"type\": \"string\",\n                \"default\": \"memory-lancedb-pro:write-lock\",\n                \"description\": \"Prefix for Redis lock keys.\"\n              },\n              \"ttlMs\": {\n                \"type\": \"integer\",\n                \"minimum\": 1000,\n                \"default\": 60000,\n                \"description\": \"Redis lock TTL in milliseconds.\"\n              },\n              \"acquireTimeoutMs\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"default\": 5000,\n                \"description\": \"Maximum time to wait for the Redis lock before failing the write so the caller can retry later.\"\n              },\n              \"retryDelayMs\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"default\": 50,\n                \"description\": \"Initial Redis lock retry delay in milliseconds. Retries use exponential backoff.\"\n              },\n              \"connectTimeoutMs\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"default\": 1000,\n                \"description\": \"Redis connection timeout in milliseconds.\"\n              }\n            }\n          }\n        }\n      },\n      \"enableManagementTools\": {\n        \"type\": \"boolean\",\n        \"default\": false,\n        \"description\": \"Enable management/debug tools such as memory_list, memory_stats, and governance-oriented self-improvement review/extract actions\"\n      },\n      \"manualStoreSupersede\": {\n        \"type\": \"boolean\",\n        \"default\": false,\n        \"description\": \"Manual-priority store lane: a memory_store that finds a similar existing memory supersedes it instead of being rejected as a duplicate; the manual text always lands verbatim. Off by default to preserve the classic duplicate check.\"\n      },\n      \"sessionStrategy\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"memoryReflection\",\n          \"systemSessionMemory\",\n          \"none\"\n        ],\n        \"default\": \"none\",\n        \"description\": \"Choose session pipeline: plugin memory-reflection, built-in session-memory, or none. Default none keeps session summaries disabled unless explicitly enabled.\"\n      },\n      \"autoCapture\": {\n        \"type\": \"boolean\",\n        \"default\": true\n      },\n      \"autoRecall\": {\n        \"type\": \"boolean\",\n        \"default\": false\n      },\n      \"autoRecallMinLength\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 200,\n        \"default\": 15,\n        \"description\": \"Minimum prompt length (in characters) to trigger auto-recall. Prompts shorter than this are skipped. Default: 15 for English, 6 for CJK.\"\n      },\n      \"autoRecallMinRepeated\": {\n        \"type\": \"integer\",\n        \"minimum\": 0,\n        \"maximum\": 100,\n        \"default\": 8,\n        \"description\": \"Minimum number of turns before the same memory can be recalled again in the same session. Set to 0 to disable deduplication.\"\n      },\n      \"autoRecallBadRecallDecayMs\": {\n        \"type\": \"integer\",\n        \"minimum\": 0,\n        \"default\": 86400000,\n        \"$comment\": \"No maximum: 0 disables decay; very large values also effectively disable. Unlike sibling autoRecall* integers, this is a time window with no natural upper bound.\",\n        \"description\": \"If a memory's last auto-recall injection was more than this many ms ago, its bad_recall_count is reset to 0 on the next injection. 0 disables decay. Default: 86400000 (24 hours).\"\n      },\n      \"autoRecallSuppressionDurationMs\": {\n        \"type\": \"integer\",\n        \"minimum\": 0,\n        \"default\": 1800000,\n        \"$comment\": \"No maximum: 0 effectively disables suppression; large values allow long quarantine windows.\",\n        \"description\": \"When bad_recall_count reaches the suppression threshold, the memory is suppressed from auto-recall for this many ms from now. Default: 1800000 (30 minutes).\"\n      },\n      \"autoRecallTimeoutMs\": {\n        \"type\": \"integer\",\n        \"minimum\": 500,\n        \"maximum\": 60000,\n        \"default\": 5000,\n        \"description\": \"Timeout for the entire auto-recall pipeline (embedding + search + rerank) in milliseconds.\"\n      },\n      \"startupCheckTimeoutMs\": {\n        \"type\": \"integer\",\n        \"minimum\": 1000,\n        \"maximum\": 120000,\n        \"default\": 8000,\n        \"description\": \"Outer time budget in milliseconds for each startup health check phase (embedding, retrieval). Raise on hosts where a cold boot exceeds 8 seconds; the checks run after startup and never block the gateway.\"\n      },\n      \"autoRecallMaxItems\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 20,\n        \"default\": 3,\n        \"description\": \"Maximum number of memories auto-injected per turn.\"\n      },\n      \"autoRecallMaxChars\": {\n        \"type\": \"integer\",\n        \"minimum\": 64,\n        \"maximum\": 8000,\n        \"default\": 600,\n        \"description\": \"Maximum total character budget for auto-injected memory summaries.\"\n      },\n      \"autoRecallPerItemMaxChars\": {\n        \"type\": \"integer\",\n        \"minimum\": 32,\n        \"maximum\": 1000,\n        \"default\": 180,\n        \"description\": \"Maximum character budget per auto-injected memory summary.\"\n      },\n      \"autoRecallMaxQueryLength\": {\n        \"type\": \"integer\",\n        \"minimum\": 100,\n        \"maximum\": 10000,\n        \"default\": 2000,\n        \"description\": \"Maximum character length of the auto-recall query before truncation. Default: 2000.\"\n      },\n      \"maxRecallPerTurn\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 50,\n        \"default\": 10,\n        \"description\": \"Hard per-turn injection cap applied after dedup. Acts as a safety ceiling on top of autoRecallMaxItems to prevent context inflation. Default: 10.\"\n      },\n      \"recallMode\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"full\",\n          \"summary\",\n          \"adaptive\",\n          \"off\"\n        ],\n        \"default\": \"full\",\n        \"description\": \"Auto-recall depth mode. 'full': inject with configured per-item budget. 'summary': L0 abstracts only (compact). 'adaptive': analyze query intent to auto-select category and depth. 'off': disable auto-recall injection.\"\n      },\n      \"autoRecallExcludeAgents\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"string\"\n        },\n        \"description\": \"Agent/session patterns excluded from auto-recall and reflection injection. Supports exact match, wildcard prefix (e.g. pi-), and temp:*.\"\n      },\n      \"autoRecallIncludeAgents\": {\n        \"type\": \"array\",\n        \"items\": {\n          \"type\": \"string\"\n        },\n        \"default\": [],\n        \"description\": \"Whitelist mode for auto-recall injection. Only agents in this list receive auto-recall. Agent resolution falls back to 'main' when no explicit agentId is available. If both include and exclude are set, autoRecallIncludeAgents takes precedence (whitelist wins).\"\n      },\n      \"captureAssistant\": {\n        \"type\": \"boolean\"\n      },\n      \"smartExtraction\": {\n        \"type\": \"boolean\",\n        \"default\": true,\n        \"description\": \"Enable LLM-powered memory extraction. Falls back to regex capture when false.\"\n      },\n      \"extractMinMessages\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 100,\n        \"default\": 4,\n        \"description\": \"Minimum conversation messages required before smart extraction runs.\"\n      },\n      \"autoCaptureContextTurns\": {\n        \"type\": \"integer\",\n        \"minimum\": 0,\n        \"maximum\": 10,\n        \"default\": 0,\n        \"description\": \"Rolling context window for auto-capture extraction: how many recent user turns (with their assistant replies) stay in the transcript across extractions as context. 0 disables retention; each extraction then sees only its own call's turns.\"\n      },\n      \"batchChunkSize\": {\n        \"type\": \"integer\",\n        \"minimum\": 1,\n        \"maximum\": 50,\n        \"default\": 10,\n        \"description\": \"Per-call chunk bound for the batched pipeline LLM stages: admission utility, dedup decider, and merge writer. Larger bursts split into ceil(N/batchChunkSize) calls. Values above 50 are clamped.\"\n      },\n      \"extractMaxChars\": {\n        \"type\": \"integer\",\n        \"minimum\": 256,\n        \"maximum\": 100000,\n        \"default\": 8000,\n        \"description\": \"Maximum conversation characters sent to the smart extraction LLM.\"\n      },\n      \"admissionControl\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"description\": \"A-MAC-style admission governance on the smart-extraction write path. Rejects low-value candidates before persistence while preserving downstream dedup behavior for admitted candidates.\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": false\n          },\n          \"preset\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"balanced\",\n              \"conservative\",\n              \"high-recall\"\n            ],\n            \"default\": \"balanced\",\n            \"description\": \"Named admission tuning preset. Explicit admissionControl fields still override the selected preset.\"\n          },\n          \"model\": {\n            \"type\": \"string\",\n            \"description\": \"Optional absolute override: when set, every admission LLM call uses this model, regardless of modelAffinity.\"\n          },\n          \"modelAffinity\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"global\",\n              \"lane\"\n            ],\n            \"default\": \"global\",\n            \"description\": \"lane routes reflection-mapped admission calls to memoryReflection.model instead of the global llm model; global uses the plugin's global llm model for every lane.\"\n          },\n          \"utilityMode\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"standalone\",\n              \"off\",\n              \"batch\"\n            ],\n            \"default\": \"standalone\",\n            \"description\": \"standalone scores each candidate with its own LLM call; batch scores a whole extraction's candidates with one call per chunk of up to 10; off disables utility scoring entirely.\"\n          },\n          \"rejectThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.45\n          },\n          \"admitThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.6\n          },\n          \"utilityVetoThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.25,\n            \"description\": \"Utility scores at or below this are rejected regardless of the weighted composite (0 disables the veto)\"\n          },\n          \"noveltyCandidatePoolSize\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 20,\n            \"default\": 8\n          },\n          \"auditMetadata\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"persistRejectedAudits\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"rejectedAuditFilePath\": {\n            \"type\": \"string\",\n            \"description\": \"Optional JSONL file path for durable admission reject audit records. Defaults to a file beside the plugin memory data directory.\"\n          },\n          \"recency\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"halfLifeDays\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"maximum\": 365,\n                \"default\": 14\n              }\n            }\n          },\n          \"weights\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"utility\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.1\n              },\n              \"confidence\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.1\n              },\n              \"novelty\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.1\n              },\n              \"recency\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.1\n              },\n              \"typePrior\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.6\n              }\n            }\n          },\n          \"typePriors\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"profile\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.95\n              },\n              \"preferences\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.9\n              },\n              \"entities\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.75\n              },\n              \"events\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.45\n              },\n              \"cases\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.8\n              },\n              \"patterns\": {\n                \"type\": \"number\",\n                \"minimum\": 0,\n                \"maximum\": 1,\n                \"default\": 0.85\n              }\n            }\n          }\n        }\n      },\n      \"retrieval\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"mode\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"hybrid\",\n              \"vector\"\n            ],\n            \"default\": \"hybrid\"\n          },\n          \"vectorWeight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.7\n          },\n          \"bm25Weight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"minScore\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"rerank\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"cross-encoder\",\n              \"lightweight\",\n              \"none\"\n            ],\n            \"default\": \"cross-encoder\"\n          },\n          \"rerankApiKey\": {\n            \"oneOf\": [\n              {\n                \"type\": \"string\",\n                \"minLength\": 1\n              },\n              {\n                \"type\": \"object\",\n                \"additionalProperties\": true,\n                \"required\": [\n                  \"source\",\n                  \"id\"\n                ],\n                \"properties\": {\n                  \"source\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"env\",\n                      \"file\"\n                    ]\n                  },\n                  \"provider\": {\n                    \"type\": \"string\"\n                  },\n                  \"id\": {\n                    \"type\": \"string\",\n                    \"minLength\": 1\n                  }\n                }\n              }\n            ],\n            \"description\": \"API key for reranker service (enables cross-encoder reranking)\"\n          },\n          \"rerankModel\": {\n            \"type\": \"string\",\n            \"default\": \"jina-reranker-v3\",\n            \"description\": \"Reranker model name\"\n          },\n          \"rerankEndpoint\": {\n            \"type\": \"string\",\n            \"default\": \"https://api.jina.ai/v1/rerank\",\n            \"description\": \"Reranker API endpoint URL. Compatible with Jina-compatible endpoints and dedicated adapters such as TEI, SiliconFlow, Voyage, Pinecone, and DashScope.\"\n          },\n          \"rerankTimeoutMs\": {\n            \"type\": \"integer\",\n            \"minimum\": 500,\n            \"default\": 5000,\n            \"description\": \"Rerank API timeout in milliseconds (default: 5000). Increase for local/CPU-based rerank servers.\"\n          },\n          \"rerankProvider\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"jina\",\n              \"siliconflow\",\n              \"voyage\",\n              \"pinecone\",\n              \"dashscope\",\n              \"tei\"\n            ],\n            \"default\": \"jina\",\n            \"description\": \"Reranker provider format. Determines request/response shape and auth header. Use tei for Hugging Face Text Embeddings Inference /rerank endpoints. DashScope uses gte-rerank-v2 with endpoint https://dashscope.aliyuncs.com/api/v1/services/rerank/text-rerank/text-rerank.\"\n          },\n          \"candidatePoolSize\": {\n            \"type\": \"integer\",\n            \"minimum\": 10,\n            \"maximum\": 100,\n            \"default\": 20\n          },\n          \"recencyHalfLifeDays\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 365,\n            \"default\": 14,\n            \"description\": \"Half-life in days for recency boost. Newer memories get higher scores. Set 0 to disable.\"\n          },\n          \"recencyWeight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 0.5,\n            \"default\": 0.1,\n            \"description\": \"Maximum recency boost factor added to score\"\n          },\n          \"filterNoise\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Filter out noise memories (agent denials, meta-questions, boilerplate)\"\n          },\n          \"neighborEnrichment\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"default\": {\n              \"enabled\": false,\n              \"maxPerResult\": 2\n            },\n            \"description\": \"Default-off retrieval-time BM25 neighbor enrichment for hybrid search results.\",\n            \"properties\": {\n              \"enabled\": {\n                \"type\": \"boolean\",\n                \"default\": false,\n                \"description\": \"Attach bounded same-scope BM25 neighbors to each top-level hybrid retrieval result.\"\n              },\n              \"maxPerResult\": {\n                \"type\": \"integer\",\n                \"minimum\": 1,\n                \"maximum\": 5,\n                \"default\": 2,\n                \"description\": \"Maximum supplemental neighbors to attach per top-level result.\"\n              }\n            }\n          },\n          \"disableNativeCosine\": {\n            \"type\": \"boolean\",\n            \"default\": false,\n            \"description\": \"Disable LanceDB native vector search and rank scoped rows with JavaScript cosine. Enable on AVX-only Linux x64 CPUs that crash with SIGILL in LanceDB native vector search.\"\n          },\n          \"lengthNormAnchor\": {\n            \"type\": \"integer\",\n            \"minimum\": 0,\n            \"maximum\": 5000,\n            \"default\": 500,\n            \"description\": \"Length normalization anchor in chars. Entries longer than this get score penalized. Set 0 to disable.\"\n          },\n          \"hardMinScore\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.35,\n            \"description\": \"Hard cutoff after all scoring stages. Results below this score are discarded.\"\n          },\n          \"timeDecayHalfLifeDays\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 365,\n            \"default\": 60,\n            \"description\": \"Time decay half-life in days. Old entries lose score gradually. Floor at 0.5x. Set 0 to disable.\"\n          },\n          \"reinforcementFactor\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 2,\n            \"default\": 0.5,\n            \"description\": \"Access reinforcement factor for time decay. Frequently recalled memories decay slower. 0 to disable.\"\n          },\n          \"maxHalfLifeMultiplier\": {\n            \"type\": \"number\",\n            \"minimum\": 1,\n            \"maximum\": 10,\n            \"default\": 3,\n            \"description\": \"Maximum half-life multiplier from access reinforcement. Prevents frequently accessed memories from becoming immortal.\"\n          }\n        }\n      },\n      \"decay\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"recencyHalfLifeDays\": {\n            \"type\": \"number\",\n            \"minimum\": 1,\n            \"maximum\": 365,\n            \"default\": 30\n          },\n          \"recencyWeight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.4\n          },\n          \"frequencyWeight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"intrinsicWeight\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"staleThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"searchBoostMin\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.3\n          },\n          \"importanceModulation\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 10,\n            \"default\": 1.5\n          },\n          \"betaCore\": {\n            \"type\": \"number\",\n            \"minimum\": 0.1,\n            \"maximum\": 5,\n            \"default\": 0.8\n          },\n          \"betaWorking\": {\n            \"type\": \"number\",\n            \"minimum\": 0.1,\n            \"maximum\": 5,\n            \"default\": 1\n          },\n          \"betaPeripheral\": {\n            \"type\": \"number\",\n            \"minimum\": 0.1,\n            \"maximum\": 5,\n            \"default\": 1.3\n          },\n          \"coreDecayFloor\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.9\n          },\n          \"workingDecayFloor\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.7\n          },\n          \"peripheralDecayFloor\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.5\n          }\n        }\n      },\n      \"tier\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"coreAccessThreshold\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 1000,\n            \"default\": 10\n          },\n          \"coreCompositeThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.7\n          },\n          \"coreImportanceThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.8\n          },\n          \"peripheralCompositeThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.15\n          },\n          \"peripheralAgeDays\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 3650,\n            \"default\": 60\n          },\n          \"workingAccessThreshold\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 1000,\n            \"default\": 3\n          },\n          \"workingCompositeThreshold\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1,\n            \"default\": 0.4\n          }\n        }\n      },\n      \"sessionMemory\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"description\": \"Deprecated legacy switch. Kept for compatibility and mapped to sessionStrategy.\",\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": false,\n            \"description\": \"Deprecated. true -> sessionStrategy=systemSessionMemory, false -> sessionStrategy=none. Disabled by default.\"\n          },\n          \"messageCount\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 100,\n            \"default\": 15,\n            \"description\": \"Legacy compatibility field. Mapped to memoryReflection.messageCount.\"\n          }\n        }\n      },\n      \"selfImprovement\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"beforeResetNote\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"skipSubagentBootstrap\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"ensureLearningFiles\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"maxEntries\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"default\": 500,\n            \"description\": \"Maximum number of entries to retain per .learnings file before new appends are skipped.\"\n          }\n        }\n      },\n      \"canonicalCorpus\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Index canonical OpenClaw memory files into LanceDB while keeping the files as source of truth.\"\n          },\n          \"syncOnSearch\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Refresh canonical corpus entries opportunistically before memory runtime searches.\"\n          },\n          \"syncIntervalMs\": {\n            \"type\": \"integer\",\n            \"minimum\": 0,\n            \"default\": 60000,\n            \"description\": \"Minimum interval between opportunistic canonical corpus sync attempts.\"\n          },\n          \"includeMemoryDir\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Index MEMORY.md and memory/**/*.md from configured OpenClaw workspaces.\"\n          },\n          \"includeSessionTranscripts\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Index recent OpenClaw session JSONL transcripts as grounded session-source search results.\"\n          },\n          \"includeDreamingArtifacts\": {\n            \"type\": \"boolean\",\n            \"default\": true,\n            \"description\": \"Index memory/dreaming/**/*.md as dream-report public artifacts.\"\n          },\n          \"maxSessionFilesPerAgent\": {\n            \"type\": \"integer\",\n            \"minimum\": 0,\n            \"default\": 25,\n            \"description\": \"Maximum recent session transcript files to index per agent.\"\n          },\n          \"maxFileBytes\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"default\": 1000000,\n            \"description\": \"Skip canonical corpus files larger than this size.\"\n          }\n        }\n      },\n      \"dreaming\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"enabled\": {\n            \"type\": \"boolean\"\n          },\n          \"frequency\": {\n            \"type\": \"string\"\n          },\n          \"model\": {\n            \"type\": \"string\"\n          },\n          \"timezone\": {\n            \"type\": \"string\"\n          },\n          \"verboseLogging\": {\n            \"type\": \"boolean\"\n          },\n          \"storage\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"mode\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"inline\",\n                  \"separate\",\n                  \"both\"\n                ]\n              },\n              \"separateReports\": {\n                \"type\": \"boolean\"\n              }\n            }\n          },\n          \"execution\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"defaults\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"speed\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"fast\",\n                      \"balanced\",\n                      \"slow\"\n                    ]\n                  },\n                  \"thinking\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"low\",\n                      \"medium\",\n                      \"high\"\n                    ]\n                  },\n                  \"budget\": {\n                    \"type\": \"string\",\n                    \"enum\": [\n                      \"cheap\",\n                      \"medium\",\n                      \"expensive\"\n                    ]\n                  },\n                  \"model\": {\n                    \"type\": \"string\"\n                  },\n                  \"maxOutputTokens\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 1\n                  },\n                  \"temperature\": {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"maximum\": 2\n                  },\n                  \"timeoutMs\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 1000\n                  }\n                }\n              }\n            }\n          },\n          \"phases\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n              \"light\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"enabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"lookbackDays\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"limit\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"dedupeSimilarity\": {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"maximum\": 1\n                  },\n                  \"sources\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"daily\",\n                        \"sessions\",\n                        \"recall\"\n                      ]\n                    }\n                  },\n                  \"execution\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"speed\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"fast\",\n                          \"balanced\",\n                          \"slow\"\n                        ]\n                      },\n                      \"thinking\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"low\",\n                          \"medium\",\n                          \"high\"\n                        ]\n                      },\n                      \"budget\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"cheap\",\n                          \"medium\",\n                          \"expensive\"\n                        ]\n                      },\n                      \"model\": {\n                        \"type\": \"string\"\n                      },\n                      \"maxOutputTokens\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1\n                      },\n                      \"temperature\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 2\n                      },\n                      \"timeoutMs\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1000\n                      }\n                    }\n                  }\n                }\n              },\n              \"deep\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"enabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"limit\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"minScore\": {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"maximum\": 1\n                  },\n                  \"minRecallCount\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"minUniqueQueries\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"recencyHalfLifeDays\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"maxAgeDays\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 1\n                  },\n                  \"sources\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"daily\",\n                        \"memory\",\n                        \"sessions\",\n                        \"logs\",\n                        \"recall\"\n                      ]\n                    }\n                  },\n                  \"recovery\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"enabled\": {\n                        \"type\": \"boolean\"\n                      },\n                      \"triggerBelowHealth\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 1\n                      },\n                      \"lookbackDays\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 0\n                      },\n                      \"maxRecoveredCandidates\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 0\n                      },\n                      \"minRecoveryConfidence\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 1\n                      },\n                      \"autoWriteMinConfidence\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 1\n                      }\n                    }\n                  },\n                  \"execution\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"speed\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"fast\",\n                          \"balanced\",\n                          \"slow\"\n                        ]\n                      },\n                      \"thinking\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"low\",\n                          \"medium\",\n                          \"high\"\n                        ]\n                      },\n                      \"budget\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"cheap\",\n                          \"medium\",\n                          \"expensive\"\n                        ]\n                      },\n                      \"model\": {\n                        \"type\": \"string\"\n                      },\n                      \"maxOutputTokens\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1\n                      },\n                      \"temperature\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 2\n                      },\n                      \"timeoutMs\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1000\n                      }\n                    }\n                  }\n                }\n              },\n              \"rem\": {\n                \"type\": \"object\",\n                \"additionalProperties\": false,\n                \"properties\": {\n                  \"enabled\": {\n                    \"type\": \"boolean\"\n                  },\n                  \"lookbackDays\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"limit\": {\n                    \"type\": \"integer\",\n                    \"minimum\": 0\n                  },\n                  \"minPatternStrength\": {\n                    \"type\": \"number\",\n                    \"minimum\": 0,\n                    \"maximum\": 1\n                  },\n                  \"sources\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                      \"type\": \"string\",\n                      \"enum\": [\n                        \"memory\",\n                        \"daily\",\n                        \"deep\"\n                      ]\n                    }\n                  },\n                  \"execution\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                      \"speed\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"fast\",\n                          \"balanced\",\n                          \"slow\"\n                        ]\n                      },\n                      \"thinking\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"low\",\n                          \"medium\",\n                          \"high\"\n                        ]\n                      },\n                      \"budget\": {\n                        \"type\": \"string\",\n                        \"enum\": [\n                          \"cheap\",\n                          \"medium\",\n                          \"expensive\"\n                        ]\n                      },\n                      \"model\": {\n                        \"type\": \"string\"\n                      },\n                      \"maxOutputTokens\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1\n                      },\n                      \"temperature\": {\n                        \"type\": \"number\",\n                        \"minimum\": 0,\n                        \"maximum\": 2\n                      },\n                      \"timeoutMs\": {\n                        \"type\": \"integer\",\n                        \"minimum\": 1000\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      },\n      \"memoryReflection\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"properties\": {\n          \"storeToLanceDB\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"writeLegacyCombined\": {\n            \"type\": \"boolean\",\n            \"default\": true\n          },\n          \"injectMode\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"inheritance-only\",\n              \"inheritance+derived\"\n            ],\n            \"default\": \"inheritance+derived\"\n          },\n          \"agentId\": {\n            \"type\": \"string\",\n            \"description\": \"Optional dedicated agent id used to run reflection generation (for example: memory-distiller).\"\n          },\n          \"model\": {\n            \"type\": \"string\",\n            \"description\": \"Optional provider/model override used to generate the reflection. Falls back to the reflection agent's primary model, then the plugin llm.model.\"\n          },\n          \"messageCount\": {\n            \"type\": \"integer\",\n            \"minimum\": 1,\n            \"maximum\": 500,\n            \"default\": 120\n</yakaai_skills>"}