Files
opencode-working-memory/docs/configuration.md
T
2026-04-29 16:56:47 +08:00

250 lines
6.7 KiB
Markdown

# Configuration Guide
## Overview
OpenCode Working Memory works out-of-the-box with sensible defaults. Configuration is defined in `src/types.ts` as constants.
## Workspace Memory Limits
```typescript
const LONG_TERM_LIMITS = {
maxRenderedChars: 3600, // Maximum characters in system prompt
targetRenderedChars: 3000, // Target characters (leave buffer)
maxEntries: 28, // Maximum number of entries
maxEntryTextChars: 260, // Maximum characters per entry text
maxRationaleChars: 180, // Maximum characters per entry rationale
};
```
**Recommendations**:
- Keep `maxRenderedChars` under 5500 to avoid context bloat
- Defaults are calibrated from observed rendered usage that was typically under ~2000 characters
- `maxEntries` of 28 provides good coverage without overwhelming
- Entry text limits ensure entries stay concise
## Retention Model Defaults
Workspace memory retention uses strength-based decay. These constants live in `src/workspace-memory.ts`:
```typescript
const BASE_HALF_LIFE_DAYS = 45;
const REINFORCEMENT_HALFLIFE_FACTOR = 0.85;
const REINFORCEMENT_MAX_COUNT = 6;
const WORKSPACE_DORMANT_AFTER_DAYS = 14;
const DORMANT_DECAY_MULTIPLIER = 0.25;
```
Initial strength uses type, source, user importance, and safety-critical factors. Confidence is stored for compatibility but is not used for retention scoring.
Rendered type caps prevent one type from filling all workspace memory slots:
| Type | Rendered cap |
|------|--------------|
| `feedback` | 10 |
| `decision` | 10 |
| `project` | 8 |
| `reference` | 6 |
Safety-critical memories are exempt from type caps but still compete under the global `maxEntries` limit. Old or stale-marked memories are not hard-pruned by age; they lose rendered space through strength and cap competition.
## Hot Session State Limits
```typescript
const HOT_STATE_LIMITS = {
maxRenderedChars: 700, // Maximum characters in system prompt
maxActiveFilesStored: 20, // Maximum files tracked in state
maxActiveFilesRendered: 8, // Maximum files shown in prompt
maxOpenErrorsStored: 5, // Maximum errors tracked
maxOpenErrorsRendered: 3, // Maximum errors shown in prompt
maxRecentDecisionsStored: 8, // Maximum decisions tracked
};
```
**Recommendations**:
- Keep `maxRenderedChars` under 1500 for fast prompts
- Defaults are calibrated from observed rendered usage around ~500 characters or less
- `maxActiveFilesRendered` of 8 provides good context coverage
- `maxOpenErrorsRendered` of 3 avoids overwhelming error lists
## Memory Types
### Long-Term Memory Types
| Type | Purpose | Rendered cap |
|------|---------|--------------|
| `feedback` | User preferences for workspace | 10 |
| `project` | Project-level information | 8 |
| `decision` | Important decisions | 10 |
| `reference` | Key references | 6 |
### Memory Sources
| Source | Confidence | Description |
|--------|------------|-------------|
| `explicit` | 1.0 | User explicitly said "remember this" |
| `compaction` | 0.75 | Extracted during conversation compaction |
| `manual` | varies | Added programmatically |
## Active File Scoring
Files are ranked by action type:
| Action | Weight | Description |
|--------|--------|-------------|
| `write` | 4 | File created/overwritten |
| `edit` | 3 | File modified |
| `read` | 2 | File read |
| `grep` | 1 | Grep searched in file |
Score formula: `count * action_weight * recency_decay`
## Error Categories
| Category | Recognition Pattern |
|----------|---------------------|
| `typecheck` | TS errors, TypeScript failures |
| `test` | Test failures |
| `lint` | ESLint warnings/errors |
| `build` | Build failures |
| `runtime` | Uncaught errors, Node exceptions |
| `tool` | Tool execution failures |
## Storage Paths
```
~/.local/share/opencode-working-memory/
└── workspaces/
└── {workspaceKey}/
├── workspace-memory.json # Long-term memory
└── sessions/
└── {hashedSessionID}.json # Session state (hashed)
```
### Workspace Key
```typescript
// First 16 characters of SHA-256 hash
const workspaceKey = sha256(realpath(workspaceRoot)).slice(0, 16);
```
### Session ID
```typescript
// Hashed session ID for privacy
const hashedSessionID = sha256(sessionID).slice(0, 32);
```
## Customization
To customize limits, edit the constants in `src/types.ts`:
```typescript
// Example: Increase workspace memory limit
export const LONG_TERM_LIMITS = {
maxRenderedChars: 6000, // Increased from 3600
maxEntries: 35, // Increased from 28
// ...
};
```
**Note**: After customization, rebuild the plugin:
```bash
npm run build
```
## Performance Tuning
### High-Frequency Sessions (500+ messages)
```typescript
// Reduce memory overhead
const HOT_STATE_LIMITS = {
maxRenderedChars: 800, // Reduced
maxActiveFilesRendered: 5, // Reduced
maxOpenErrorsRendered: 2, // Reduced
};
```
### Long-Running Sessions (Multi-day)
```typescript
// Preserve more context
const LONG_TERM_LIMITS = {
maxEntries: 40, // Increased
targetRenderedChars: 5000, // Increased
};
```
### Memory-Constrained Environments
```typescript
// Strict limits
const LONG_TERM_LIMITS = {
maxRenderedChars: 3000,
maxEntries: 15,
};
const HOT_STATE_LIMITS = {
maxRenderedChars: 600,
maxActiveFilesRendered: 4,
};
```
## Debugging
### Inspect Memory Files
```bash
# Workspace memory
cat ~/.local/share/opencode-working-memory/workspaces/*/workspace-memory.json | jq
# Session state
cat ~/.local/share/opencode-working-memory/workspaces/*/sessions/*.json | jq
```
### Inspect Retention Health
From a source checkout, maintainers can inspect stored vs rendered memory behavior:
```bash
bun scripts/memory-diag.ts health
```
The health output includes stored active memories, rendered candidates, type caps, global cap overflow, dormancy status, retention monitoring alerts, and strength-ranked top/weakest entries.
### Clear Workspace Memory
```bash
# Remove workspace memory (start fresh)
rm ~/.local/share/opencode-working-memory/workspaces/*/workspace-memory.json
```
### Clear Session State
```bash
# Remove all session states
rm ~/.local/share/opencode-working-memory/workspaces/*/sessions/*.json
```
## Best Practices
1. **Workspace Memory Hygiene**:
- Let OpenCode Working Memory extract memories automatically
- Use explicit "remember this" for important information
- Don't manually edit memory files unless testing
2. **Session State**:
- Let OpenCode Working Memory track active files automatically
- Errors are cleared when commands succeed
- No manual intervention needed
3. **Memory Extraction**:
- Use `Memory candidates:` during compaction
- Follow the pattern: `- [type] text`
- Quality gate rejects invalid candidates
---
**Last Updated**: April 2026
**Configuration File**: `src/types.ts`