Repository navigation
Release v0.46.0
CodeMem 0.46.0
CodeMem now works with the Pi coding agent. It also makes sharing exact Projects and managing devices easier, loads large Projects views faster, and recovers more reliably when sync or background maintenance hits a busy database.
What's new
- Pi support. Run
codemem setupto add the Pi extension. Pi sessions contribute to the same project-scoped memory store as OpenCode, Claude Code, and Codex. Relevant memories appear during Pi turns, and native memory tools work without a separate MCP adapter. Injection keeps Pi's system prompt unchanged so providers can reuse its cached prefix. - Project-first sharing. Share the Projects you choose without adding someone to an entire Team. Projects, Sharing, and Devices put the relevant actions where you need them, including pairing and device setup guidance.
- A clearer viewer. Devices are grouped by Identity, and you can rename a device from its row's actions menu. Feed cards show more of their content, Projects group related worktrees, and first-run guidance helps new installs get started.
- Faster reads. Projects and sharing views avoid repeated work on large stores. Sync status uses existing indexes instead of scanning the entire attempt history.
Reliability and diagnostics
- Sync failures have clearer explanations, and status better distinguishes an unreachable device from other problems.
- Opening an unchanged database no longer takes a write lock. Backfills stop working after completion, pick up rows that arrive during a run, and retry temporary database-busy errors.
- Semantic-index status correctly reports when embeddings are off and recognizes compatible vectors saved by older versions. Keyword search remains available when semantic search is off.
Upgrade
npm install -g codemem@0.46.0
Restart your agent host after upgrading. Run codemem setup if you want to add Pi; it installs the matching extension. Existing databases update automatically, and background maintenance may continue briefly after the upgrade.
If OpenCode reports a plugin-definition error for @codemem/opencode-plugin@latest, its local plugin cache may still contain an older version. The npm latest tag is 0.46.0; use codemem setup to select the matching pinned plugin, or update that OpenCode package explicitly.
Still to come: Pi does not save recalled memory pastes to its session file, so restarting Pi does not restore earlier injection decisions. First loads of Health and coordinator administration can still take time on large stores; further load-time work is tracked separately. Revoking a shared Space prevents new delivery but cannot erase copies a device already received.
All changes and contributors
What's Changed
Other Changes
- chore(tooling): lint maintained plugin runtime by @kunickiaj in #1705
- chore(tooling): add Biome diagnostic ratchet by @kunickiaj in #1706
- ci: enforce Biome diagnostic ratchet by @kunickiaj in #1707
- feat(tooling): surface Biome feedback in OpenCode 2 by @kunickiaj in #1708
- refactor(tooling): enforce flat OpenCode conditionals by @kunickiaj in #1709
- fix(tooling): compare ambiguous measured lint debt by @kunickiaj in #1711
- fix: correct observer token usage semantics by @kunickiaj in #1710
- refactor(core): stage ingest persistence flow by @kunickiaj in #1715
- fix(config): save mutations atomically by @kunickiaj in #1713
- fix(ui): bound viewer refresh reads by @kunickiaj in #1716
- perf(viewer): split liveness from health polling by @kunickiaj in #1717
- refactor(ui): type Health resource state by @kunickiaj in #1719
- chore: automate safe Biome fixes by @kunickiaj in #1722
- fix(core): preserve observer call outcomes by @kunickiaj in #1720
- test(ui): assert mounted viewer behavior by @kunickiaj in #1721
- refactor(core): define observer output schema once by @kunickiaj in #1723
- refactor(viewer): define pack request schemas once by @kunickiaj in #1724
- refactor(api): share recipient policy contracts by @kunickiaj in #1725
- refactor(sync): name membership transaction by @kunickiaj in #1727
- refactor(sync): share coordinator input rules by @kunickiaj in #1726
- refactor(ui): give settings state one owner by @kunickiaj in #1728
- refactor(observer): name sidecar command values by @kunickiaj in #1729
- refactor(observer): parse SSE event streams by @kunickiaj in #1730
- refactor(cli): remove command-tree import cycle by @kunickiaj in #1731
- refactor(core): remove share onboarding import cycle by @kunickiaj in #1732
- refactor(core): remove legacy project import cycle by @kunickiaj in #1733
- refactor(core): remove coordinator runtime import cycle by @kunickiaj in #1734
- refactor(core): remove database bootstrap import cycle by @kunickiaj in #1735
- refactor(core): separate pack construction stages by @kunickiaj in #1736
- refactor(core): split sync protocol phases by @kunickiaj in #1737
- feat(core): add provider-scoped pi observer config and auth by @ZeR020 in #1693
- refactor(core): split recipient policy reconciliation stages by @kunickiaj in #1738
- fix(tooling): pair unchanged ambiguous lint groups by @kunickiaj in #1740
- refactor(server): separate coordinator maintenance operations by @kunickiaj in #1739
- perf(core): combine memory stats counts by @kunickiaj in #1741
- perf(core): prepare scoring inputs once by @kunickiaj in #1743
- fix(tooling): detect repeated scope membership changes by @kunickiaj in #1742
- refactor(server): extract sync status projection by @kunickiaj in #1745
- perf(server): bound legacy sharing summary samples by @kunickiaj in #1746
- refactor(ui): use Radix for legacy upgrade dialog by @kunickiaj in #1747
- refactor(plugin): extract raw event delivery by @kunickiaj in #1748
- refactor(plugin): extract recall lifecycle by @kunickiaj in #1749
- fix(config): preserve extended ACLs on atomic saves by @kunickiaj in #1750
- fix(plugin): add raw-event fallback diagnostics by @kunickiaj in #1752
- fix(ui): restore actionable project review by @kunickiaj in #1751
- fix(server): queue raw events before SQLite ingestion by @kunickiaj in #1753
- chore(release): prepare 0.46.0-alpha.1 by @kunickiaj in #1754
- fix(core): hide observer subprocess windows by @kunickiaj in #1757
- fix: resolve raw event streams per event by @kunickiaj in #1758
- fix(ui): animate Health loading state by @kunickiaj in #1755
- fix: preserve OpenCode JSONC during setup by @kunickiaj in #1760
- fix(core): reconcile raw event batch sequences by @kunickiaj in #1759
- fix(cli): remove setup Codex test timing dependency by @kunickiaj in #1762
- fix: queue legacy hooks before SQLite by @kunickiaj in #1761
- feat(cli): add pi-hook-ingest/inject with shared spool by @ZeR020 in #1744
- fix(cli): serialize Claude boundary fallback by @kunickiaj in #1764
- fix(cli): track drained Claude boundary receipt by @kunickiaj in #1765
- fix(hooks): make Pi ingestion queue-first by @kunickiaj in #1766
- chore(release): prepare 0.46.0-alpha.2 by @kunickiaj in #1768
- feat(pi-extension): add lifecycle client without native tools by @ZeR020 in #1767
- docs: define canonical viewer workflow ownership by @kunickiaj in #1775
- feat(pi-extension): register native memory tools by @ZeR020 in #1778
- feat(ui): add sharing decisions review by @kunickiaj in #1770
- refactor(ui): extract Projects controller by @kunickiaj in #1771
- feat(ui): render Projects inventory in Preact by @kunickiaj in #1777
- feat(ui): refresh Health overview by @kunickiaj in #1772
- feat: show received project source devices by @kunickiaj in #1773
- docs: define compact feed disclosure by @kunickiaj in #1774
- feat(ui): compact Feed memory cards by @kunickiaj in #1776
- fix(ui): align device review eligibility by @kunickiaj in #1779
- feat(ui): group devices by identity by @kunickiaj in #1780
- feat(ui): refresh sharing workflow by @kunickiaj in #1781
- feat(ui): move pairing workflow to devices by @kunickiaj in #1782
- feat(ui): focus advanced on diagnostics by @kunickiaj in #1783
- fix(ui): align sharing decision actions by @kunickiaj in #1784
- feat(ui): explain setting outcomes by @kunickiaj in #1785
- feat(ui): add first-run guidance by @kunickiaj in #1786
- fix(ui): route sync pairing recovery to Devices by @kunickiaj in #1787
- fix(ui): clear stale Advanced status when diagnostics fail by @kunickiaj in #1796
- fix(ui): handle first-run storage failures and actionable capture guidance by @kunickiaj in #1790
- fix(ui): retain Devices focus and explicit Sharing navigation by @kunickiaj in #1794
- fix(ui): preserve Feed search evidence and disclosure focus by @kunickiaj in #1795
- fix: preserve metadata-only received sources and redact caseless identifiers by @kunickiaj in #1793
- fix(ui): align Health issue counts and unknown pack freshness by @kunickiaj in #1792
- fix(ui): bound Team member previews and include configured fallback devices by @kunickiaj in #1797
- fix(ui): preserve pairing controls across refresh and complete pairing guidance by @kunickiaj in #1789
- fix(viewer): distinguish coordinator setup and retain stale approvals by @kunickiaj in #1798
- fix(viewer): preview validated device pairing before acceptance by @kunickiaj in #1799
- fix(ui): qualify Settings outcomes by effective runtime and sync state by @kunickiaj in #1791
- fix(ui): show full Feed content and simplify onboarding by @kunickiaj in #1801
- fix(ui): simplify Settings and align viewer actions by @kunickiaj in #1800
- fix(ui): clarify device names and presence by @kunickiaj in #1802
- feat: add pi setup, UI, docs, and pi-extension release pin by @ZeR020 in #1788
- feat(core): add immutable source-qualified memory identity primitives by @kunickiaj in #1803
- fix(core): preserve source project in recovered memories by @kunickiaj in #1807
- feat(core): deliver authenticated retirement controls independently by @kunickiaj in #1806
- chore(plugin): validate matched OpenCode V2 2.0.12 packages by @kunickiaj in #1810
- chore(release): prepare 0.46.0-beta.1 by @kunickiaj in #1811
- fix(ui): make Feed cards pack-faithful by @kunickiaj in #1812
- feat(ui): bulk apply sharing decisions by @kunickiaj in #1813
- fix(projects): unify repository worktrees by @kunickiaj in #1816
- fix(projects): include inferred repository members by @kunickiaj in #1817
- fix(projects): align legacy scope actions by @kunickiaj in #1818
- fix(projects): align migration and search by @kunickiaj in #1819
- fix(projects): align policy repository facts by @kunickiaj in #1820
- fix(projects): harden repository identity evidence by @kunickiaj in #1821
- fix(projects): reject conflicting repository mappings by @kunickiaj in #1822
- fix(projects): canonicalize recipient policy references by @kunickiaj in #1823
- fix(viewer): render canonical project sharing by @kunickiaj in #1824
- fix(sync): wake recipient policies transactionally by @kunickiaj in #1825
- fix(viewer): wake policies after identity changes by @kunickiaj in #1826
- fix(sync): pace recipient policy maintenance by @kunickiaj in #1827
- fix(policy): repair wake schema and historical sharing lookup by @kunickiaj in #1828
- feat(core): track repository discovery evidence revisions by @kunickiaj in #1829
- fix(projects): bound repeated repository discovery scans by @kunickiaj in #1830
- chore(release): prepare 0.46.0-beta.2 by @kunickiaj in #1832
- fix(lint): isolate worktree index in commit ratchet by @kunickiaj in #1833
- fix(projects): collapse worktrees beneath project groups by @kunickiaj in #1835
- fix(sharing): show unique project names in team summaries by @kunickiaj in #1834
- fix(health): explain sync failures using peer status by @kunickiaj in #1836
- fix(sync): expose safe coordinator timeout diagnostics by @kunickiaj in #1837
- fix(sharing): recover stale Team setup links and close icon by @kunickiaj in #1838
- fix(sharing): retry failed setup reads without changing drafts by @kunickiaj in #1839
- fix(sync): bound peer address history and retain manual fallbacks by @kunickiaj in #1841
- chore(release): prepare 0.46.0-rc.1 diagnostics by @kunickiaj in #1840
- fix(ui): keep Projects sharing usable during refresh by @kunickiaj in #1844
- fix(ui): keep coordinator device rename usable during polling by @kunickiaj in #1845
- fix(ui): make feed observations scannable by @kunickiaj in #1843
- feat(devices): rename known devices from the Devices view by @kunickiaj in #1846
- test(ci): fix flaky sweeper and coordinator-admin tests by @kunickiaj in #1847
- fix(diagnostics): explain sync failure causes in plain language by @kunickiaj in #1848
- fix(core): open the store without taking a write lock when nothing changed by @kunickiaj in #1849
- fix(status): report semantic index coverage and disabled embeddings accurately by @kunickiaj in #1852
- fix(cli): stop maintenance worker polling once a backfill completes by @kunickiaj in #1850
- ci: run vitest with 3 workers on CI runners by @kunickiaj in #1854
- fix(maintenance): retry ref and summary backfills after a busy database by @kunickiaj in #1853
- feat(sync): record a failure category with each sync attempt by @kunickiaj in #1851
- fix(sync): classify each address error before storing a failure category by @kunickiaj in #1855
- chore(release): prepare 0.46.0-rc.2 by @kunickiaj in #1856
- perf(projects): read recorded repository identity once per session by @kunickiaj in #1857
- chore(release): prepare 0.46.0-rc.3 by @kunickiaj in #1858
- fix(devices): move Rename device into the row actions menu by @kunickiaj in #1859
- perf(sync): use indexed status reads and skip empty legacy review by @kunickiaj in #1860
- feat(pi-extension): inject memory packs on the context request copy by @ZeR020 in #1831
- chore(release): prepare 0.46.0-rc.4 by @kunickiaj in #1861
- chore(release): prepare 0.46.0 stable by @kunickiaj in #1863
Full Changelog: v0.45.0...v0.46.0