basic-memory 0.12.3__py3-none-any.whl → 0.13.0__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.
Potentially problematic release.
This version of basic-memory might be problematic. Click here for more details.
- basic_memory/__init__.py +2 -1
- basic_memory/alembic/env.py +1 -1
- basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +108 -0
- basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +104 -0
- basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -6
- basic_memory/api/app.py +43 -13
- basic_memory/api/routers/__init__.py +4 -2
- basic_memory/api/routers/directory_router.py +63 -0
- basic_memory/api/routers/importer_router.py +152 -0
- basic_memory/api/routers/knowledge_router.py +139 -37
- basic_memory/api/routers/management_router.py +78 -0
- basic_memory/api/routers/memory_router.py +6 -62
- basic_memory/api/routers/project_router.py +234 -0
- basic_memory/api/routers/prompt_router.py +260 -0
- basic_memory/api/routers/search_router.py +3 -21
- basic_memory/api/routers/utils.py +130 -0
- basic_memory/api/template_loader.py +292 -0
- basic_memory/cli/app.py +20 -21
- basic_memory/cli/commands/__init__.py +2 -1
- basic_memory/cli/commands/auth.py +136 -0
- basic_memory/cli/commands/db.py +3 -3
- basic_memory/cli/commands/import_chatgpt.py +31 -207
- basic_memory/cli/commands/import_claude_conversations.py +16 -142
- basic_memory/cli/commands/import_claude_projects.py +33 -143
- basic_memory/cli/commands/import_memory_json.py +26 -83
- basic_memory/cli/commands/mcp.py +71 -18
- basic_memory/cli/commands/project.py +102 -70
- basic_memory/cli/commands/status.py +19 -9
- basic_memory/cli/commands/sync.py +44 -58
- basic_memory/cli/commands/tool.py +6 -6
- basic_memory/cli/main.py +1 -5
- basic_memory/config.py +143 -87
- basic_memory/db.py +6 -4
- basic_memory/deps.py +227 -30
- basic_memory/importers/__init__.py +27 -0
- basic_memory/importers/base.py +79 -0
- basic_memory/importers/chatgpt_importer.py +222 -0
- basic_memory/importers/claude_conversations_importer.py +172 -0
- basic_memory/importers/claude_projects_importer.py +148 -0
- basic_memory/importers/memory_json_importer.py +93 -0
- basic_memory/importers/utils.py +58 -0
- basic_memory/markdown/entity_parser.py +5 -2
- basic_memory/mcp/auth_provider.py +270 -0
- basic_memory/mcp/external_auth_provider.py +321 -0
- basic_memory/mcp/project_session.py +103 -0
- basic_memory/mcp/prompts/__init__.py +2 -0
- basic_memory/mcp/prompts/continue_conversation.py +18 -68
- basic_memory/mcp/prompts/recent_activity.py +20 -4
- basic_memory/mcp/prompts/search.py +14 -140
- basic_memory/mcp/prompts/sync_status.py +116 -0
- basic_memory/mcp/prompts/utils.py +3 -3
- basic_memory/mcp/{tools → resources}/project_info.py +6 -2
- basic_memory/mcp/server.py +86 -13
- basic_memory/mcp/supabase_auth_provider.py +463 -0
- basic_memory/mcp/tools/__init__.py +24 -0
- basic_memory/mcp/tools/build_context.py +43 -8
- basic_memory/mcp/tools/canvas.py +17 -3
- basic_memory/mcp/tools/delete_note.py +168 -5
- basic_memory/mcp/tools/edit_note.py +303 -0
- basic_memory/mcp/tools/list_directory.py +154 -0
- basic_memory/mcp/tools/move_note.py +299 -0
- basic_memory/mcp/tools/project_management.py +332 -0
- basic_memory/mcp/tools/read_content.py +15 -6
- basic_memory/mcp/tools/read_note.py +26 -7
- basic_memory/mcp/tools/recent_activity.py +11 -2
- basic_memory/mcp/tools/search.py +189 -8
- basic_memory/mcp/tools/sync_status.py +254 -0
- basic_memory/mcp/tools/utils.py +184 -12
- basic_memory/mcp/tools/view_note.py +66 -0
- basic_memory/mcp/tools/write_note.py +24 -17
- basic_memory/models/__init__.py +3 -2
- basic_memory/models/knowledge.py +16 -4
- basic_memory/models/project.py +78 -0
- basic_memory/models/search.py +8 -5
- basic_memory/repository/__init__.py +2 -0
- basic_memory/repository/entity_repository.py +8 -3
- basic_memory/repository/observation_repository.py +35 -3
- basic_memory/repository/project_info_repository.py +3 -2
- basic_memory/repository/project_repository.py +85 -0
- basic_memory/repository/relation_repository.py +8 -2
- basic_memory/repository/repository.py +107 -15
- basic_memory/repository/search_repository.py +192 -54
- basic_memory/schemas/__init__.py +6 -0
- basic_memory/schemas/base.py +33 -5
- basic_memory/schemas/directory.py +30 -0
- basic_memory/schemas/importer.py +34 -0
- basic_memory/schemas/memory.py +84 -13
- basic_memory/schemas/project_info.py +112 -2
- basic_memory/schemas/prompt.py +90 -0
- basic_memory/schemas/request.py +56 -2
- basic_memory/schemas/search.py +1 -1
- basic_memory/services/__init__.py +2 -1
- basic_memory/services/context_service.py +208 -95
- basic_memory/services/directory_service.py +167 -0
- basic_memory/services/entity_service.py +399 -6
- basic_memory/services/exceptions.py +6 -0
- basic_memory/services/file_service.py +14 -15
- basic_memory/services/initialization.py +170 -66
- basic_memory/services/link_resolver.py +35 -12
- basic_memory/services/migration_service.py +168 -0
- basic_memory/services/project_service.py +671 -0
- basic_memory/services/search_service.py +77 -2
- basic_memory/services/sync_status_service.py +181 -0
- basic_memory/sync/background_sync.py +25 -0
- basic_memory/sync/sync_service.py +102 -21
- basic_memory/sync/watch_service.py +63 -39
- basic_memory/templates/prompts/continue_conversation.hbs +110 -0
- basic_memory/templates/prompts/search.hbs +101 -0
- {basic_memory-0.12.3.dist-info → basic_memory-0.13.0.dist-info}/METADATA +24 -2
- basic_memory-0.13.0.dist-info/RECORD +138 -0
- basic_memory/api/routers/project_info_router.py +0 -274
- basic_memory/mcp/main.py +0 -24
- basic_memory-0.12.3.dist-info/RECORD +0 -100
- {basic_memory-0.12.3.dist-info → basic_memory-0.13.0.dist-info}/WHEEL +0 -0
- {basic_memory-0.12.3.dist-info → basic_memory-0.13.0.dist-info}/entry_points.txt +0 -0
- {basic_memory-0.12.3.dist-info → basic_memory-0.13.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
"""Watch service for Basic Memory."""
|
|
2
2
|
|
|
3
|
+
import asyncio
|
|
3
4
|
import os
|
|
5
|
+
from collections import defaultdict
|
|
4
6
|
from datetime import datetime
|
|
5
7
|
from pathlib import Path
|
|
6
8
|
from typing import List, Optional, Set
|
|
7
9
|
|
|
8
|
-
from basic_memory.config import
|
|
9
|
-
from basic_memory.
|
|
10
|
-
from basic_memory.
|
|
10
|
+
from basic_memory.config import BasicMemoryConfig, WATCH_STATUS_JSON
|
|
11
|
+
from basic_memory.models import Project
|
|
12
|
+
from basic_memory.repository import ProjectRepository
|
|
11
13
|
from loguru import logger
|
|
12
14
|
from pydantic import BaseModel
|
|
13
15
|
from rich.console import Console
|
|
14
16
|
from watchfiles import awatch
|
|
15
17
|
from watchfiles.main import FileChange, Change
|
|
16
18
|
|
|
17
|
-
WATCH_STATUS_JSON = "watch-status.json"
|
|
18
|
-
|
|
19
19
|
|
|
20
20
|
class WatchEvent(BaseModel):
|
|
21
21
|
timestamp: datetime
|
|
@@ -72,16 +72,14 @@ class WatchServiceState(BaseModel):
|
|
|
72
72
|
class WatchService:
|
|
73
73
|
def __init__(
|
|
74
74
|
self,
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
config: ProjectConfig,
|
|
75
|
+
app_config: BasicMemoryConfig,
|
|
76
|
+
project_repository: ProjectRepository,
|
|
78
77
|
quiet: bool = False,
|
|
79
78
|
):
|
|
80
|
-
self.
|
|
81
|
-
self.
|
|
82
|
-
self.config = config
|
|
79
|
+
self.app_config = app_config
|
|
80
|
+
self.project_repository = project_repository
|
|
83
81
|
self.state = WatchServiceState()
|
|
84
|
-
self.status_path =
|
|
82
|
+
self.status_path = Path.home() / ".basic-memory" / WATCH_STATUS_JSON
|
|
85
83
|
self.status_path.parent.mkdir(parents=True, exist_ok=True)
|
|
86
84
|
|
|
87
85
|
# quiet mode for mcp so it doesn't mess up stdout
|
|
@@ -89,10 +87,14 @@ class WatchService:
|
|
|
89
87
|
|
|
90
88
|
async def run(self): # pragma: no cover
|
|
91
89
|
"""Watch for file changes and sync them"""
|
|
90
|
+
|
|
91
|
+
projects = await self.project_repository.get_active_projects()
|
|
92
|
+
project_paths = [project.path for project in projects]
|
|
93
|
+
|
|
92
94
|
logger.info(
|
|
93
95
|
"Watch service started",
|
|
94
|
-
f"
|
|
95
|
-
f"debounce_ms={self.
|
|
96
|
+
f"directories={project_paths}",
|
|
97
|
+
f"debounce_ms={self.app_config.sync_delay}",
|
|
96
98
|
f"pid={os.getpid()}",
|
|
97
99
|
)
|
|
98
100
|
|
|
@@ -102,15 +104,30 @@ class WatchService:
|
|
|
102
104
|
|
|
103
105
|
try:
|
|
104
106
|
async for changes in awatch(
|
|
105
|
-
|
|
106
|
-
debounce=self.
|
|
107
|
+
*project_paths,
|
|
108
|
+
debounce=self.app_config.sync_delay,
|
|
107
109
|
watch_filter=self.filter_changes,
|
|
108
110
|
recursive=True,
|
|
109
111
|
):
|
|
110
|
-
|
|
112
|
+
# group changes by project
|
|
113
|
+
project_changes = defaultdict(list)
|
|
114
|
+
for change, path in changes:
|
|
115
|
+
for project in projects:
|
|
116
|
+
if self.is_project_path(project, path):
|
|
117
|
+
project_changes[project].append((change, path))
|
|
118
|
+
break
|
|
119
|
+
|
|
120
|
+
# create coroutines to handle changes
|
|
121
|
+
change_handlers = [
|
|
122
|
+
self.handle_changes(project, changes) # pyright: ignore
|
|
123
|
+
for project, changes in project_changes.items()
|
|
124
|
+
]
|
|
125
|
+
|
|
126
|
+
# process changes
|
|
127
|
+
await asyncio.gather(*change_handlers)
|
|
111
128
|
|
|
112
129
|
except Exception as e:
|
|
113
|
-
logger.exception("Watch service error", error=str(e)
|
|
130
|
+
logger.exception("Watch service error", error=str(e))
|
|
114
131
|
|
|
115
132
|
self.state.record_error(str(e))
|
|
116
133
|
await self.write_status()
|
|
@@ -119,7 +136,6 @@ class WatchService:
|
|
|
119
136
|
finally:
|
|
120
137
|
logger.info(
|
|
121
138
|
"Watch service stopped",
|
|
122
|
-
f"directory={str(self.config.home)}",
|
|
123
139
|
f"runtime_seconds={int((datetime.now() - self.state.start_time).total_seconds())}",
|
|
124
140
|
)
|
|
125
141
|
|
|
@@ -132,15 +148,9 @@ class WatchService:
|
|
|
132
148
|
Returns:
|
|
133
149
|
True if the file should be watched, False if it should be ignored
|
|
134
150
|
"""
|
|
135
|
-
# Skip if path is invalid
|
|
136
|
-
try:
|
|
137
|
-
relative_path = Path(path).relative_to(self.config.home)
|
|
138
|
-
except ValueError:
|
|
139
|
-
# This is a defensive check for paths outside our home directory
|
|
140
|
-
return False
|
|
141
151
|
|
|
142
152
|
# Skip hidden directories and files
|
|
143
|
-
path_parts =
|
|
153
|
+
path_parts = Path(path).parts
|
|
144
154
|
for part in path_parts:
|
|
145
155
|
if part.startswith("."):
|
|
146
156
|
return False
|
|
@@ -155,14 +165,30 @@ class WatchService:
|
|
|
155
165
|
"""Write current state to status file"""
|
|
156
166
|
self.status_path.write_text(WatchServiceState.model_dump_json(self.state, indent=2))
|
|
157
167
|
|
|
158
|
-
|
|
168
|
+
def is_project_path(self, project: Project, path):
|
|
169
|
+
"""
|
|
170
|
+
Checks if path is a subdirectory or file within a project
|
|
171
|
+
"""
|
|
172
|
+
project_path = Path(project.path).resolve()
|
|
173
|
+
sub_path = Path(path).resolve()
|
|
174
|
+
return project_path in sub_path.parents
|
|
175
|
+
|
|
176
|
+
async def handle_changes(self, project: Project, changes: Set[FileChange]) -> None:
|
|
159
177
|
"""Process a batch of file changes"""
|
|
160
178
|
import time
|
|
161
179
|
from typing import List, Set
|
|
162
180
|
|
|
163
|
-
|
|
181
|
+
# Lazily initialize sync service for project changes
|
|
182
|
+
from basic_memory.cli.commands.sync import get_sync_service
|
|
183
|
+
|
|
184
|
+
sync_service = await get_sync_service(project)
|
|
185
|
+
file_service = sync_service.file_service
|
|
164
186
|
|
|
165
|
-
|
|
187
|
+
start_time = time.time()
|
|
188
|
+
directory = Path(project.path).resolve()
|
|
189
|
+
logger.info(
|
|
190
|
+
f"Processing project: {project.name} changes, change_count={len(changes)}, directory={directory}"
|
|
191
|
+
)
|
|
166
192
|
|
|
167
193
|
# Group changes by type
|
|
168
194
|
adds: List[str] = []
|
|
@@ -190,7 +216,7 @@ class WatchService:
|
|
|
190
216
|
|
|
191
217
|
# because of our atomic writes on updates, an add may be an existing file
|
|
192
218
|
for added_path in adds: # pragma: no cover TODO add test
|
|
193
|
-
entity = await
|
|
219
|
+
entity = await sync_service.entity_repository.get_by_file_path(added_path)
|
|
194
220
|
if entity is not None:
|
|
195
221
|
logger.debug(f"Existing file will be processed as modified, path={added_path}")
|
|
196
222
|
adds.remove(added_path)
|
|
@@ -218,9 +244,7 @@ class WatchService:
|
|
|
218
244
|
continue # pragma: no cover
|
|
219
245
|
|
|
220
246
|
# Skip directories for deleted paths (based on entity type in db)
|
|
221
|
-
deleted_entity = await
|
|
222
|
-
deleted_path
|
|
223
|
-
)
|
|
247
|
+
deleted_entity = await sync_service.entity_repository.get_by_file_path(deleted_path)
|
|
224
248
|
if deleted_entity is None:
|
|
225
249
|
# If this was a directory, it wouldn't have an entity
|
|
226
250
|
logger.debug("Skipping unknown path for move detection", path=deleted_path)
|
|
@@ -229,10 +253,10 @@ class WatchService:
|
|
|
229
253
|
if added_path != deleted_path:
|
|
230
254
|
# Compare checksums to detect moves
|
|
231
255
|
try:
|
|
232
|
-
added_checksum = await
|
|
256
|
+
added_checksum = await file_service.compute_checksum(added_path)
|
|
233
257
|
|
|
234
258
|
if deleted_entity and deleted_entity.checksum == added_checksum:
|
|
235
|
-
await
|
|
259
|
+
await sync_service.handle_move(deleted_path, added_path)
|
|
236
260
|
self.state.add_event(
|
|
237
261
|
path=f"{deleted_path} -> {added_path}",
|
|
238
262
|
action="moved",
|
|
@@ -261,7 +285,7 @@ class WatchService:
|
|
|
261
285
|
for path in deletes:
|
|
262
286
|
if path not in processed:
|
|
263
287
|
logger.debug("Processing deleted file", path=path)
|
|
264
|
-
await
|
|
288
|
+
await sync_service.handle_delete(path)
|
|
265
289
|
self.state.add_event(path=path, action="deleted", status="success")
|
|
266
290
|
self.console.print(f"[red]✕[/red] {path}")
|
|
267
291
|
logger.info(f"deleted: {path}")
|
|
@@ -281,7 +305,7 @@ class WatchService:
|
|
|
281
305
|
continue # pragma: no cover
|
|
282
306
|
|
|
283
307
|
logger.debug(f"Processing new file, path={path}")
|
|
284
|
-
entity, checksum = await
|
|
308
|
+
entity, checksum = await sync_service.sync_file(path, new=True)
|
|
285
309
|
if checksum:
|
|
286
310
|
self.state.add_event(
|
|
287
311
|
path=path, action="new", status="success", checksum=checksum
|
|
@@ -314,7 +338,7 @@ class WatchService:
|
|
|
314
338
|
continue
|
|
315
339
|
|
|
316
340
|
logger.debug(f"Processing modified file: path={path}")
|
|
317
|
-
entity, checksum = await
|
|
341
|
+
entity, checksum = await sync_service.sync_file(path, new=False)
|
|
318
342
|
self.state.add_event(
|
|
319
343
|
path=path, action="modified", status="success", checksum=checksum
|
|
320
344
|
)
|
|
@@ -335,7 +359,7 @@ class WatchService:
|
|
|
335
359
|
repeat_count = 0
|
|
336
360
|
modify_count += 1
|
|
337
361
|
|
|
338
|
-
logger.debug(
|
|
362
|
+
logger.debug( # pragma: no cover
|
|
339
363
|
"Modified file processed, "
|
|
340
364
|
f"path={path} "
|
|
341
365
|
f"entity_id={entity.id if entity else None} "
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Continuing conversation on: {{ topic }}
|
|
2
|
+
|
|
3
|
+
This is a memory retrieval session.
|
|
4
|
+
|
|
5
|
+
Please use the available basic-memory tools to gather relevant context before responding. Start by executing one of the suggested commands below to retrieve content.
|
|
6
|
+
|
|
7
|
+
> **Knowledge Capture Recommendation:** As you continue this conversation, actively look for opportunities to record new information, decisions, or insights that emerge. Use `write_note()` to document important context.
|
|
8
|
+
|
|
9
|
+
Here's what I found from previous conversations:
|
|
10
|
+
|
|
11
|
+
{{#if has_results}}
|
|
12
|
+
{{#each hierarchical_results}}
|
|
13
|
+
<memory>
|
|
14
|
+
--- memory://{{ primary_result.permalink }}
|
|
15
|
+
|
|
16
|
+
## {{ primary_result.title }}
|
|
17
|
+
- **Type**: {{ primary_result.type }}
|
|
18
|
+
- **Created**: {{date primary_result.created_at "%Y-%m-%d %H:%M"}}
|
|
19
|
+
|
|
20
|
+
{{#if primary_result.content}}
|
|
21
|
+
**Excerpt**:
|
|
22
|
+
<excerpt>
|
|
23
|
+
{{ primary_result.content }}
|
|
24
|
+
</excerpt>
|
|
25
|
+
{{/if}}
|
|
26
|
+
|
|
27
|
+
{{#if observations}}
|
|
28
|
+
## Observations
|
|
29
|
+
{{#each observations}}
|
|
30
|
+
<observation>
|
|
31
|
+
- [{{ category }}] {{ content }}
|
|
32
|
+
</observation>
|
|
33
|
+
{{/each}}
|
|
34
|
+
{{/if}}
|
|
35
|
+
|
|
36
|
+
You can read this document with: `read_note("{{ primary_result.permalink }}")`
|
|
37
|
+
|
|
38
|
+
{{#if related_results}}
|
|
39
|
+
## Related Context
|
|
40
|
+
|
|
41
|
+
{{#each related_results}}
|
|
42
|
+
<related>
|
|
43
|
+
- type: **{{ type }}**
|
|
44
|
+
- title: {{ title }}
|
|
45
|
+
|
|
46
|
+
{{#if permalink}}
|
|
47
|
+
You can view this document with: `read_note("{{ permalink }}")`
|
|
48
|
+
{{else}}
|
|
49
|
+
You can view this file with: `read_file("{{ file_path }}")`
|
|
50
|
+
{{/if}}
|
|
51
|
+
</related>
|
|
52
|
+
{{/each}}
|
|
53
|
+
{{/if}}
|
|
54
|
+
|
|
55
|
+
</memory>
|
|
56
|
+
{{/each}}
|
|
57
|
+
{{else}}
|
|
58
|
+
The supplied query did not return any information specifically on this topic.
|
|
59
|
+
|
|
60
|
+
## Opportunity to Capture New Knowledge!
|
|
61
|
+
|
|
62
|
+
This is an excellent chance to start documenting this topic:
|
|
63
|
+
|
|
64
|
+
```python
|
|
65
|
+
await write_note(
|
|
66
|
+
title="{{ topic }}",
|
|
67
|
+
content=f'''
|
|
68
|
+
# {{ topic }}
|
|
69
|
+
|
|
70
|
+
## Overview
|
|
71
|
+
[Summary of what we know about {{ topic }}]
|
|
72
|
+
|
|
73
|
+
## Key Points
|
|
74
|
+
[Main aspects or components of {{ topic }}]
|
|
75
|
+
|
|
76
|
+
## Observations
|
|
77
|
+
- [category] [First important observation about {{ topic }}]
|
|
78
|
+
- [category] [Second observation about {{ topic }}]
|
|
79
|
+
|
|
80
|
+
## Relations
|
|
81
|
+
- relates_to [[Related Topic]]
|
|
82
|
+
- part_of [[Broader Context]]
|
|
83
|
+
'''
|
|
84
|
+
)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Other Options
|
|
88
|
+
|
|
89
|
+
Please use the available basic-memory tools to gather relevant context before responding.
|
|
90
|
+
You can also:
|
|
91
|
+
- Try a different search term
|
|
92
|
+
- Check recent activity with `recent_activity(timeframe="1w")`
|
|
93
|
+
{{/if}}
|
|
94
|
+
## Next Steps
|
|
95
|
+
<instructions>
|
|
96
|
+
You can:
|
|
97
|
+
- Explore more with: `search_notes("{{ topic }}")`
|
|
98
|
+
- See what's changed: `recent_activity(timeframe="{{default timeframe "7d"}}")`
|
|
99
|
+
- **Record new learnings or decisions from this conversation:** `write_note(folder="[Chose a folder]" title="[Create a meaningful title]", content="[Content with observations and relations]")`
|
|
100
|
+
|
|
101
|
+
## Knowledge Capture Recommendation
|
|
102
|
+
|
|
103
|
+
As you continue this conversation, **actively look for opportunities to:**
|
|
104
|
+
1. Record key information, decisions, or insights that emerge
|
|
105
|
+
2. Link new knowledge to existing topics
|
|
106
|
+
3. Suggest capturing important context when appropriate
|
|
107
|
+
4. Create forward references to topics that might be created later
|
|
108
|
+
|
|
109
|
+
Remember that capturing knowledge during conversations is one of the most valuable aspects of Basic Memory.
|
|
110
|
+
</instructions>
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Search Results for: "{{ query }}"{{#if timeframe}} (after {{ timeframe }}){{/if}}
|
|
2
|
+
|
|
3
|
+
This is a memory search session.
|
|
4
|
+
Please use the available basic-memory tools to gather relevant context before responding.
|
|
5
|
+
I found {{ result_count }} result(s) that match your query.
|
|
6
|
+
|
|
7
|
+
{{#if has_results}}
|
|
8
|
+
Here are the most relevant results:
|
|
9
|
+
|
|
10
|
+
{{#each results}}
|
|
11
|
+
{{#if_cond (lt @index 5)}}
|
|
12
|
+
{{#dedent}}
|
|
13
|
+
## {{math @index "+" 1}}. {{ title }}
|
|
14
|
+
- **Type**: {{ type.value }}
|
|
15
|
+
{{#if metadata.created_at}}
|
|
16
|
+
- **Created**: {{date metadata.created_at "%Y-%m-%d %H:%M"}}
|
|
17
|
+
{{/if}}
|
|
18
|
+
- **Relevance Score**: {{round score 2}}
|
|
19
|
+
|
|
20
|
+
{{#if content}}
|
|
21
|
+
- **Excerpt**:
|
|
22
|
+
{{ content }}
|
|
23
|
+
{{/if}}
|
|
24
|
+
|
|
25
|
+
{{#if permalink}}
|
|
26
|
+
You can view this content with: `read_note("{{ permalink }}")`
|
|
27
|
+
Or explore its context with: `build_context("memory://{{ permalink }}")`
|
|
28
|
+
{{else}}
|
|
29
|
+
You can view this file with: `read_file("{{ file_path }}")`
|
|
30
|
+
{{/if}}
|
|
31
|
+
{{/dedent}}
|
|
32
|
+
{{/if_cond}}
|
|
33
|
+
{{/each}}
|
|
34
|
+
|
|
35
|
+
## Next Steps
|
|
36
|
+
|
|
37
|
+
You can:
|
|
38
|
+
- Refine your search: `search_notes("{{ query }} AND additional_term")`
|
|
39
|
+
- Exclude terms: `search_notes("{{ query }} NOT exclude_term")`
|
|
40
|
+
- View more results: `search_notes("{{ query }}", after_date=None)`
|
|
41
|
+
- Check recent activity: `recent_activity()`
|
|
42
|
+
|
|
43
|
+
## Synthesize and Capture Knowledge
|
|
44
|
+
|
|
45
|
+
Consider creating a new note that synthesizes what you've learned:
|
|
46
|
+
|
|
47
|
+
```python
|
|
48
|
+
await write_note(
|
|
49
|
+
title="Synthesis of {{capitalize query}} Information",
|
|
50
|
+
content='''
|
|
51
|
+
# Synthesis of {{capitalize query}} Information
|
|
52
|
+
|
|
53
|
+
## Overview
|
|
54
|
+
[Synthesis of the search results and your conversation]
|
|
55
|
+
|
|
56
|
+
## Key Insights
|
|
57
|
+
[Summary of main points learned from these results]
|
|
58
|
+
|
|
59
|
+
## Observations
|
|
60
|
+
- [insight] [Important observation from search results]
|
|
61
|
+
- [connection] [How this connects to other topics]
|
|
62
|
+
|
|
63
|
+
## Relations
|
|
64
|
+
- relates_to [[{{#if results.length}}{{#if results.0.title}}{{results.0.title}}{{else}}Related Topic{{/if}}{{else}}Related Topic{{/if}}]]
|
|
65
|
+
- extends [[Another Relevant Topic]]
|
|
66
|
+
'''
|
|
67
|
+
)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Remember that capturing synthesized knowledge is one of the most valuable features of Basic Memory.
|
|
71
|
+
{{else}}
|
|
72
|
+
I couldn't find any results for this query.
|
|
73
|
+
|
|
74
|
+
## Opportunity to Capture Knowledge!
|
|
75
|
+
|
|
76
|
+
This is an excellent opportunity to create new knowledge on this topic. Consider:
|
|
77
|
+
|
|
78
|
+
```python
|
|
79
|
+
await write_note(
|
|
80
|
+
title="{{capitalize query}}",
|
|
81
|
+
content='''
|
|
82
|
+
# {{capitalize query}}
|
|
83
|
+
|
|
84
|
+
## Overview
|
|
85
|
+
[Summary of what we've discussed about {{ query }}]
|
|
86
|
+
|
|
87
|
+
## Observations
|
|
88
|
+
- [category] [First observation about {{ query }}]
|
|
89
|
+
- [category] [Second observation about {{ query }}]
|
|
90
|
+
|
|
91
|
+
## Relations
|
|
92
|
+
- relates_to [[Other Relevant Topic]]
|
|
93
|
+
'''
|
|
94
|
+
)
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Other Suggestions
|
|
98
|
+
- Try a different search term
|
|
99
|
+
- Broaden your search criteria
|
|
100
|
+
- Check recent activity with `recent_activity(timeframe="1w")`
|
|
101
|
+
{{/if}}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: basic-memory
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.13.0
|
|
4
4
|
Summary: Local-first knowledge management combining Zettelkasten with knowledge graphs
|
|
5
5
|
Project-URL: Homepage, https://github.com/basicmachines-co/basic-memory
|
|
6
6
|
Project-URL: Repository, https://github.com/basicmachines-co/basic-memory
|
|
@@ -13,18 +13,22 @@ Requires-Dist: aiosqlite>=0.20.0
|
|
|
13
13
|
Requires-Dist: alembic>=1.14.1
|
|
14
14
|
Requires-Dist: dateparser>=1.2.0
|
|
15
15
|
Requires-Dist: fastapi[standard]>=0.115.8
|
|
16
|
+
Requires-Dist: fastmcp>=2.3.4
|
|
16
17
|
Requires-Dist: greenlet>=3.1.1
|
|
17
18
|
Requires-Dist: icecream>=2.1.3
|
|
18
19
|
Requires-Dist: loguru>=0.7.3
|
|
19
20
|
Requires-Dist: markdown-it-py>=3.0.0
|
|
20
21
|
Requires-Dist: mcp>=1.2.0
|
|
21
22
|
Requires-Dist: pillow>=11.1.0
|
|
23
|
+
Requires-Dist: pybars3>=0.9.7
|
|
22
24
|
Requires-Dist: pydantic-settings>=2.6.1
|
|
23
25
|
Requires-Dist: pydantic[email,timezone]>=2.10.3
|
|
26
|
+
Requires-Dist: pyjwt>=2.10.1
|
|
24
27
|
Requires-Dist: pyright>=1.1.390
|
|
28
|
+
Requires-Dist: pytest-aio>=1.9.0
|
|
29
|
+
Requires-Dist: python-dotenv>=1.1.0
|
|
25
30
|
Requires-Dist: python-frontmatter>=1.1.0
|
|
26
31
|
Requires-Dist: pyyaml>=6.0.1
|
|
27
|
-
Requires-Dist: qasync>=0.27.1
|
|
28
32
|
Requires-Dist: rich>=13.9.4
|
|
29
33
|
Requires-Dist: sqlalchemy>=2.0.0
|
|
30
34
|
Requires-Dist: typer>=0.9.0
|
|
@@ -410,6 +414,24 @@ See the [Documentation](https://memory.basicmachines.co/) for more info, includi
|
|
|
410
414
|
- [Managing multiple Projects](https://memory.basicmachines.co/docs/cli-reference#project)
|
|
411
415
|
- [Importing data from OpenAI/Claude Projects](https://memory.basicmachines.co/docs/cli-reference#import)
|
|
412
416
|
|
|
417
|
+
## Installation Options
|
|
418
|
+
|
|
419
|
+
### Stable Release
|
|
420
|
+
```bash
|
|
421
|
+
pip install basic-memory
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
### Beta/Pre-releases
|
|
425
|
+
```bash
|
|
426
|
+
pip install basic-memory --pre
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
### Development Builds
|
|
430
|
+
Development versions are automatically published on every commit to main with versions like `0.12.4.dev26+468a22f`:
|
|
431
|
+
```bash
|
|
432
|
+
pip install basic-memory --pre --force-reinstall
|
|
433
|
+
```
|
|
434
|
+
|
|
413
435
|
## License
|
|
414
436
|
|
|
415
437
|
AGPL-3.0
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
basic_memory/__init__.py,sha256=kYTgbNYjpTOTrVbmkdvP8eII6KD0j3qf2LgF-q01dQQ,178
|
|
2
|
+
basic_memory/config.py,sha256=lNpbn-b1k9nunQ-htciYQHC8XatRIhc_m6SN2Pbvp-E,11101
|
|
3
|
+
basic_memory/db.py,sha256=X4-uyEZdJXVLfFDTpcNZxWzawRZXhDdKoEFWAGgE4Lk,6193
|
|
4
|
+
basic_memory/deps.py,sha256=zXOhqXCoSVIa1iIcO8U6uUiofJn5eT4ycwJkH9I2kX4,12102
|
|
5
|
+
basic_memory/file_utils.py,sha256=eaxTKLLEbTIy_Mb_Iv_Dmt4IXAJSrZGVi-Knrpyci3E,6700
|
|
6
|
+
basic_memory/utils.py,sha256=BL6DDRiMF1gNcDr_guRAYflooSrSlDniJh96ApdzuDY,7555
|
|
7
|
+
basic_memory/alembic/alembic.ini,sha256=IEZsnF8CbbZnkwBr67LzKKNobHuzTaQNUvM8Psop5xc,3733
|
|
8
|
+
basic_memory/alembic/env.py,sha256=2izCQuFbw0hhlx0L8dHgQ98QM_tzMj6WbgrznKrbxv8,2727
|
|
9
|
+
basic_memory/alembic/migrations.py,sha256=lriHPXDdBLSNXEW3QTpU0SJKuVd1V-8NrVkpN3qfsUQ,718
|
|
10
|
+
basic_memory/alembic/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
|
|
11
|
+
basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py,sha256=lTbWlAnd1es7xU99DoJgfaRe1_Kte8TL98riqeKGV80,4363
|
|
12
|
+
basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py,sha256=k6xYTmYPM9Ros-7CA7BwZBKYwoK_gmVdC-2n8FAjdoE,1840
|
|
13
|
+
basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py,sha256=2CCY9ayjzbraYMcinqSsJi9Sc0nu2e-ehkUJus-sz34,4379
|
|
14
|
+
basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py,sha256=YErFkIpZdicvUil4ZtE6uxSpk5BZCTXZ_TfPE-MgSfo,4210
|
|
15
|
+
basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py,sha256=RsGymQzfRXV1LSNKiyi0lMilTxW1NgwS9jR67ye2apI,1428
|
|
16
|
+
basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py,sha256=kDavR9Qqx9wSu5P3qd4SZq_waIsDG1UMTg2SmDoktMU,3679
|
|
17
|
+
basic_memory/api/__init__.py,sha256=wCpj-21j1D0KzKl9Ql6unLBVFY0K1uGp_FeSZRKtqpk,72
|
|
18
|
+
basic_memory/api/app.py,sha256=ucV1epIVQ210JFdZIs6aZ_UWK8TG78p_NhGf6WOrFk0,2809
|
|
19
|
+
basic_memory/api/template_loader.py,sha256=exbTeXyJRgyLFmSjNeroxjT7X2DWFm2X5qUVa3drbYM,8607
|
|
20
|
+
basic_memory/api/routers/__init__.py,sha256=REO5CKQ96o5vtGWACcsIxIpWybIUSeKXc83RWbWc8BQ,398
|
|
21
|
+
basic_memory/api/routers/directory_router.py,sha256=rBQHvuwffUOk0iKvcEs2QlWclgvr8ur24f_pH3-sVRQ,2054
|
|
22
|
+
basic_memory/api/routers/importer_router.py,sha256=xFUCorkPWo8AF0ya0UrcLmXNf8CjPZdAqddQIH8PO-o,4513
|
|
23
|
+
basic_memory/api/routers/knowledge_router.py,sha256=4dD_tPpcJGWCuoRKEbQXCS3hoXNWe-VbcGC7xV-8VoE,9738
|
|
24
|
+
basic_memory/api/routers/management_router.py,sha256=INT5PzUXhfBH2546CTZKqZnRuECYIA4Ypfgdf6JNyu0,2686
|
|
25
|
+
basic_memory/api/routers/memory_router.py,sha256=a9Cnx3XgwSkO-2ABFzI3wM3PoMGxuyfJFFp7NfFZapc,3003
|
|
26
|
+
basic_memory/api/routers/project_router.py,sha256=cXGx6VZMg67jdzMi1Xf8SodtueEI04xRwtiv9ygf2Bg,8239
|
|
27
|
+
basic_memory/api/routers/prompt_router.py,sha256=4wxq6-NREgVJM8N9C0YsN1AAUDD8nkTCOzWyzSqTSFw,9948
|
|
28
|
+
basic_memory/api/routers/resource_router.py,sha256=WEJEqEaY_yTKj5-U-rW4kXQKUcJflykgwI6_g_R41ck,8058
|
|
29
|
+
basic_memory/api/routers/search_router.py,sha256=GD62jlCQTiL_VNsdibi-b1f6H40KCWo9SX2Cl7YH4QU,1226
|
|
30
|
+
basic_memory/api/routers/utils.py,sha256=vW-bYUmATQPe-pYbQfNjuho-BzsHhy9bmWv-LZX3HTc,5153
|
|
31
|
+
basic_memory/cli/__init__.py,sha256=arcKLAWRDhPD7x5t80MlviZeYzwHZ0GZigyy3NKVoGk,33
|
|
32
|
+
basic_memory/cli/app.py,sha256=BCIaiJBPV0ipk8KwPRLNiG2ACKBQH9wo1ewKZm7CV7o,2269
|
|
33
|
+
basic_memory/cli/main.py,sha256=_0eW-TWYxj8WyCHSS9kFcrrntpeIsqJrA2P0n6LfFvY,475
|
|
34
|
+
basic_memory/cli/commands/__init__.py,sha256=jtnGMOIgOBNJCXQ8xpKbLWhFUD3qgpOraRi19YRNaTc,411
|
|
35
|
+
basic_memory/cli/commands/auth.py,sha256=mnTlb75eeQWocWYs67LaYbuEysaYvHkqP7gQ0FEXKjE,4858
|
|
36
|
+
basic_memory/cli/commands/db.py,sha256=IVFCTQcj2tI_U5mWRjUbDTHH-GjLBM7FGh5OA69C8ko,1141
|
|
37
|
+
basic_memory/cli/commands/import_chatgpt.py,sha256=VU_Kfr4B0lVh_Z2_bmsTO3e3U40wrAOvTAvtblgjses,2773
|
|
38
|
+
basic_memory/cli/commands/import_claude_conversations.py,sha256=sXnP0hjfwUapwHQDzxE2HEkCDe8FTaE4cogKILsD1EA,2866
|
|
39
|
+
basic_memory/cli/commands/import_claude_projects.py,sha256=mWYIeA-mu_Pq23R7OEtY2XHXG5CAh1dMGIBhckB4zRk,2811
|
|
40
|
+
basic_memory/cli/commands/import_memory_json.py,sha256=Vz5rt7KCel5B3Dtv57WPEUJTHCMwFUqQlOCm2djwUi8,2867
|
|
41
|
+
basic_memory/cli/commands/mcp.py,sha256=jmRUv1U5FT3AQ1cDbvTfAUnjhBw6UsNEmIkpbNr-_qQ,3093
|
|
42
|
+
basic_memory/cli/commands/project.py,sha256=YkVYcjxQOVhxIX1M0g_vMaP5dTinYvSnUQIjeOPg8HE,12971
|
|
43
|
+
basic_memory/cli/commands/status.py,sha256=708EK8-iPjyc1iE5MPECzAyZraGYoGpvYjLwTm-BlQs,5719
|
|
44
|
+
basic_memory/cli/commands/sync.py,sha256=gOU_onrMj9_IRiIe8FWU_FLEvfjcOt-qhrvvFJuU-ws,8010
|
|
45
|
+
basic_memory/cli/commands/tool.py,sha256=my-kALn3khv1W2Avi736NrHsfkpbyP57mDi5LjHwqe0,9540
|
|
46
|
+
basic_memory/importers/__init__.py,sha256=BTcBW97P3thcsWa5w9tQsvOu8ynHDgw2-8tPgkCZoh8,795
|
|
47
|
+
basic_memory/importers/base.py,sha256=awwe_U-CfzSINKoM6iro7ru4QqLlsfXzdHztDvebnxM,2531
|
|
48
|
+
basic_memory/importers/chatgpt_importer.py,sha256=36VAsZarI7XE5r_KxNpWeHM1HPfHj6NfTDuH6ExY4hg,7372
|
|
49
|
+
basic_memory/importers/claude_conversations_importer.py,sha256=p7yehy9Pgc5fef6d0ab9DwCm8CCiyyZkGEqX8U7rHbw,5725
|
|
50
|
+
basic_memory/importers/claude_projects_importer.py,sha256=pFJnX9m7GOv2TrS9f2nM1-mTtheTEBWjxKtwDWdJOGM,5389
|
|
51
|
+
basic_memory/importers/memory_json_importer.py,sha256=u-cNYPuBsiNcyOLKo8YBXKyCp_dOs5PmkTpw5o8SXnw,3936
|
|
52
|
+
basic_memory/importers/utils.py,sha256=7n4i_UgSNiOU9i7YlEq-gHOMHjq4gTH69jn0qMz9bIk,1792
|
|
53
|
+
basic_memory/markdown/__init__.py,sha256=DdzioCWtDnKaq05BHYLgL_78FawEHLpLXnp-kPSVfIc,501
|
|
54
|
+
basic_memory/markdown/entity_parser.py,sha256=Gw0RdzWGRcy63RcLP2J2Dcm9g404x0GXirDaWDYjTWg,4516
|
|
55
|
+
basic_memory/markdown/markdown_processor.py,sha256=S5ny69zu2dlqO7tWJoLrpLSzg8emQIDq7Du7olpJUsk,4968
|
|
56
|
+
basic_memory/markdown/plugins.py,sha256=gtIzKRjoZsyvBqLpVNnrmzl_cbTZ5ZGn8kcuXxQjRko,6639
|
|
57
|
+
basic_memory/markdown/schemas.py,sha256=eyxYCr1hVyWmImcle0asE5It_DD6ARkqaBZYu1KK5n4,1896
|
|
58
|
+
basic_memory/markdown/utils.py,sha256=wr7KnDMThgnztkOoqSG_ANPhwNBoPkyjYP1sA1Wnxe4,3270
|
|
59
|
+
basic_memory/mcp/__init__.py,sha256=dsDOhKqjYeIbCULbHIxfcItTbqudEuEg1Np86eq0GEQ,35
|
|
60
|
+
basic_memory/mcp/async_client.py,sha256=Eo345wANiBRSM4u3j_Vd6Ax4YtMg7qbWd9PIoFfj61I,236
|
|
61
|
+
basic_memory/mcp/auth_provider.py,sha256=CTydkEBvxh_fg_Z0hxKjTT8nHJoFhxrwp5hTQuToiIU,9977
|
|
62
|
+
basic_memory/mcp/external_auth_provider.py,sha256=Z1GDbr6P4C-flZVHMWkIqAu30kcfeHv2iSp0EYbFuxo,11483
|
|
63
|
+
basic_memory/mcp/project_session.py,sha256=OP1X10iG4wIWHgfkwC2q7Inl6b68zrioqkD1-Ju_S6w,3462
|
|
64
|
+
basic_memory/mcp/server.py,sha256=QbRkkYaDWK5Vrvez39ET8C6h5uGS6y4wDHMVaCgdD78,3787
|
|
65
|
+
basic_memory/mcp/supabase_auth_provider.py,sha256=MLHfSHjdx2Q5jr_Ljx0qZBaOwp7CkPdk_ybR_LQ7Mvw,16472
|
|
66
|
+
basic_memory/mcp/prompts/__init__.py,sha256=UvaIw5KA8PaXj3Wz1Dr-VjlkEq6T5D8AGtYFVwaHqnA,683
|
|
67
|
+
basic_memory/mcp/prompts/ai_assistant_guide.py,sha256=8TI5xObiRVcwv6w9by1xQHlX0whvyE7-LGsiqDMRTFg,821
|
|
68
|
+
basic_memory/mcp/prompts/continue_conversation.py,sha256=rsmlC2V7e7G6DAK0K825vFsPKgsRQ702HFzn6lkHaDM,1998
|
|
69
|
+
basic_memory/mcp/prompts/recent_activity.py,sha256=0v1c3b2SdDDxXVuF8eOjNooYy04uRYel0pdJ0rnggw4,3311
|
|
70
|
+
basic_memory/mcp/prompts/search.py,sha256=nb88MZy9tdW_MmCLUVItiukrLdb3xEHWLv0JVLUlc4o,1692
|
|
71
|
+
basic_memory/mcp/prompts/sync_status.py,sha256=_5EqnCavY9BTsaxX2tPp-AgQZLt4bUrqQ6TwbM0L5w8,4645
|
|
72
|
+
basic_memory/mcp/prompts/utils.py,sha256=VacrbqwYtySpIlYIrKHo5s6jtoTMscYJqrFRH3zpC6Q,5431
|
|
73
|
+
basic_memory/mcp/resources/ai_assistant_guide.md,sha256=qnYWDkYlb-JmKuOoZ5llmRas_t4dWDXB_i8LE277Lgs,14777
|
|
74
|
+
basic_memory/mcp/resources/project_info.py,sha256=LcUkTx4iXBfU6Lp4TVch78OqLopbOy4ljyKnfr4VXso,1906
|
|
75
|
+
basic_memory/mcp/tools/__init__.py,sha256=lCCOC0jElvL2v53WI_dxRs4qABq4Eo-YGm6j2XeZ6AQ,1591
|
|
76
|
+
basic_memory/mcp/tools/build_context.py,sha256=RbevfGVblSF901kAD2zc1CQ5z3tzfLC9XV_jcq35d_Y,4490
|
|
77
|
+
basic_memory/mcp/tools/canvas.py,sha256=22F9G9gfPb-l8i1B5ra4Ja_h9zYY83rPY9mDA5C5gkY,3738
|
|
78
|
+
basic_memory/mcp/tools/delete_note.py,sha256=tSyRc_VgBmLyVeenClwX1Sk--LKcGahAMzTX2mK2XIs,7346
|
|
79
|
+
basic_memory/mcp/tools/edit_note.py,sha256=q4x-f7-j_l-wzm17-AVFT1_WGCo0Cq4lI3seYSe21aY,13570
|
|
80
|
+
basic_memory/mcp/tools/list_directory.py,sha256=-FxDsCru5YD02M4qkQDAurEJWyRaC7YI4YR6zg0atR8,5236
|
|
81
|
+
basic_memory/mcp/tools/move_note.py,sha256=esnbddG2OcmIgRNuQwx5OhlwZ1CWcOheg3hUobsEcq0,11320
|
|
82
|
+
basic_memory/mcp/tools/project_management.py,sha256=XtZTFWi7--ku6yUR_vwHQx2Ka3vz3pCcWMhVa_y4CQs,12162
|
|
83
|
+
basic_memory/mcp/tools/read_content.py,sha256=4FTw13B8UjVVhR78NJB9HKeJb_nA6-BGT1WdGtekN5Q,8596
|
|
84
|
+
basic_memory/mcp/tools/read_note.py,sha256=GdsJLkcDrCBnmNeM9BZRx9Xs2LUqH5ty_E471T9Kf1Y,7493
|
|
85
|
+
basic_memory/mcp/tools/recent_activity.py,sha256=XVjNJAJnmxvzx9_Ls1A-QOd2yTR7pJlSTTuRxSivmN4,4833
|
|
86
|
+
basic_memory/mcp/tools/search.py,sha256=22sLHed6z53mH9NQqBv37Xi4d6AtOTyrUvKs2Mycijk,11296
|
|
87
|
+
basic_memory/mcp/tools/sync_status.py,sha256=mt0DdcaAlyiKW4NK4gy6psajSqcez0bOm_4MzG1NOdg,10486
|
|
88
|
+
basic_memory/mcp/tools/utils.py,sha256=wsfrgiBScacMilODu85AXbUUKA5fJi4_6phDIC9dQRs,19702
|
|
89
|
+
basic_memory/mcp/tools/view_note.py,sha256=ddNXxyETsdA5SYflIaQVj_Cbd7I7CLVs3atRRDMbGmg,2499
|
|
90
|
+
basic_memory/mcp/tools/write_note.py,sha256=TW_7-4QfX8GYZ-FU_iSSYAm1lucE7NeOcpZUypRXKOk,5912
|
|
91
|
+
basic_memory/models/__init__.py,sha256=j0C4dtFi-FOEaQKR8dQWEG-dJtdQ15NBTiJg4nbIXNU,333
|
|
92
|
+
basic_memory/models/base.py,sha256=4hAXJ8CE1RnjKhb23lPd-QM7G_FXIdTowMJ9bRixspU,225
|
|
93
|
+
basic_memory/models/knowledge.py,sha256=AFxfKS8fRa43Kq3EjJCAufpte4VNC7fs9YfshDrB4o0,7087
|
|
94
|
+
basic_memory/models/project.py,sha256=oUrQaUOu7_muSl-i38Dh0HzmCFrMAtwgxALDUTt9k5c,2773
|
|
95
|
+
basic_memory/models/search.py,sha256=PhQ8w4taApSvjh1DpPhB4cH9GTt2E2po-DFZzhnoZkY,1300
|
|
96
|
+
basic_memory/repository/__init__.py,sha256=MWK-o8QikqzOpe5SyPbKQ2ioB5BWA0Upz65tgg-E0DU,327
|
|
97
|
+
basic_memory/repository/entity_repository.py,sha256=larjP7r6Sc7YyPD1BloC_m96McYsjHTf6doUQy3gSY4,3776
|
|
98
|
+
basic_memory/repository/observation_repository.py,sha256=qhMvHLSjaoT3Fa_cQOKsT5jYPj66GXSytEBMwLAgygQ,2943
|
|
99
|
+
basic_memory/repository/project_info_repository.py,sha256=8XLVAYKkBWQ6GbKj1iqA9OK0FGPHdTlOs7ZtfeUf9t8,338
|
|
100
|
+
basic_memory/repository/project_repository.py,sha256=sgdKxKTSiiOZTzABwUNqli7K5mbXiPiQEAc5r0RD_jQ,3159
|
|
101
|
+
basic_memory/repository/relation_repository.py,sha256=z7Oo5Zz_J-Bj6RvQDpSWR73ZLk2fxG7e7jrMbeFeJvQ,3179
|
|
102
|
+
basic_memory/repository/repository.py,sha256=MJb-cb8QZQbL-Grq_iqv4Kq75aX2yQohLIqh5T4fFxw,15224
|
|
103
|
+
basic_memory/repository/search_repository.py,sha256=CdALAsROY6W_rE1UB8Bn55ZdMv4DOmNOtShoXCwPI_Q,17897
|
|
104
|
+
basic_memory/schemas/__init__.py,sha256=mEgIFcdTeb-v4y0gkOh_pA5zyqGbZk-9XbXqlSi6WMs,1674
|
|
105
|
+
basic_memory/schemas/base.py,sha256=Fx97DEqzOr7y9zeeseO9qVBYbOft_4OQf9EiVfhOJn4,6738
|
|
106
|
+
basic_memory/schemas/delete.py,sha256=UAR2JK99WMj3gP-yoGWlHD3eZEkvlTSRf8QoYIE-Wfw,1180
|
|
107
|
+
basic_memory/schemas/directory.py,sha256=F9_LrJqRqb_kO08GDKJzXLb2nhbYG2PdVUo5eDD_Kf4,881
|
|
108
|
+
basic_memory/schemas/importer.py,sha256=FAh-RGxuhFW2rz3HFxwLzENJOiGgbTR2hUeXZZpM3OA,663
|
|
109
|
+
basic_memory/schemas/memory.py,sha256=6YjEyJ9GJLC4VrFD0EnoRDTfg-Sf6g0D4bhL9rwNBi4,5816
|
|
110
|
+
basic_memory/schemas/project_info.py,sha256=cHXgp9k4RbgolIpCIEcrb-RR9m7WL72KFGwknig4H-E,6884
|
|
111
|
+
basic_memory/schemas/prompt.py,sha256=SpIVfZprQT8E5uP40j3CpBc2nHKflwOo3iZD7BFPIHE,3648
|
|
112
|
+
basic_memory/schemas/request.py,sha256=Mv5EvrLZlFIiPr8dOjo_4QXvkseYhQI7cd_X2zDsxQM,3760
|
|
113
|
+
basic_memory/schemas/response.py,sha256=lVYR31DTtSeFRddGWX_wQWnQgyiwX0LEpNJ4f4lKpTM,6440
|
|
114
|
+
basic_memory/schemas/search.py,sha256=ywMsDGAQK2sO2TT5lc-da_k67OKW1x1TenXormHHWv4,3657
|
|
115
|
+
basic_memory/services/__init__.py,sha256=XGt8WX3fX_0K9L37Msy8HF8nlMZYIG3uQ6mUX6_iJtg,259
|
|
116
|
+
basic_memory/services/context_service.py,sha256=4ReLAF5qifA9ayOePGsVKusw1TWj8oBzRECjrsFiKPI,14462
|
|
117
|
+
basic_memory/services/directory_service.py,sha256=_YOPXseQM4knd7PIFAho9LV_E-FljVE5WVJKQ0uflZs,6017
|
|
118
|
+
basic_memory/services/entity_service.py,sha256=KemsDkKkA7KItVtfsdAlYaGyOR8ryZQCu_O9GhkJucc,30103
|
|
119
|
+
basic_memory/services/exceptions.py,sha256=oVjQr50XQqnFq1-MNKBilI2ShtHDxypavyDk1UeyHhw,390
|
|
120
|
+
basic_memory/services/file_service.py,sha256=jCrmnEkTQ4t9HF7L_M6BL7tdDqjjzty9hpTo9AzwhvM,10059
|
|
121
|
+
basic_memory/services/initialization.py,sha256=6ZeuTInPksyre4pjmiK_GXi5o_mJk3mfqGGH6apHxko,9271
|
|
122
|
+
basic_memory/services/link_resolver.py,sha256=1-_VFsvqdT5rVBHe8Jrq63U59XQ0hxGezxY8c24Tiow,4594
|
|
123
|
+
basic_memory/services/migration_service.py,sha256=pFJCSD7UgHLx1CHvtN4Df1CzDEp-CZ9Vqx4XYn1m1M0,6096
|
|
124
|
+
basic_memory/services/project_service.py,sha256=nWnrlnjISqtGP6ui1BR8rSTNFzwExW8u7mRYPtWJLok,26856
|
|
125
|
+
basic_memory/services/search_service.py,sha256=c5Ky0ufz7YPFgHhVzNRQ4OecF_JUrt7nALzpMjobW4M,12782
|
|
126
|
+
basic_memory/services/service.py,sha256=V-d_8gOV07zGIQDpL-Ksqs3ZN9l3qf3HZOK1f_YNTag,336
|
|
127
|
+
basic_memory/services/sync_status_service.py,sha256=PRAnYrsNJY8EIlxaxCrDsY0TjySDdhktjta8ReQZyiY,6838
|
|
128
|
+
basic_memory/sync/__init__.py,sha256=CVHguYH457h2u2xoM8KvOilJC71XJlZ-qUh8lHcjYj4,156
|
|
129
|
+
basic_memory/sync/background_sync.py,sha256=4CEx8oP6-qD33uCeowhpzhA8wivmWxaCmSBP37h3Fs8,714
|
|
130
|
+
basic_memory/sync/sync_service.py,sha256=AxC5J1YTcPWTmA0HdzvOZBthi4-_LZ44kNF0KQoDRPw,23387
|
|
131
|
+
basic_memory/sync/watch_service.py,sha256=JAumrHUjV1lF9NtEK32jgg0myWBfLXotNXxONeIV9SM,15316
|
|
132
|
+
basic_memory/templates/prompts/continue_conversation.hbs,sha256=begMFHOPN3aCm5sHz5PlKMLOfZ8hlpFxFJ-hgy0T9K4,3075
|
|
133
|
+
basic_memory/templates/prompts/search.hbs,sha256=H1cCIsHKp4VC1GrH2KeUB8pGe5vXFPqb2VPotypmeCA,3098
|
|
134
|
+
basic_memory-0.13.0.dist-info/METADATA,sha256=hvtOwa0rvLUjYZwglCGmi2Df39qSQpZIadCZzX_jQpM,15469
|
|
135
|
+
basic_memory-0.13.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
136
|
+
basic_memory-0.13.0.dist-info/entry_points.txt,sha256=wvE2mRF6-Pg4weIYcfQ-86NOLZD4WJg7F7TIsRVFLb8,90
|
|
137
|
+
basic_memory-0.13.0.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
|
|
138
|
+
basic_memory-0.13.0.dist-info/RECORD,,
|