mirror of
https://github.com/sdwolf4103/opencode-working-memory.git
synced 2026-06-02 06:19:36 +02:00
9.2 KiB
9.2 KiB
Release Notes
1.2.2 (2026-04-27)
Safer Multilingual Memory Capture
This release strengthens explicit memory handling across languages while keeping sensitive credentials out of stored workspace memory.
Key Features
- Always-on credential redaction: Credentials are redacted both when memory is loaded and when it is saved
- Multilingual memory triggers: Added Japanese and Korean explicit-memory phrases, plus expanded Chinese coverage
- Expanded snapshot filtering: Rejects Wave/Sprint/Milestone/Task progress snapshots that should not become durable memory
- Higher memory quality bar: Extraction now focuses on durable facts that will change future behavior
Fixed
- Credential leakage risk: Password/PIN-style values are now redacted with delimiter-preserving patterns, including multilingual labels such as
パスワード,비밀번호,contraseña,mot de passe, andPasswort. - Missing non-English explicit memory requests: Japanese (
覚えて,メモして), Korean (기억해,메모해줘), and additional Chinese triggers are now recognized. - Progress snapshots polluting memory: Wave/Sprint/Milestone/Task status updates are filtered from long-term memory unless they contain durable facts.
Migration
- Runs one-time cleanup for legacy snapshot entries:
2026-04-26-p0-cleanup
1.2.1 (2026-04-26)
Compaction Memory Quality — Four-Layer Defense
This release addresses systemic quality issues in workspace memory: duplicates, stale entries, and silently lost memory candidates. A four-layer defense is now in place:
Prompt → Durable-content guidance keeps LLM on factual memories
Parser → Accepts bracketless format, filters session snapshots
Storage → Entity-key dedup + topic supersession + source priority
Staleness → Age-based pruning of obsolete compaction/manual entries
Key Features
- Self-cleaning memory: Entity-key deduplication, topic supersession, and age-based staleness pruning automatically maintain memory quality
- Robust parser: Accepts both bracketless (
- type text) and bracketed (- [type] text) formats — no more silently lost memories - Durable-content prompt: Compaction template now guides LLM toward factual, long-lived memories while explicitly discouraging session ephemera
- Smart snapshot filtering: Automatically rejects project-type snapshots (file counts, test counts, Phase progress) that don't belong in long-term memory
Fixed
- Bracketless format bug: Parser regex only matched
- [type]pattern; real LLM output often uses- type(no brackets). Both formats now accepted. (P0a) - Purple/italic text in OpenCode UI: Replaced XML/HTML comment templates with clean Markdown headings. Further hardened with negative instructions to forbid YAML frontmatter. (P0b β)
- Session snapshots polluting memory: Project entries like "37 個文件", "26 tests pass", "Phase 2 completed" now rejected by parser filter. (P0c)
- Duplicate entries: Entities deduped by key (e.g.,
opencode-agenthub plugin system). Topic conflicts resolved via supersession: newer shorter facts beat older verbose ones for decisions/feedback. (P0d) - Stale entries never cleaned: Compaction/manual entries with
staleAfterDaysnow auto-pruned after 30-day grace period. - Short reference entries rejected: Admin PIN (
456123) and config values (Scrypt n=32768) now allowed through config value allowlist despite being under 20 chars.
Changed
chooseBetterMemory: Now accepts"entity"mode (length preferred, for project/reference) and"supersession"mode (freshness preferred, for decision/feedback).- Source priority in sort: Manual/source priority now included as secondary sort tie-breaker after entry priority.
Technical Details
- Parser formats: 4 accepted (plain text label primary, plus Markdown section, legacy section, legacy XML)
- Chinese counter words: Regex matches
個/个between numbers and nouns (e.g.,37 個文件) - Entity keys cautious: Only known product keys extracted (
opencode-agenthub); generic config references fall back to canonical text dedup
Tests
- 70/70 tests pass (24 workspace-memory, 34 extractors, 12 plugin)
1.2.0 (2026-04-26)
Memory V2 Architecture
This release introduces a complete architectural redesign from the previous four-tier memory system to a streamlined three-layer architecture:
┌──────────────────────────────────────────────────────────────────┐
│ LAYER 1: WORKSPACE MEMORY │
│ Persists across sessions in same workspace (survives restart) │
│ Extracted during compaction - NO EXTRA API CALL │
└──────────────────────────────────────────────────────────────────┘
↑
┌──────────────────────────────────────────────────────────────────┐
│ LAYER 2: HOT SESSION STATE │
│ Per-session, auto-tracked, resets on new session │
│ Tracks: Active files, Open errors, Recent decisions │
└──────────────────────────────────────────────────────────────────┘
↑
┌──────────────────────────────────────────────────────────────────┐
│ LAYER 3: NATIVE OPENCODE STATE │
│ Uses OpenCode's built-in todos - No plugin storage needed │
└──────────────────────────────────────────────────────────────────┘
Key Features
- Cross-session memory: Workspace memory persists between sessions in the same workspace
- No extra API calls: Memory extraction piggybacks on OpenCode's existing compaction summary
- Zero configuration: Works out of the box with sensible defaults
- Zero tools: No manual memory management needed - fully automatic
Added
-
Workspace Memory: Long-term memory that survives restarts and compactions
- Types:
feedback,project,decision,reference - Sources:
explicit(user),compaction,manual - Limits: 5200 chars / 28 entries
- Types:
-
Hot Session State: Automatic tracking for current session
- Active files with action-based ranking
- Open errors with fingerprinting
- Recent decisions for compaction promotion
-
Quality Gates:
- Canonical deduplication of workspace memories
- Negative memory request filtering ("don't remember")
- Compaction quality gate (rejects git hashes, stack traces, path-heavy facts)
Fixed
- False positive error tracking:
exitCode === undefinedno longer creates spurious errors from commands likegit logorcat - XML truncation: Workspace memory rendering never truncates closing
</workspace_memory>tag - Negative memory filtering: Correctly interprets "don't remember this" and "不要記住"
- "always" trigger removed: No longer treats "always" as a memory trigger keyword
Changed
- Storage location:
~/.local/share/opencode-working-memory/workspaces/{workspaceKey}/ - No manual tools: Removed
core_memory_update,core_memory_read- memory is fully automatic - Hook-based extraction: Memory is extracted during
experimental.session.compactinghook
Breaking Changes
- Previous four-tier architecture is replaced with three-layer architecture
- Core Memory blocks (goal/progress/context) removed in favor of typed entries
- Working Memory slots and pool replaced with Hot Session State
- Pressure monitoring and smart pruning removed (not needed with new architecture)
Migration
- Old memory files (
.opencode/memory-core/,.opencode/memory-working/) are not migrated - New storage location is used (
~/.local/share/opencode-working-memory/) - No action required - plugin starts fresh with new architecture
Technical Details
- Plugin entry:
index.tsexports{ id: "working-memory", server: MemoryV2Plugin } - Hooks implemented:
experimental.chat.system.transform- Inject workspace memory and hot session statetool.execute.after- Track active files and open errorsexperimental.session.compacting- Extract workspace memory candidatesevent- Handle session lifecycle events
Files in Package
index.ts
src/extractors.ts
src/opencode.ts
src/paths.ts
src/plugin.ts
src/session-state.ts
src/storage.ts
src/types.ts
src/workspace-memory.ts
README.md
LICENSE
1.1.2 (Previous Version)
- Four-tier memory architecture
- Core Memory blocks (goal/progress/context)
- Working Memory with slots and pool
- Pressure monitoring with interventions
- Smart pruning of tool outputs