echo-mem 0.2.0__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. {echo_mem-0.2.0 → echo_mem-0.3.0}/PKG-INFO +56 -41
  2. {echo_mem-0.2.0 → echo_mem-0.3.0}/README.md +55 -40
  3. {echo_mem-0.2.0 → echo_mem-0.3.0}/pyproject.toml +1 -1
  4. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_mem.egg-info/PKG-INFO +56 -41
  5. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_mem.egg-info/SOURCES.txt +17 -0
  6. echo_mem-0.3.0/src/echo_memory/__init__.py +8 -0
  7. echo_mem-0.3.0/src/echo_memory/cli/calibrate.py +362 -0
  8. echo_mem-0.3.0/src/echo_memory/cli/connect.py +157 -0
  9. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/health.py +114 -1
  10. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/initdb.py +20 -1
  11. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/install.py +24 -0
  12. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/main.py +210 -1
  13. echo_mem-0.3.0/src/echo_memory/cli/merge.py +199 -0
  14. echo_mem-0.3.0/src/echo_memory/cli/quickstart.py +268 -0
  15. echo_mem-0.3.0/src/echo_memory/cli/reattribute.py +200 -0
  16. echo_mem-0.3.0/src/echo_memory/cli/reattribute_cmd.py +42 -0
  17. echo_mem-0.3.0/src/echo_memory/cli/reindex.py +72 -0
  18. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/stop_gate.py +51 -4
  19. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/trial.py +71 -13
  20. echo_mem-0.3.0/src/echo_memory/cli/unmerge.py +156 -0
  21. echo_mem-0.3.0/src/echo_memory/eval/retrieval.py +326 -0
  22. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/infra/pool.py +22 -0
  23. echo_mem-0.3.0/src/echo_memory/ingestion/activity.py +86 -0
  24. echo_mem-0.3.0/src/echo_memory/ingestion/embeddings.py +65 -0
  25. echo_mem-0.3.0/src/echo_memory/ingestion/resolution.py +412 -0
  26. echo_mem-0.3.0/src/echo_memory/ingestion/write_episode.py +526 -0
  27. echo_mem-0.3.0/src/echo_memory/migrations/versions/0012_read_event_agent.py +49 -0
  28. echo_mem-0.3.0/src/echo_memory/migrations/versions/0013_active_fact_indexes.py +60 -0
  29. echo_mem-0.3.0/src/echo_memory/migrations/versions/0014_session_activity.py +56 -0
  30. echo_mem-0.3.0/src/echo_memory/migrations/versions/0015_retracted_observations.py +48 -0
  31. echo_mem-0.3.0/src/echo_memory/migrations/versions/0016_one_node_per_name.py +75 -0
  32. echo_mem-0.3.0/src/echo_memory/migrations/versions/0017_writer_version.py +45 -0
  33. echo_mem-0.3.0/src/echo_memory/migrations/versions/0018_trial_runs_are_history.py +73 -0
  34. echo_mem-0.3.0/src/echo_memory/migrations/versions/0019_versions_expected_since.py +50 -0
  35. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/retrieval/fusion.py +4 -2
  36. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/retrieval/query_memory.py +201 -25
  37. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/server.py +137 -5
  38. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/trial/check.py +50 -17
  39. echo_mem-0.3.0/src/echo_memory/trial/observations.py +321 -0
  40. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/trial/reads.py +22 -3
  41. echo_mem-0.2.0/src/echo_memory/cli/reattribute.py +0 -74
  42. echo_mem-0.2.0/src/echo_memory/cli/reattribute_cmd.py +0 -16
  43. echo_mem-0.2.0/src/echo_memory/ingestion/embeddings.py +0 -41
  44. echo_mem-0.2.0/src/echo_memory/ingestion/resolution.py +0 -211
  45. echo_mem-0.2.0/src/echo_memory/ingestion/write_episode.py +0 -399
  46. echo_mem-0.2.0/src/echo_memory/trial/observations.py +0 -179
  47. {echo_mem-0.2.0 → echo_mem-0.3.0}/LICENSE +0 -0
  48. {echo_mem-0.2.0 → echo_mem-0.3.0}/setup.cfg +0 -0
  49. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_mem.egg-info/dependency_links.txt +0 -0
  50. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_mem.egg-info/entry_points.txt +0 -0
  51. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_mem.egg-info/requires.txt +0 -0
  52. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_mem.egg-info/top_level.txt +0 -0
  53. {echo_mem-0.2.0/src/echo_memory → echo_mem-0.3.0/src/echo_memory/audit}/__init__.py +0 -0
  54. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/audit/get_audit_log.py +0 -0
  55. {echo_mem-0.2.0/src/echo_memory/audit → echo_mem-0.3.0/src/echo_memory/cli}/__init__.py +0 -0
  56. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/adopt.py +0 -0
  57. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/analyse.py +0 -0
  58. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/benchmark.py +0 -0
  59. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/dashboard.py +0 -0
  60. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/dashboard_html.py +0 -0
  61. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/export.py +0 -0
  62. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/graph.py +0 -0
  63. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/hooks.py +0 -0
  64. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/queue.py +0 -0
  65. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/recall.py +0 -0
  66. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/reconcile.py +0 -0
  67. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/session_start.py +0 -0
  68. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/skill.py +0 -0
  69. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/status.py +0 -0
  70. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/why.py +0 -0
  71. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/client.py +0 -0
  72. {echo_mem-0.2.0/src/echo_memory/cli → echo_mem-0.3.0/src/echo_memory/eval}/__init__.py +0 -0
  73. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/graph/__init__.py +0 -0
  74. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/graph/communities.py +0 -0
  75. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/infra/__init__.py +0 -0
  76. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/infra/config.py +0 -0
  77. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/infra/db.py +0 -0
  78. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/infra/logging.py +0 -0
  79. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/infra/project.py +0 -0
  80. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/ingestion/__init__.py +0 -0
  81. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/ingestion/bootstrap.py +0 -0
  82. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/ingestion/capture.py +0 -0
  83. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/env.py +0 -0
  84. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0001_initial_schema.py +0 -0
  85. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0002_trial_observations.py +0 -0
  86. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0003_project_and_agent_provenance.py +0 -0
  87. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0004_bootstrap_state.py +0 -0
  88. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0005_recall_save_guards.py +0 -0
  89. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0006_project_analysis.py +0 -0
  90. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0007_backfill_unknown_agent.py +0 -0
  91. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0008_read_events.py +0 -0
  92. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0009_read_event_attribution.py +0 -0
  93. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0010_stop_gate_fired.py +0 -0
  94. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0011_backfill_absent_agent.py +0 -0
  95. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/retrieval/__init__.py +0 -0
  96. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/skill/SKILL.md +0 -0
  97. {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/trial/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: echo-mem
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: A long-horizon memory architecture for AI agents
5
5
  License-Expression: Apache-2.0
6
6
  Requires-Python: >=3.11
@@ -22,10 +22,40 @@ Dynamic: license-file
22
22
 
23
23
  # Echo Memory
24
24
 
25
- A long-horizon memory architecture for AI agents. Echo Memory is built to remember
26
- everything an agent has ever learned, in the best possible way, and to keep fetching and
27
- writing that memory efficiently no matter how much history accumulates, for coding
28
- tools, chatbots, DevOps agents, or any other agentic system, local or deployed.
25
+ Shared memory for AI coding agents. What Claude Code learns, Codex and Cursor can recall
26
+ — in one graph, on your own machine, with every write auditable.
27
+
28
+ Apache 2.0. No LLM call on the write path, so recording a memory costs nothing to run.
29
+
30
+ ## Install
31
+
32
+ Run it yourself — nothing leaves your machine:
33
+
34
+ ```bash
35
+ pipx install echo-mem
36
+ echo-memory quickstart
37
+ ```
38
+
39
+ That starts the database, applies the schema, and prints the `claude mcp add` command
40
+ that registers it with your tools, filled in with the port it actually used. Docker is the only prerequisite; the Postgres image is published, so
41
+ nothing is compiled.
42
+
43
+ Or use the hosted service and run no database at all:
44
+
45
+ ```bash
46
+ pipx install echo-mem
47
+ echo-memory connect <key> # a key from https://api.echo-mem.com
48
+ ```
49
+
50
+ Either way, restart your client afterwards. An MCP server holds the code and config it
51
+ started with.
52
+
53
+ Then, once per machine, so the agent knows *when* to record and recall rather than only
54
+ that the tools exist:
55
+
56
+ ```bash
57
+ echo-memory install --global
58
+ ```
29
59
 
30
60
  ## Why
31
61
 
@@ -88,46 +118,26 @@ is the target this architecture is built toward, not yet something v1a itself pr
88
118
  proves basic recall works before v1b adds causal typing and multi-hop graph retrieval, and
89
119
  before v1.1 adds the org-wide tenancy the broader vision depends on.
90
120
 
91
- ## Getting started
121
+ ## Setting it up by hand
92
122
 
93
- The core recall loop is built and running: `write_episode`, `query_memory`,
94
- `get_audit_log`, an MCP server wiring them together, and an `echo-memory` CLI (`why`,
95
- `export`). Full setup is in [`docs/DEVELOPMENT.md`](docs/DEVELOPMENT.md); short version:
123
+ `quickstart` is the short way. If you would rather see every step, or you are working on
124
+ Echo Memory itself, [`docs/DEVELOPMENT.md`](docs/DEVELOPMENT.md) has the long version:
125
+ clone, `docker compose up -d`, `pip install -e ".[dev]"`, `alembic upgrade head`, and the
126
+ `claude mcp add` line with its environment.
96
127
 
97
- ```bash
98
- git clone git@github.com:ayushcodes10/echo-mem.git && cd echo-mem
99
- docker compose up -d # Postgres + pgvector + Apache AGE
100
- python -m venv .venv && source .venv/bin/activate && pip install -e ".[dev]"
101
- alembic upgrade head
102
-
103
- claude mcp add --scope user echo-memory \
104
- -e ECHO_MEMORY_USER_ID=your-user-id \
105
- -e ECHO_MEMORY_AGENT_ID=claude-code \
106
- -e ECHO_MEMORY_DATABASE_URL="postgresql://postgres:postgres@localhost:5433/echo_memory" \
107
- -- "$(pwd)/.venv/bin/python" -m echo_memory.server
108
- ```
128
+ **Wiring a second tool? Give it its own `ECHO_MEMORY_AGENT_ID`.** Cursor should say
129
+ `cursor`, Claude Desktop `claude-desktop`. Memory is shared either way, but a fact records
130
+ which tool learned it, and two tools claiming the same id makes cross-tool recall
131
+ impossible to see afterwards. `echo-memory adopt` wires every MCP client on the machine at
132
+ once, each with its own id, and shows the diff before writing anything.
109
133
 
110
- Start a new Claude Code session and `write_episode`/`query_memory`/`record_recall_save`/
111
- `get_audit_log` are available across every project, not just this repo.
134
+ Scoped to one project instead — a single Claude project, a Cursor workspace, a repo whose
135
+ memory should not mingle with the rest? `echo-memory install [path]` writes a
136
+ project-scoped MCP config plus a skill (or, for Cursor, an always-applied rule), committed
137
+ alongside the code.
112
138
 
113
- **Wiring a second tool? Give it its own `ECHO_MEMORY_AGENT_ID`.** Cursor should say
114
- `cursor`, Claude Desktop `claude-desktop`. Memory is shared either way, but a fact
115
- records which tool learned it, and two tools claiming the same id makes cross-tool
116
- recall impossible to see afterwards. `echo-memory adopt` wires every MCP client on the
117
- machine at once, each with its own id, and shows you the diff before writing
118
- anything. `echo-memory install --for both` does the same for one project.
119
-
120
- Prefer it scoped to one project - a single Claude project, a Cursor workspace, a repo
121
- whose memory shouldn't mingle with the rest? `echo-memory install [path] --for
122
- claude|cursor|both` writes a project-scoped MCP config plus a skill (or, for Cursor, an
123
- always-applied rule) telling the agent when to record and when to recall. See
124
- [`docs/DEVELOPMENT.md`](docs/DEVELOPMENT.md) for Cursor/per-repo setup, the
125
- `echo-memory` CLI, and running tests; see
126
- [`docs/INTEGRATIONS.md`](docs/INTEGRATIONS.md) for using Echo Memory from an agent
127
- that doesn't speak MCP (a chatbot, a DevOps agent, a booking agent, or any custom
128
- tool-calling loop); and see
129
- [`docs/designs/echo-memory-design.md`](docs/designs/echo-memory-design.md) for the
130
- current build plan and progress.
139
+ See [`docs/INTEGRATIONS.md`](docs/INTEGRATIONS.md) for using Echo Memory from an agent
140
+ that does not speak MCP — a chatbot, a DevOps agent, or any custom tool-calling loop.
131
141
 
132
142
  ## The graph
133
143
 
@@ -236,3 +246,8 @@ the [Contributor License Agreement](CLA.md) — once, in the PR thread.
236
246
  ## License
237
247
 
238
248
  Apache License 2.0. See [`LICENSE`](LICENSE).
249
+
250
+ <!-- The MCP registry proves you own a PyPI package by finding this line in the
251
+ package's own description. It has to survive into the built distribution,
252
+ which is why it lives in the README rather than in a workflow. -->
253
+ mcp-name: io.github.ayushcodes10/echo-mem
@@ -1,9 +1,39 @@
1
1
  # Echo Memory
2
2
 
3
- A long-horizon memory architecture for AI agents. Echo Memory is built to remember
4
- everything an agent has ever learned, in the best possible way, and to keep fetching and
5
- writing that memory efficiently no matter how much history accumulates, for coding
6
- tools, chatbots, DevOps agents, or any other agentic system, local or deployed.
3
+ Shared memory for AI coding agents. What Claude Code learns, Codex and Cursor can recall
4
+ — in one graph, on your own machine, with every write auditable.
5
+
6
+ Apache 2.0. No LLM call on the write path, so recording a memory costs nothing to run.
7
+
8
+ ## Install
9
+
10
+ Run it yourself — nothing leaves your machine:
11
+
12
+ ```bash
13
+ pipx install echo-mem
14
+ echo-memory quickstart
15
+ ```
16
+
17
+ That starts the database, applies the schema, and prints the `claude mcp add` command
18
+ that registers it with your tools, filled in with the port it actually used. Docker is the only prerequisite; the Postgres image is published, so
19
+ nothing is compiled.
20
+
21
+ Or use the hosted service and run no database at all:
22
+
23
+ ```bash
24
+ pipx install echo-mem
25
+ echo-memory connect <key> # a key from https://api.echo-mem.com
26
+ ```
27
+
28
+ Either way, restart your client afterwards. An MCP server holds the code and config it
29
+ started with.
30
+
31
+ Then, once per machine, so the agent knows *when* to record and recall rather than only
32
+ that the tools exist:
33
+
34
+ ```bash
35
+ echo-memory install --global
36
+ ```
7
37
 
8
38
  ## Why
9
39
 
@@ -66,46 +96,26 @@ is the target this architecture is built toward, not yet something v1a itself pr
66
96
  proves basic recall works before v1b adds causal typing and multi-hop graph retrieval, and
67
97
  before v1.1 adds the org-wide tenancy the broader vision depends on.
68
98
 
69
- ## Getting started
99
+ ## Setting it up by hand
70
100
 
71
- The core recall loop is built and running: `write_episode`, `query_memory`,
72
- `get_audit_log`, an MCP server wiring them together, and an `echo-memory` CLI (`why`,
73
- `export`). Full setup is in [`docs/DEVELOPMENT.md`](docs/DEVELOPMENT.md); short version:
101
+ `quickstart` is the short way. If you would rather see every step, or you are working on
102
+ Echo Memory itself, [`docs/DEVELOPMENT.md`](docs/DEVELOPMENT.md) has the long version:
103
+ clone, `docker compose up -d`, `pip install -e ".[dev]"`, `alembic upgrade head`, and the
104
+ `claude mcp add` line with its environment.
74
105
 
75
- ```bash
76
- git clone git@github.com:ayushcodes10/echo-mem.git && cd echo-mem
77
- docker compose up -d # Postgres + pgvector + Apache AGE
78
- python -m venv .venv && source .venv/bin/activate && pip install -e ".[dev]"
79
- alembic upgrade head
80
-
81
- claude mcp add --scope user echo-memory \
82
- -e ECHO_MEMORY_USER_ID=your-user-id \
83
- -e ECHO_MEMORY_AGENT_ID=claude-code \
84
- -e ECHO_MEMORY_DATABASE_URL="postgresql://postgres:postgres@localhost:5433/echo_memory" \
85
- -- "$(pwd)/.venv/bin/python" -m echo_memory.server
86
- ```
106
+ **Wiring a second tool? Give it its own `ECHO_MEMORY_AGENT_ID`.** Cursor should say
107
+ `cursor`, Claude Desktop `claude-desktop`. Memory is shared either way, but a fact records
108
+ which tool learned it, and two tools claiming the same id makes cross-tool recall
109
+ impossible to see afterwards. `echo-memory adopt` wires every MCP client on the machine at
110
+ once, each with its own id, and shows the diff before writing anything.
87
111
 
88
- Start a new Claude Code session and `write_episode`/`query_memory`/`record_recall_save`/
89
- `get_audit_log` are available across every project, not just this repo.
112
+ Scoped to one project instead — a single Claude project, a Cursor workspace, a repo whose
113
+ memory should not mingle with the rest? `echo-memory install [path]` writes a
114
+ project-scoped MCP config plus a skill (or, for Cursor, an always-applied rule), committed
115
+ alongside the code.
90
116
 
91
- **Wiring a second tool? Give it its own `ECHO_MEMORY_AGENT_ID`.** Cursor should say
92
- `cursor`, Claude Desktop `claude-desktop`. Memory is shared either way, but a fact
93
- records which tool learned it, and two tools claiming the same id makes cross-tool
94
- recall impossible to see afterwards. `echo-memory adopt` wires every MCP client on the
95
- machine at once, each with its own id, and shows you the diff before writing
96
- anything. `echo-memory install --for both` does the same for one project.
97
-
98
- Prefer it scoped to one project - a single Claude project, a Cursor workspace, a repo
99
- whose memory shouldn't mingle with the rest? `echo-memory install [path] --for
100
- claude|cursor|both` writes a project-scoped MCP config plus a skill (or, for Cursor, an
101
- always-applied rule) telling the agent when to record and when to recall. See
102
- [`docs/DEVELOPMENT.md`](docs/DEVELOPMENT.md) for Cursor/per-repo setup, the
103
- `echo-memory` CLI, and running tests; see
104
- [`docs/INTEGRATIONS.md`](docs/INTEGRATIONS.md) for using Echo Memory from an agent
105
- that doesn't speak MCP (a chatbot, a DevOps agent, a booking agent, or any custom
106
- tool-calling loop); and see
107
- [`docs/designs/echo-memory-design.md`](docs/designs/echo-memory-design.md) for the
108
- current build plan and progress.
117
+ See [`docs/INTEGRATIONS.md`](docs/INTEGRATIONS.md) for using Echo Memory from an agent
118
+ that does not speak MCP — a chatbot, a DevOps agent, or any custom tool-calling loop.
109
119
 
110
120
  ## The graph
111
121
 
@@ -214,3 +224,8 @@ the [Contributor License Agreement](CLA.md) — once, in the PR thread.
214
224
  ## License
215
225
 
216
226
  Apache License 2.0. See [`LICENSE`](LICENSE).
227
+
228
+ <!-- The MCP registry proves you own a PyPI package by finding this line in the
229
+ package's own description. It has to survive into the built distribution,
230
+ which is why it lives in the README rather than in a workflow. -->
231
+ mcp-name: io.github.ayushcodes10/echo-mem
@@ -6,7 +6,7 @@
6
6
  # (`-m echo_memory.server`) and every existing install reference it, and
7
7
  # renaming the module would break live configuration to fix a cosmetic mismatch.
8
8
  name = "echo-mem"
9
- version = "0.2.0"
9
+ version = "0.3.0"
10
10
  description = "A long-horizon memory architecture for AI agents"
11
11
  readme = "README.md"
12
12
  license = "Apache-2.0"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: echo-mem
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: A long-horizon memory architecture for AI agents
5
5
  License-Expression: Apache-2.0
6
6
  Requires-Python: >=3.11
@@ -22,10 +22,40 @@ Dynamic: license-file
22
22
 
23
23
  # Echo Memory
24
24
 
25
- A long-horizon memory architecture for AI agents. Echo Memory is built to remember
26
- everything an agent has ever learned, in the best possible way, and to keep fetching and
27
- writing that memory efficiently no matter how much history accumulates, for coding
28
- tools, chatbots, DevOps agents, or any other agentic system, local or deployed.
25
+ Shared memory for AI coding agents. What Claude Code learns, Codex and Cursor can recall
26
+ — in one graph, on your own machine, with every write auditable.
27
+
28
+ Apache 2.0. No LLM call on the write path, so recording a memory costs nothing to run.
29
+
30
+ ## Install
31
+
32
+ Run it yourself — nothing leaves your machine:
33
+
34
+ ```bash
35
+ pipx install echo-mem
36
+ echo-memory quickstart
37
+ ```
38
+
39
+ That starts the database, applies the schema, and prints the `claude mcp add` command
40
+ that registers it with your tools, filled in with the port it actually used. Docker is the only prerequisite; the Postgres image is published, so
41
+ nothing is compiled.
42
+
43
+ Or use the hosted service and run no database at all:
44
+
45
+ ```bash
46
+ pipx install echo-mem
47
+ echo-memory connect <key> # a key from https://api.echo-mem.com
48
+ ```
49
+
50
+ Either way, restart your client afterwards. An MCP server holds the code and config it
51
+ started with.
52
+
53
+ Then, once per machine, so the agent knows *when* to record and recall rather than only
54
+ that the tools exist:
55
+
56
+ ```bash
57
+ echo-memory install --global
58
+ ```
29
59
 
30
60
  ## Why
31
61
 
@@ -88,46 +118,26 @@ is the target this architecture is built toward, not yet something v1a itself pr
88
118
  proves basic recall works before v1b adds causal typing and multi-hop graph retrieval, and
89
119
  before v1.1 adds the org-wide tenancy the broader vision depends on.
90
120
 
91
- ## Getting started
121
+ ## Setting it up by hand
92
122
 
93
- The core recall loop is built and running: `write_episode`, `query_memory`,
94
- `get_audit_log`, an MCP server wiring them together, and an `echo-memory` CLI (`why`,
95
- `export`). Full setup is in [`docs/DEVELOPMENT.md`](docs/DEVELOPMENT.md); short version:
123
+ `quickstart` is the short way. If you would rather see every step, or you are working on
124
+ Echo Memory itself, [`docs/DEVELOPMENT.md`](docs/DEVELOPMENT.md) has the long version:
125
+ clone, `docker compose up -d`, `pip install -e ".[dev]"`, `alembic upgrade head`, and the
126
+ `claude mcp add` line with its environment.
96
127
 
97
- ```bash
98
- git clone git@github.com:ayushcodes10/echo-mem.git && cd echo-mem
99
- docker compose up -d # Postgres + pgvector + Apache AGE
100
- python -m venv .venv && source .venv/bin/activate && pip install -e ".[dev]"
101
- alembic upgrade head
102
-
103
- claude mcp add --scope user echo-memory \
104
- -e ECHO_MEMORY_USER_ID=your-user-id \
105
- -e ECHO_MEMORY_AGENT_ID=claude-code \
106
- -e ECHO_MEMORY_DATABASE_URL="postgresql://postgres:postgres@localhost:5433/echo_memory" \
107
- -- "$(pwd)/.venv/bin/python" -m echo_memory.server
108
- ```
128
+ **Wiring a second tool? Give it its own `ECHO_MEMORY_AGENT_ID`.** Cursor should say
129
+ `cursor`, Claude Desktop `claude-desktop`. Memory is shared either way, but a fact records
130
+ which tool learned it, and two tools claiming the same id makes cross-tool recall
131
+ impossible to see afterwards. `echo-memory adopt` wires every MCP client on the machine at
132
+ once, each with its own id, and shows the diff before writing anything.
109
133
 
110
- Start a new Claude Code session and `write_episode`/`query_memory`/`record_recall_save`/
111
- `get_audit_log` are available across every project, not just this repo.
134
+ Scoped to one project instead — a single Claude project, a Cursor workspace, a repo whose
135
+ memory should not mingle with the rest? `echo-memory install [path]` writes a
136
+ project-scoped MCP config plus a skill (or, for Cursor, an always-applied rule), committed
137
+ alongside the code.
112
138
 
113
- **Wiring a second tool? Give it its own `ECHO_MEMORY_AGENT_ID`.** Cursor should say
114
- `cursor`, Claude Desktop `claude-desktop`. Memory is shared either way, but a fact
115
- records which tool learned it, and two tools claiming the same id makes cross-tool
116
- recall impossible to see afterwards. `echo-memory adopt` wires every MCP client on the
117
- machine at once, each with its own id, and shows you the diff before writing
118
- anything. `echo-memory install --for both` does the same for one project.
119
-
120
- Prefer it scoped to one project - a single Claude project, a Cursor workspace, a repo
121
- whose memory shouldn't mingle with the rest? `echo-memory install [path] --for
122
- claude|cursor|both` writes a project-scoped MCP config plus a skill (or, for Cursor, an
123
- always-applied rule) telling the agent when to record and when to recall. See
124
- [`docs/DEVELOPMENT.md`](docs/DEVELOPMENT.md) for Cursor/per-repo setup, the
125
- `echo-memory` CLI, and running tests; see
126
- [`docs/INTEGRATIONS.md`](docs/INTEGRATIONS.md) for using Echo Memory from an agent
127
- that doesn't speak MCP (a chatbot, a DevOps agent, a booking agent, or any custom
128
- tool-calling loop); and see
129
- [`docs/designs/echo-memory-design.md`](docs/designs/echo-memory-design.md) for the
130
- current build plan and progress.
139
+ See [`docs/INTEGRATIONS.md`](docs/INTEGRATIONS.md) for using Echo Memory from an agent
140
+ that does not speak MCP — a chatbot, a DevOps agent, or any custom tool-calling loop.
131
141
 
132
142
  ## The graph
133
143
 
@@ -236,3 +246,8 @@ the [Contributor License Agreement](CLA.md) — once, in the PR thread.
236
246
  ## License
237
247
 
238
248
  Apache License 2.0. See [`LICENSE`](LICENSE).
249
+
250
+ <!-- The MCP registry proves you own a PyPI package by finding this line in the
251
+ package's own description. It has to survive into the built distribution,
252
+ which is why it lives in the README rather than in a workflow. -->
253
+ mcp-name: io.github.ayushcodes10/echo-mem
@@ -16,6 +16,8 @@ src/echo_memory/cli/__init__.py
16
16
  src/echo_memory/cli/adopt.py
17
17
  src/echo_memory/cli/analyse.py
18
18
  src/echo_memory/cli/benchmark.py
19
+ src/echo_memory/cli/calibrate.py
20
+ src/echo_memory/cli/connect.py
19
21
  src/echo_memory/cli/dashboard.py
20
22
  src/echo_memory/cli/dashboard_html.py
21
23
  src/echo_memory/cli/export.py
@@ -25,17 +27,23 @@ src/echo_memory/cli/hooks.py
25
27
  src/echo_memory/cli/initdb.py
26
28
  src/echo_memory/cli/install.py
27
29
  src/echo_memory/cli/main.py
30
+ src/echo_memory/cli/merge.py
28
31
  src/echo_memory/cli/queue.py
32
+ src/echo_memory/cli/quickstart.py
29
33
  src/echo_memory/cli/reattribute.py
30
34
  src/echo_memory/cli/reattribute_cmd.py
31
35
  src/echo_memory/cli/recall.py
32
36
  src/echo_memory/cli/reconcile.py
37
+ src/echo_memory/cli/reindex.py
33
38
  src/echo_memory/cli/session_start.py
34
39
  src/echo_memory/cli/skill.py
35
40
  src/echo_memory/cli/status.py
36
41
  src/echo_memory/cli/stop_gate.py
37
42
  src/echo_memory/cli/trial.py
43
+ src/echo_memory/cli/unmerge.py
38
44
  src/echo_memory/cli/why.py
45
+ src/echo_memory/eval/__init__.py
46
+ src/echo_memory/eval/retrieval.py
39
47
  src/echo_memory/graph/__init__.py
40
48
  src/echo_memory/graph/communities.py
41
49
  src/echo_memory/infra/__init__.py
@@ -45,6 +53,7 @@ src/echo_memory/infra/logging.py
45
53
  src/echo_memory/infra/pool.py
46
54
  src/echo_memory/infra/project.py
47
55
  src/echo_memory/ingestion/__init__.py
56
+ src/echo_memory/ingestion/activity.py
48
57
  src/echo_memory/ingestion/bootstrap.py
49
58
  src/echo_memory/ingestion/capture.py
50
59
  src/echo_memory/ingestion/embeddings.py
@@ -62,6 +71,14 @@ src/echo_memory/migrations/versions/0008_read_events.py
62
71
  src/echo_memory/migrations/versions/0009_read_event_attribution.py
63
72
  src/echo_memory/migrations/versions/0010_stop_gate_fired.py
64
73
  src/echo_memory/migrations/versions/0011_backfill_absent_agent.py
74
+ src/echo_memory/migrations/versions/0012_read_event_agent.py
75
+ src/echo_memory/migrations/versions/0013_active_fact_indexes.py
76
+ src/echo_memory/migrations/versions/0014_session_activity.py
77
+ src/echo_memory/migrations/versions/0015_retracted_observations.py
78
+ src/echo_memory/migrations/versions/0016_one_node_per_name.py
79
+ src/echo_memory/migrations/versions/0017_writer_version.py
80
+ src/echo_memory/migrations/versions/0018_trial_runs_are_history.py
81
+ src/echo_memory/migrations/versions/0019_versions_expected_since.py
65
82
  src/echo_memory/retrieval/__init__.py
66
83
  src/echo_memory/retrieval/fusion.py
67
84
  src/echo_memory/retrieval/query_memory.py
@@ -0,0 +1,8 @@
1
+
2
+ from importlib.metadata import PackageNotFoundError
3
+ from importlib.metadata import version as _version
4
+
5
+ try:
6
+ __version__ = _version("echo-mem")
7
+ except PackageNotFoundError: # a source checkout with nothing installed
8
+ __version__ = "0+unknown"