Fixes #771 — two trailing commas in openclaw.plugin.json caused OpenClaw's strict JSON parser to reject the plugin manifest during installation. Also adds JSON validation tests for both the openclaw plugin manifest and the claude-code hooks.json so CI catches invalid JSON before release.
354 lines
12 KiB
JSON
354 lines
12 KiB
JSON
{
|
|
"id": "hindsight-openclaw",
|
|
"name": "Hindsight Memory",
|
|
"kind": "memory",
|
|
"configSchema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"daemonIdleTimeout": {
|
|
"type": "number",
|
|
"description": "Seconds before daemon shuts down from inactivity (0 = never)",
|
|
"default": 0
|
|
},
|
|
"embedPort": {
|
|
"type": "number",
|
|
"description": "Port for hindsight-embed server (auto-assigned if not specified)",
|
|
"default": 0
|
|
},
|
|
"bankMission": {
|
|
"type": "string",
|
|
"description": "Agent identity/purpose stored on the memory bank. Helps the memory engine understand context for better fact extraction during retain. Set once per bank on first use — this is not a recall prompt.",
|
|
"default": "You are an AI assistant helping users across multiple communication channels (Telegram, Slack, Discord, etc.). Remember user preferences, instructions, and important context from conversations to provide personalized assistance."
|
|
},
|
|
"embedVersion": {
|
|
"type": "string",
|
|
"description": "hindsight-embed version to use (e.g. 'latest', '0.4.2', or empty for latest)",
|
|
"default": "latest"
|
|
},
|
|
"llmProvider": {
|
|
"type": "string",
|
|
"description": "LLM provider for Hindsight memory (e.g. 'openai', 'anthropic', 'gemini', 'groq', 'ollama', 'openai-codex', 'claude-code'). Takes priority over auto-detection but not over HINDSIGHT_API_LLM_PROVIDER env var.",
|
|
"enum": [
|
|
"openai",
|
|
"anthropic",
|
|
"gemini",
|
|
"groq",
|
|
"ollama",
|
|
"openai-codex",
|
|
"claude-code"
|
|
]
|
|
},
|
|
"llmModel": {
|
|
"type": "string",
|
|
"description": "LLM model to use (e.g. 'gpt-4o-mini', 'claude-3-5-haiku-20241022'). Used with llmProvider."
|
|
},
|
|
"llmApiKeyEnv": {
|
|
"type": "string",
|
|
"description": "Name of the env var holding the API key (e.g. 'MY_CUSTOM_KEY'). If not set, uses the standard env var for the chosen provider."
|
|
},
|
|
"embedPackagePath": {
|
|
"type": "string",
|
|
"description": "Local path to hindsight package for development (e.g. '/path/to/hindsight'). When set, uses 'uv run --directory <path>' instead of 'uvx hindsight-embed@latest'."
|
|
},
|
|
"apiPort": {
|
|
"type": "number",
|
|
"description": "Port for the openclaw profile daemon (default: 9077)",
|
|
"default": 9077
|
|
},
|
|
"hindsightApiUrl": {
|
|
"type": "string",
|
|
"description": "External Hindsight API URL (e.g. 'https://mcp.hindsight.devcraft.team'). When set, skips local daemon and connects directly to this API."
|
|
},
|
|
"hindsightApiToken": {
|
|
"type": "string",
|
|
"description": "API token for external Hindsight API authentication. Required if the external API has authentication enabled."
|
|
},
|
|
"dynamicBankId": {
|
|
"type": "boolean",
|
|
"description": "Enable per-user memory banks. When true, memories are isolated by user per channel (e.g., slack-U123, telegram-456789). When false, all users share a single 'openclaw' bank.",
|
|
"default": true
|
|
},
|
|
"bankIdPrefix": {
|
|
"type": "string",
|
|
"description": "Optional prefix for bank IDs (e.g., 'prod' results in 'prod-slack-U123'). Useful for separating environments."
|
|
},
|
|
"autoRecall": {
|
|
"type": "boolean",
|
|
"description": "Automatically recall memories on every prompt and inject them as context. Set to false when agent has its own recall tool.",
|
|
"default": true
|
|
},
|
|
"excludeProviders": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "Message providers to exclude from recall and retain (e.g. ['telegram', 'discord'])"
|
|
},
|
|
"dynamicBankGranularity": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": [
|
|
"agent",
|
|
"channel",
|
|
"user",
|
|
"provider"
|
|
]
|
|
},
|
|
"description": "Fields used to derive bank ID. Controls memory isolation granularity. Default: ['agent', 'channel', 'user'].",
|
|
"default": [
|
|
"agent",
|
|
"channel",
|
|
"user"
|
|
]
|
|
},
|
|
"autoRetain": {
|
|
"type": "boolean",
|
|
"description": "Automatically retain conversation as memories after each interaction. Set to false to disable.",
|
|
"default": true
|
|
},
|
|
"retainRoles": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": [
|
|
"user",
|
|
"assistant",
|
|
"system",
|
|
"tool"
|
|
]
|
|
},
|
|
"description": "Message roles to include in retained transcript. Default: ['user', 'assistant'].",
|
|
"default": [
|
|
"user",
|
|
"assistant"
|
|
]
|
|
},
|
|
"retainEveryNTurns": {
|
|
"type": "integer",
|
|
"description": "Retain every Nth turn instead of every turn. 1 = every turn (default). Values > 1 enable chunked retention with a sliding window.",
|
|
"minimum": 1,
|
|
"default": 1
|
|
},
|
|
"retainOverlapTurns": {
|
|
"type": "integer",
|
|
"description": "Extra prior turns to include when chunked retention fires. Window = retainEveryNTurns + retainOverlapTurns. Only applies when retainEveryNTurns > 1.",
|
|
"minimum": 0,
|
|
"default": 0
|
|
},
|
|
"recallBudget": {
|
|
"type": "string",
|
|
"description": "Recall effort level. Higher budgets use more retrieval strategies for better results but take longer.",
|
|
"enum": ["low", "mid", "high"],
|
|
"default": "mid"
|
|
},
|
|
"recallMaxTokens": {
|
|
"type": "integer",
|
|
"description": "Maximum tokens for recall response. Controls how much memory context is injected per turn.",
|
|
"minimum": 1,
|
|
"default": 1024
|
|
},
|
|
"recallTypes": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": ["world", "experience", "observation"]
|
|
},
|
|
"description": "Memory types to recall. Defaults to ['world', 'experience'] — excludes verbose observation entries.",
|
|
"default": ["world", "experience"]
|
|
},
|
|
"recallRoles": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string",
|
|
"enum": ["user", "assistant", "system", "tool"]
|
|
},
|
|
"description": "Roles to include when composing contextual recall query. Default: ['user', 'assistant'].",
|
|
"default": ["user", "assistant"]
|
|
},
|
|
"recallContextTurns": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"description": "Number of user turns to include in recall query context. 1 keeps latest-message-only behavior.",
|
|
"default": 1
|
|
},
|
|
"recallMaxQueryChars": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"description": "Maximum character length for composed recall query before calling recall.",
|
|
"default": 800
|
|
},
|
|
"recallTopK": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"description": "Maximum number of memories to inject per turn. Applied after API response as a hard cap."
|
|
},
|
|
"recallPromptPreamble": {
|
|
"type": "string",
|
|
"description": "Text shown above recalled memories in the injected context block.",
|
|
"default": "Relevant memories from past conversations (prioritize recent when conflicting). Only use memories that are directly useful to continue this conversation; ignore the rest:"
|
|
},
|
|
"recallTimeoutMs": {
|
|
"type": "integer",
|
|
"minimum": 1000,
|
|
"description": "Timeout for auto-recall in milliseconds. Increase if recall times out with high budget.",
|
|
"default": 10000
|
|
},
|
|
"recallInjectionPosition": {
|
|
"type": "string",
|
|
"enum": ["prepend", "append", "user"],
|
|
"description": "Where to inject recalled memories. 'prepend' = start of system prompt (default), 'append' = end of system prompt (preserves prompt cache), 'user' = before user message.",
|
|
"default": "prepend"
|
|
},
|
|
"debug": {
|
|
"type": "boolean",
|
|
"description": "Enable debug logging for Hindsight plugin operations. Equivalent to logLevel: 'debug'.",
|
|
"default": false
|
|
},
|
|
"logLevel": {
|
|
"type": "string",
|
|
"description": "Console log verbosity. 'off' = no output, 'error' = errors only, 'warning' = errors + warnings, 'info' = key events + periodic summaries, 'debug' = all details.",
|
|
"enum": ["off", "error", "warning", "info", "debug"],
|
|
"default": "info"
|
|
},
|
|
"logSummaryIntervalMs": {
|
|
"type": "number",
|
|
"description": "Interval in ms to batch retain/recall log summaries. 0 = log every event individually. Default: 300000 (5 min).",
|
|
"default": 300000
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"uiHints": {
|
|
"daemonIdleTimeout": {
|
|
"label": "Daemon Idle Timeout",
|
|
"placeholder": "0 (never timeout)"
|
|
},
|
|
"embedPort": {
|
|
"label": "Embed Server Port",
|
|
"placeholder": "0 (auto-assign)"
|
|
},
|
|
"bankMission": {
|
|
"label": "Bank Mission",
|
|
"placeholder": "Custom context for what this agent does..."
|
|
},
|
|
"embedVersion": {
|
|
"label": "Hindsight Embed Version",
|
|
"placeholder": "latest (or pin to specific version like 0.4.2)"
|
|
},
|
|
"llmProvider": {
|
|
"label": "LLM Provider",
|
|
"placeholder": "e.g. openai, anthropic, gemini, groq"
|
|
},
|
|
"llmModel": {
|
|
"label": "LLM Model",
|
|
"placeholder": "e.g. gpt-4o-mini, claude-3-5-haiku-20241022"
|
|
},
|
|
"llmApiKeyEnv": {
|
|
"label": "API Key Env Var",
|
|
"placeholder": "e.g. MY_CUSTOM_API_KEY (optional)"
|
|
},
|
|
"embedPackagePath": {
|
|
"label": "Local Package Path (Dev)",
|
|
"placeholder": "/path/to/hindsight (for local development)"
|
|
},
|
|
"apiPort": {
|
|
"label": "API Port",
|
|
"placeholder": "9077 (default)"
|
|
},
|
|
"hindsightApiUrl": {
|
|
"label": "External Hindsight API URL",
|
|
"placeholder": "e.g. https://mcp.hindsight.devcraft.team (leave empty for local daemon)"
|
|
},
|
|
"hindsightApiToken": {
|
|
"label": "External API Token",
|
|
"placeholder": "API token if external API requires authentication"
|
|
},
|
|
"dynamicBankId": {
|
|
"label": "Dynamic Bank IDs",
|
|
"placeholder": "true (isolate memories per channel)"
|
|
},
|
|
"bankIdPrefix": {
|
|
"label": "Bank ID Prefix",
|
|
"placeholder": "e.g., prod, staging (optional)"
|
|
},
|
|
"autoRecall": {
|
|
"label": "Auto-Recall",
|
|
"placeholder": "true (inject memories on every prompt)"
|
|
},
|
|
"excludeProviders": {
|
|
"label": "Excluded Providers",
|
|
"placeholder": "e.g. telegram, discord"
|
|
},
|
|
"dynamicBankGranularity": {
|
|
"label": "Bank Granularity",
|
|
"placeholder": "e.g. ['agent', 'channel', 'user']"
|
|
},
|
|
"autoRetain": {
|
|
"label": "Auto-Retain",
|
|
"placeholder": "true (enable auto-retention)"
|
|
},
|
|
"retainRoles": {
|
|
"label": "Retain Roles",
|
|
"placeholder": "e.g. ['user', 'assistant']"
|
|
},
|
|
"retainEveryNTurns": {
|
|
"label": "Retain Every N Turns",
|
|
"placeholder": "1 (every turn, default)"
|
|
},
|
|
"retainOverlapTurns": {
|
|
"label": "Retain Overlap Turns",
|
|
"placeholder": "0 (no overlap, default)"
|
|
},
|
|
"recallBudget": {
|
|
"label": "Recall Budget",
|
|
"placeholder": "low, mid, or high"
|
|
},
|
|
"recallMaxTokens": {
|
|
"label": "Recall Max Tokens",
|
|
"placeholder": "1024 (default)"
|
|
},
|
|
"recallTypes": {
|
|
"label": "Recall Types",
|
|
"placeholder": "e.g. ['world', 'experience']"
|
|
},
|
|
"recallRoles": {
|
|
"label": "Recall Roles",
|
|
"placeholder": "e.g. ['user', 'assistant']"
|
|
},
|
|
"recallContextTurns": {
|
|
"label": "Recall Context Turns",
|
|
"placeholder": "1 (latest only, default)"
|
|
},
|
|
"recallMaxQueryChars": {
|
|
"label": "Recall Max Query Chars",
|
|
"placeholder": "800 (default)"
|
|
},
|
|
"recallTopK": {
|
|
"label": "Recall Top K",
|
|
"placeholder": "e.g. 5 (no limit by default)"
|
|
},
|
|
"recallPromptPreamble": {
|
|
"label": "Recall Prompt Preamble",
|
|
"placeholder": "Instruction shown above recalled memories in injected context"
|
|
},
|
|
"recallTimeoutMs": {
|
|
"label": "Recall Timeout (ms)",
|
|
"placeholder": "10000 (default)"
|
|
},
|
|
"recallInjectionPosition": {
|
|
"label": "Recall Injection Position",
|
|
"placeholder": "prepend, append, or user"
|
|
},
|
|
"debug": {
|
|
"label": "Debug"
|
|
},
|
|
"logLevel": {
|
|
"label": "Log Level"
|
|
},
|
|
"logSummaryIntervalMs": {
|
|
"label": "Log Summary Interval (ms)",
|
|
"placeholder": "300000"
|
|
}
|
|
}
|
|
}
|