sqlite-graph-memory 0.3.2__py3-none-any.whl → 0.3.3__py3-none-any.whl
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.
- sqlite_graph_memory/__init__.py +1 -1
- sqlite_graph_memory/brain_ask.py +3 -0
- sqlite_graph_memory/index_notes.py +6 -6
- sqlite_graph_memory/mcp_server.py +0 -1
- {sqlite_graph_memory-0.3.2.dist-info → sqlite_graph_memory-0.3.3.dist-info}/METADATA +13 -3
- sqlite_graph_memory-0.3.3.dist-info/RECORD +14 -0
- sqlite_graph_memory-0.3.2.dist-info/RECORD +0 -14
- {sqlite_graph_memory-0.3.2.dist-info → sqlite_graph_memory-0.3.3.dist-info}/WHEEL +0 -0
- {sqlite_graph_memory-0.3.2.dist-info → sqlite_graph_memory-0.3.3.dist-info}/entry_points.txt +0 -0
- {sqlite_graph_memory-0.3.2.dist-info → sqlite_graph_memory-0.3.3.dist-info}/licenses/LICENSE +0 -0
sqlite_graph_memory/__init__.py
CHANGED
sqlite_graph_memory/brain_ask.py
CHANGED
|
@@ -31,6 +31,7 @@ for _s in (sys.stdout, sys.stderr):
|
|
|
31
31
|
try: _s.reconfigure(encoding='utf-8')
|
|
32
32
|
except Exception: pass
|
|
33
33
|
|
|
34
|
+
FEEDBACK_URL = 'https://github.com/tonydzi/sqlite-graph-memory/discussions/categories/ideas'
|
|
34
35
|
INDEX_DIR = Path(os.getenv('BRAIN_INDEX_DIR', 'index'))
|
|
35
36
|
AB_DB = Path(os.getenv('TURNSTATE_DB', 'turnstate.db'))
|
|
36
37
|
EMB = INDEX_DIR / '_brain_e5.npy'
|
|
@@ -299,6 +300,8 @@ def main():
|
|
|
299
300
|
query = ' '.join(a for a in args if a not in flags)
|
|
300
301
|
if not query or not EMB.exists():
|
|
301
302
|
sys.stderr.write('need an embedding index (%s) and a query — run index_notes.py first\n' % EMB)
|
|
303
|
+
if query and not EMB.exists():
|
|
304
|
+
print('Stuck? Tell us what you were trying to do: %s' % FEEDBACK_URL, file=sys.stderr)
|
|
302
305
|
raise SystemExit(1)
|
|
303
306
|
|
|
304
307
|
dev = pick_device()
|
|
@@ -12,9 +12,9 @@ USAGE:
|
|
|
12
12
|
python index_notes.py <notes_dir>
|
|
13
13
|
Config (env, optional):
|
|
14
14
|
BRAIN_INDEX_DIR output dir (default: ./index)
|
|
15
|
-
BRAIN_INDEX_HIDDEN 1 = also index dot-directories (default:
|
|
16
|
-
so .stversions/.obsidian/.git and
|
|
17
|
-
copies never enter the index)
|
|
15
|
+
BRAIN_INDEX_HIDDEN 1 = also index dot-files and dot-directories (default:
|
|
16
|
+
skip them, so .draft.md, .stversions/.obsidian/.git and
|
|
17
|
+
Syncthing conflict copies never enter the index)
|
|
18
18
|
"""
|
|
19
19
|
import os, re, sys, pickle
|
|
20
20
|
from pathlib import Path
|
|
@@ -77,15 +77,15 @@ CONFLICT_MARKER = 'sync-conflict'
|
|
|
77
77
|
def iter_notes(notes_dir):
|
|
78
78
|
"""Files that count as a note under ``notes_dir``.
|
|
79
79
|
|
|
80
|
-
Skips dot-directories and Syncthing conflict copies.
|
|
81
|
-
to index hidden
|
|
80
|
+
Skips dot-directories, dot-files (``.draft.md``) and Syncthing conflict copies.
|
|
81
|
+
Set ``BRAIN_INDEX_HIDDEN=1`` to index hidden paths too — someone will legitimately keep notes in one.
|
|
82
82
|
"""
|
|
83
83
|
root = Path(notes_dir)
|
|
84
84
|
include_hidden = os.getenv('BRAIN_INDEX_HIDDEN', '') not in ('', '0', 'false', 'no')
|
|
85
85
|
out = []
|
|
86
86
|
for p in root.rglob('*.md'):
|
|
87
87
|
rel = p.relative_to(root)
|
|
88
|
-
if not include_hidden and any(part.startswith('.') for part in rel.parts
|
|
88
|
+
if not include_hidden and any(part.startswith('.') for part in rel.parts):
|
|
89
89
|
continue
|
|
90
90
|
if CONFLICT_MARKER in p.name:
|
|
91
91
|
continue
|
|
@@ -131,7 +131,6 @@ def run_recall(query: str, mode: str = "associative") -> tuple[str, bool]:
|
|
|
131
131
|
call_env["PYTHONPATH"] = f"{src_dir}{os.pathsep}{existing_pp}" if existing_pp else src_dir
|
|
132
132
|
res = subprocess.run(
|
|
133
133
|
cmd,
|
|
134
|
-
cwd=str(ROOT_DIR),
|
|
135
134
|
env=call_env,
|
|
136
135
|
capture_output=True,
|
|
137
136
|
text=True,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sqlite-graph-memory
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.3
|
|
4
4
|
Summary: Associative memory for LLM agents: Graph RAG over a folder of markdown notes, in one SQLite file, with no server to run.
|
|
5
5
|
Project-URL: Homepage, https://github.com/tonydzi/sqlite-graph-memory
|
|
6
6
|
Project-URL: Repository, https://github.com/tonydzi/sqlite-graph-memory
|
|
@@ -126,7 +126,7 @@ points, the `[[wikilinks]]` you already wrote by hand are the graph, and a cross
|
|
|
126
126
|
reranks what the hop dragged in.
|
|
127
127
|
SQLite is the only database ([`schema.sql`](src/sqlite_graph_memory/schema.sql)).
|
|
128
128
|
|
|
129
|
-
Status: **pilot**, and the word is load-bearing: it runs daily in one real setup (a ~
|
|
129
|
+
Status: **pilot**, and the word is load-bearing: it runs daily in one real setup (an index of ~28k curated notes, ~93k chunks, rebuilt nightly from a ~270k-file
|
|
130
130
|
Obsidian vault driven by Claude Code), but it is deliberately minimal and makes no attempt
|
|
131
131
|
to be general — see [What's intentionally missing](#whats-intentionally-missing), which is
|
|
132
132
|
where the uneven test coverage is described.
|
|
@@ -252,7 +252,7 @@ present, and CPU works fine for small corpora.
|
|
|
252
252
|
|
|
253
253
|
### What `--ab` looks like
|
|
254
254
|
|
|
255
|
-
Output of `brain_ask.py` with `--ab`, on a toy 4-note corpus (real runs use
|
|
255
|
+
Output of `brain_ask.py` with `--ab`, on a toy 4-note corpus (real runs use an index of ~28k notes / ~93k chunks):
|
|
256
256
|
|
|
257
257
|
```
|
|
258
258
|
A/B RECALL: how should agent memory work
|
|
@@ -491,6 +491,16 @@ Questions, war stories, or you want to run this on your own fleet:
|
|
|
491
491
|
- 🌐 [palo-alto.ai](https://palo-alto.ai) · [Palo Alto AI Research Lab](https://github.com/tonydzi)
|
|
492
492
|
- 🧪 **Engineers: want to test-drive this setup?** Message me — I hand out free starter seeds to engineers who test and report back.
|
|
493
493
|
|
|
494
|
+
## Tell us what is missing
|
|
495
|
+
|
|
496
|
+
You tried this on your own notes and something was missing or broke. That is the most useful
|
|
497
|
+
thing anyone can tell us.
|
|
498
|
+
|
|
499
|
+
- **You started and it did not work:** [open the 3-question form](https://github.com/tonydzi/sqlite-graph-memory/issues/new?template=feature_request.yml) (what you tried, what broke, which machine).
|
|
500
|
+
- **Not sure it is a bug, or just an idea:** [Discussions → Ideas](https://github.com/tonydzi/sqlite-graph-memory/discussions/categories/ideas).
|
|
501
|
+
|
|
502
|
+
Nothing in this package phones home. There is no telemetry, so we only know what you write to us.
|
|
503
|
+
|
|
494
504
|
## Contributors welcome — and there is a queue
|
|
495
505
|
|
|
496
506
|
Issues labelled [`accepted`](https://github.com/tonydzi/sqlite-graph-memory/issues?q=is%3Aissue+is%3Aopen+label%3Aaccepted)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
sqlite_graph_memory/__init__.py,sha256=2xKSCi2vAjRyWsMf6N3Sd9-Znk0IYgmoSc_RzwKM6go,1151
|
|
2
|
+
sqlite_graph_memory/brain_ask.py,sha256=rcXquak8fIYzKLPJL0GhrQGvbA0cVIcj805lNUjvcTY,19392
|
|
3
|
+
sqlite_graph_memory/index_notes.py,sha256=blm9lLlB5MSLB39tNYVtjVGULLQXTQGOth_LV4utyic,5378
|
|
4
|
+
sqlite_graph_memory/mcp_server.py,sha256=XSCd2qJPvAcw9X-81YJzXeAlwL_Ss9soh9kDUqPQ3aQ,9817
|
|
5
|
+
sqlite_graph_memory/ppr.py,sha256=L7VSAiliXr8j3PH2hQqKbdgm08BPm6pZkLcckoMxAro,10001
|
|
6
|
+
sqlite_graph_memory/schema.sql,sha256=8aySXKw3Azaxyzqbd76mKTfOaDP7FlpkLXtgwA8ZVK4,2543
|
|
7
|
+
sqlite_graph_memory/turnstate_hook.py,sha256=fypGmUcHQkzlRN74tvIG07lr9uAXpp2GjetqthkuMc8,8641
|
|
8
|
+
sqlite_graph_memory/turnstate_show.py,sha256=IED7fmJQM5VgBNwxmEoNSZtujRmWja-qVPg5ckbWVnY,2909
|
|
9
|
+
sqlite_graph_memory/vault_stats.py,sha256=QYNGck556RDyLIVFH1C864su5tWehep1DHE21sSTi9g,8596
|
|
10
|
+
sqlite_graph_memory-0.3.3.dist-info/METADATA,sha256=OQVb_K2tbcV2Do83KtG7JlRPLTWnr2ZzNYvBpYhYIiw,33515
|
|
11
|
+
sqlite_graph_memory-0.3.3.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
|
|
12
|
+
sqlite_graph_memory-0.3.3.dist-info/entry_points.txt,sha256=ggzirSEagKB7DZnMli9NUDiMuaog1oeBu_NpRPiKmr0,387
|
|
13
|
+
sqlite_graph_memory-0.3.3.dist-info/licenses/LICENSE,sha256=p88nZdrfMUiES3_MpUEwhGmqz2hQFpyMh0k0cqdpfU8,1082
|
|
14
|
+
sqlite_graph_memory-0.3.3.dist-info/RECORD,,
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
sqlite_graph_memory/__init__.py,sha256=UjsgczAXDPxFURyM2QPQpy5D1LYuVFJ8x-7KWPMKsHY,1151
|
|
2
|
-
sqlite_graph_memory/brain_ask.py,sha256=v3Xn3uczigPxHvsfzoKtZOHmJdMwDjK9ZdP7HKUHkN4,19161
|
|
3
|
-
sqlite_graph_memory/index_notes.py,sha256=Hmt0_VVJHS-zXhPPw9h2te8iG1W48f1tJ_H0ALt9aLk,5333
|
|
4
|
-
sqlite_graph_memory/mcp_server.py,sha256=rYrEUVVnQ5KfZLGIt1Pcpm_6eGZIR37KDKDVSBtilWU,9848
|
|
5
|
-
sqlite_graph_memory/ppr.py,sha256=L7VSAiliXr8j3PH2hQqKbdgm08BPm6pZkLcckoMxAro,10001
|
|
6
|
-
sqlite_graph_memory/schema.sql,sha256=8aySXKw3Azaxyzqbd76mKTfOaDP7FlpkLXtgwA8ZVK4,2543
|
|
7
|
-
sqlite_graph_memory/turnstate_hook.py,sha256=fypGmUcHQkzlRN74tvIG07lr9uAXpp2GjetqthkuMc8,8641
|
|
8
|
-
sqlite_graph_memory/turnstate_show.py,sha256=IED7fmJQM5VgBNwxmEoNSZtujRmWja-qVPg5ckbWVnY,2909
|
|
9
|
-
sqlite_graph_memory/vault_stats.py,sha256=QYNGck556RDyLIVFH1C864su5tWehep1DHE21sSTi9g,8596
|
|
10
|
-
sqlite_graph_memory-0.3.2.dist-info/METADATA,sha256=ZZNMig7G0ZP5F0vHv7CPLLEXUpvQBWmWx6p6XTic3ME,32837
|
|
11
|
-
sqlite_graph_memory-0.3.2.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
|
|
12
|
-
sqlite_graph_memory-0.3.2.dist-info/entry_points.txt,sha256=ggzirSEagKB7DZnMli9NUDiMuaog1oeBu_NpRPiKmr0,387
|
|
13
|
-
sqlite_graph_memory-0.3.2.dist-info/licenses/LICENSE,sha256=p88nZdrfMUiES3_MpUEwhGmqz2hQFpyMh0k0cqdpfU8,1082
|
|
14
|
-
sqlite_graph_memory-0.3.2.dist-info/RECORD,,
|
|
File without changes
|
{sqlite_graph_memory-0.3.2.dist-info → sqlite_graph_memory-0.3.3.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{sqlite_graph_memory-0.3.2.dist-info → sqlite_graph_memory-0.3.3.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|