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.
- {echo_mem-0.2.0 → echo_mem-0.3.0}/PKG-INFO +56 -41
- {echo_mem-0.2.0 → echo_mem-0.3.0}/README.md +55 -40
- {echo_mem-0.2.0 → echo_mem-0.3.0}/pyproject.toml +1 -1
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_mem.egg-info/PKG-INFO +56 -41
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_mem.egg-info/SOURCES.txt +17 -0
- echo_mem-0.3.0/src/echo_memory/__init__.py +8 -0
- echo_mem-0.3.0/src/echo_memory/cli/calibrate.py +362 -0
- echo_mem-0.3.0/src/echo_memory/cli/connect.py +157 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/health.py +114 -1
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/initdb.py +20 -1
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/install.py +24 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/main.py +210 -1
- echo_mem-0.3.0/src/echo_memory/cli/merge.py +199 -0
- echo_mem-0.3.0/src/echo_memory/cli/quickstart.py +268 -0
- echo_mem-0.3.0/src/echo_memory/cli/reattribute.py +200 -0
- echo_mem-0.3.0/src/echo_memory/cli/reattribute_cmd.py +42 -0
- echo_mem-0.3.0/src/echo_memory/cli/reindex.py +72 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/stop_gate.py +51 -4
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/trial.py +71 -13
- echo_mem-0.3.0/src/echo_memory/cli/unmerge.py +156 -0
- echo_mem-0.3.0/src/echo_memory/eval/retrieval.py +326 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/infra/pool.py +22 -0
- echo_mem-0.3.0/src/echo_memory/ingestion/activity.py +86 -0
- echo_mem-0.3.0/src/echo_memory/ingestion/embeddings.py +65 -0
- echo_mem-0.3.0/src/echo_memory/ingestion/resolution.py +412 -0
- echo_mem-0.3.0/src/echo_memory/ingestion/write_episode.py +526 -0
- echo_mem-0.3.0/src/echo_memory/migrations/versions/0012_read_event_agent.py +49 -0
- echo_mem-0.3.0/src/echo_memory/migrations/versions/0013_active_fact_indexes.py +60 -0
- echo_mem-0.3.0/src/echo_memory/migrations/versions/0014_session_activity.py +56 -0
- echo_mem-0.3.0/src/echo_memory/migrations/versions/0015_retracted_observations.py +48 -0
- echo_mem-0.3.0/src/echo_memory/migrations/versions/0016_one_node_per_name.py +75 -0
- echo_mem-0.3.0/src/echo_memory/migrations/versions/0017_writer_version.py +45 -0
- echo_mem-0.3.0/src/echo_memory/migrations/versions/0018_trial_runs_are_history.py +73 -0
- echo_mem-0.3.0/src/echo_memory/migrations/versions/0019_versions_expected_since.py +50 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/retrieval/fusion.py +4 -2
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/retrieval/query_memory.py +201 -25
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/server.py +137 -5
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/trial/check.py +50 -17
- echo_mem-0.3.0/src/echo_memory/trial/observations.py +321 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/trial/reads.py +22 -3
- echo_mem-0.2.0/src/echo_memory/cli/reattribute.py +0 -74
- echo_mem-0.2.0/src/echo_memory/cli/reattribute_cmd.py +0 -16
- echo_mem-0.2.0/src/echo_memory/ingestion/embeddings.py +0 -41
- echo_mem-0.2.0/src/echo_memory/ingestion/resolution.py +0 -211
- echo_mem-0.2.0/src/echo_memory/ingestion/write_episode.py +0 -399
- echo_mem-0.2.0/src/echo_memory/trial/observations.py +0 -179
- {echo_mem-0.2.0 → echo_mem-0.3.0}/LICENSE +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/setup.cfg +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_mem.egg-info/dependency_links.txt +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_mem.egg-info/entry_points.txt +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_mem.egg-info/requires.txt +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_mem.egg-info/top_level.txt +0 -0
- {echo_mem-0.2.0/src/echo_memory → echo_mem-0.3.0/src/echo_memory/audit}/__init__.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/audit/get_audit_log.py +0 -0
- {echo_mem-0.2.0/src/echo_memory/audit → echo_mem-0.3.0/src/echo_memory/cli}/__init__.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/adopt.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/analyse.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/benchmark.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/dashboard.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/dashboard_html.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/export.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/graph.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/hooks.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/queue.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/recall.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/reconcile.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/session_start.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/skill.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/status.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/cli/why.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/client.py +0 -0
- {echo_mem-0.2.0/src/echo_memory/cli → echo_mem-0.3.0/src/echo_memory/eval}/__init__.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/graph/__init__.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/graph/communities.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/infra/__init__.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/infra/config.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/infra/db.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/infra/logging.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/infra/project.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/ingestion/__init__.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/ingestion/bootstrap.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/ingestion/capture.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/env.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0001_initial_schema.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0002_trial_observations.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0003_project_and_agent_provenance.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0004_bootstrap_state.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0005_recall_save_guards.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0006_project_analysis.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0007_backfill_unknown_agent.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0008_read_events.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0009_read_event_attribution.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0010_stop_gate_fired.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/migrations/versions/0011_backfill_absent_agent.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/retrieval/__init__.py +0 -0
- {echo_mem-0.2.0 → echo_mem-0.3.0}/src/echo_memory/skill/SKILL.md +0 -0
- {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.
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
##
|
|
121
|
+
## Setting it up by hand
|
|
92
122
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
`
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
111
|
-
|
|
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
|
-
|
|
114
|
-
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
##
|
|
99
|
+
## Setting it up by hand
|
|
70
100
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
`
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
89
|
-
|
|
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
|
-
|
|
92
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
##
|
|
121
|
+
## Setting it up by hand
|
|
92
122
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
`
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
111
|
-
|
|
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
|
-
|
|
114
|
-
|
|
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
|