npx skills add https://github.com/vectorize-io/hindsight --skill hindsight-docsOpenCode
Persistent long-term memory plugin for OpenCode using Hindsight. Automatically captures conversations, recalls relevant context on session start, and provides retain/recall/reflect tools the agent can call directly.
Quick Startβ
Add to your opencode.json (project) or ~/.config/opencode/opencode.json (global):
{
"$schema":"https://opencode.ai/config.json",
"plugin":["@vectorize-io/opencode-hindsight"]
}
OpenCode auto-installs plugins in the "plugin" array on startup β no npm install required.
Point the plugin at your Hindsight server and start OpenCode:
exportHINDSIGHT_API_URL="http://localhost:8888"
opencode
Using Hindsight Cloudβ
Get an API key at ui.hindsight.vectorize.io/connect:
exportHINDSIGHT_API_URL="https://api.hindsight.vectorize.io"
exportHINDSIGHT_API_TOKEN="your-api-key"
opencode
Or configure inline via plugin options in opencode.json:
{
"$schema":"https://opencode.ai/config.json",
"plugin":[
["@vectorize-io/opencode-hindsight",{
"hindsightApiUrl":"https://api.hindsight.vectorize.io",
"hindsightApiToken":"your-api-key"
}]
]
}
Featuresβ
Custom Toolsβ
The plugin registers three tools the agent can call explicitly:
| Tool | Description |
|---|---|
hindsight_retain | Store information in long-term memory |
hindsight_recall | Search long-term memory for relevant information |
hindsight_reflect | Generate a synthesized answer from long-term memory |
Auto-Retainβ
When the session goes idle (session.idle event), the plugin automatically retains the conversation transcript to Hindsight. Configurable via retainEveryNTurns to control frequency.
Session Recallβ
When a new session starts, the plugin recalls relevant project context and injects it into the system prompt, giving the agent access to memories from prior sessions.
Compaction Hookβ
When OpenCode compacts the context window, the plugin:
- Retains the current conversation before compaction
- Recalls relevant memories and injects them into the compaction context
This ensures memories survive context window trimming.
Configurationβ
Plugin Optionsβ
{
"plugin":[
["@vectorize-io/opencode-hindsight",{
"hindsightApiUrl":"http://localhost:8888",
"hindsightApiToken":"your-api-key",
"bankId":"my-project",
"autoRecall":true,
"autoRetain":true,
"recallBudget":"mid",
"recallTags":[],
"recallTagsMatch":"any",
"retainTags":[],
"retainEveryNTurns":3,
"debug":false
}]
]
}
Config Fileβ
Create ~/.hindsight/opencode.json for persistent configuration that applies across all projects:
{
"hindsightApiUrl":"http://localhost:8888",
"hindsightApiToken":"your-api-key",
"recallBudget":"mid"
}
Environment Variablesβ
| Variable | Description | Default |
|---|---|---|
HINDSIGHT_API_URL | Hindsight API base URL | (required) |
HINDSIGHT_API_TOKEN | API key for authentication | |
HINDSIGHT_BANK_ID | Static memory bank ID | opencode |
HINDSIGHT_AGENT_NAME | Agent name for dynamic bank IDs | opencode |
HINDSIGHT_AUTO_RECALL | Auto-recall on session start | true |
HINDSIGHT_AUTO_RETAIN | Auto-retain on session idle | true |
HINDSIGHT_RETAIN_MODE | full-session or last-turn | full-session |
HINDSIGHT_RECALL_BUDGET | Recall budget: low, mid, high | mid |
HINDSIGHT_RECALL_MAX_TOKENS | Max tokens for recall results | 1024 |
HINDSIGHT_RECALL_TAGS | Comma-separated tags to filter recall results | |
HINDSIGHT_RECALL_TAGS_MATCH | Tag match mode: any, all, any_strict, all_strict | any |
HINDSIGHT_DYNAMIC_BANK_ID | Enable dynamic bank ID derivation | false |
HINDSIGHT_BANK_MISSION | Bank mission/context for reflect |
Configuration priority (later wins): defaults < ~/.hindsight/opencode.json < plugin options < env vars.
Logging & debuggingβ
The plugin logs through OpenCode's own log stream (service=hindsight), visible with opencode --print-logs or in the OpenCode log files. Errors (failed retain/recall, unreachable API, auth problems) and the resolved API URL + bank are logged by default β so if memories aren't saving, the reason is visible without any opt-in.
Verbose tracing is controlled by the debug option, which is config-only (set "debug": true in opencode.json plugin options or ~/.hindsight/opencode.json). There is intentionally no HINDSIGHT_DEBUG environment variable: env vars are unreliable to set for OpenCode's plugin runtime (notably on Windows, where a persistent OpenCode server may never see them).
{
"plugin":[["@vectorize-io/opencode-hindsight",{"debug":true}]]
}
Dynamic Bank IDsβ
For multi-project isolation, enable dynamic bank ID derivation:
exportHINDSIGHT_DYNAMIC_BANK_ID=true
The bank ID is composed from granularity fields (default: agent::project). Supported fields: agent, project, channel, user.
For multi-user scenarios (e.g., shared agent serving multiple users):
exportHINDSIGHT_CHANNEL_ID="slack-general"
exportHINDSIGHT_USER_ID="user123"
How It Worksβ
- Plugin loads when OpenCode starts β creates a
HindsightClient, derives the bank ID, and registers tools + hooks - Session starts β
session.createdevent triggers, plugin marks session for recall injection - System transform β on the first LLM call, recalled memories are injected into the system prompt
- Agent works β can call
hindsight_recallandhindsight_retainexplicitly during the session - Session idles β
session.idleevent triggers auto-retain of the conversation - Compaction β if the context window fills up, memories are preserved through the compaction