Skip to content

[Feature]: Expose compaction/compression hooks for cross-plugin compatibility (e.g., Engram memory persistence) #577

Description

@Milor123

Problem Summary

DCP performs context compression independently of OpenCode's native compaction system. While this is generally a good thing, it breaks the workflow for users who rely on other plugins that hook into experimental.session.compacting — specifically, memory/persistence plugins like Engram that need to save a checkpoint when the context is compressed.

Currently, DCP:

  • Does not fire OpenCode's experimental.session.compacting hook
  • Does not expose any event/hook that other plugins can listen to
  • Injects system messages about pruning, but these are not a reliable API for other plugins

Impact

When DCP compresses the conversation, memory plugins have no reliable way to know that a compression occurred. This means:

  • Session summaries are not persisted to long-term memory
  • The model loses track of what was accomplished before compression
  • After compression, the model may hallucinate old tasks or forget the current active task

Reproduction Steps

  1. Install DCP and a memory plugin (e.g., Engram) that uses experimental.session.compacting to persist session checkpoints.
  2. Have a long conversation that triggers DCP compression.
  3. Observe that the memory plugin never fires — no checkpoint is saved.
  4. After compression, the model loses context of prior work.

Expected Behavior

DCP should provide a mechanism for other plugins to be notified when compression occurs, so they can persist state or inject recovery context.

Possible Solutions

Option A: Fire OpenCode's experimental.session.compacting hook

When DCP compresses, trigger the same hook that OpenCode's native compaction uses. This would be the most compatible approach.

Option B: Expose a DCP-specific event/hook

Add a new hook like experimental.dcp.compressing or similar that plugins can register. Pass metadata like:

  • beforeTokens, afterTokens
  • summaryText
  • compressedRange

Option C: Standardized system message format

If hooks are not possible, document a stable system message format that DCP injects when compressing, so other plugins can parse it reliably.

Additional Context

Protected tools mismatch

The Engram tools are named mem_save, mem_search, mem_update, mem_session_summary, etc. .

Environment

  • OpenCode version: (1.17.9)
  • DCP version: 2.x
  • Model context: 256K tokens
  • Memory plugin: Engram (custom plugin using experimental.session.compacting)

Would love to hear if this is on the roadmap or if there's a recommended workaround. Happy to test any PR or beta version.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions