basic-memory 0.11.0__py3-none-any.whl → 0.12.1__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.

Files changed (35) hide show
  1. basic_memory/__init__.py +1 -1
  2. basic_memory/api/app.py +11 -3
  3. basic_memory/cli/app.py +12 -7
  4. basic_memory/cli/commands/mcp.py +18 -9
  5. basic_memory/cli/commands/sync.py +9 -8
  6. basic_memory/cli/commands/tool.py +28 -15
  7. basic_memory/cli/main.py +12 -44
  8. basic_memory/config.py +30 -6
  9. basic_memory/db.py +3 -1
  10. basic_memory/file_utils.py +3 -0
  11. basic_memory/markdown/entity_parser.py +16 -7
  12. basic_memory/markdown/utils.py +21 -13
  13. basic_memory/mcp/prompts/continue_conversation.py +4 -4
  14. basic_memory/mcp/prompts/search.py +2 -2
  15. basic_memory/mcp/server.py +29 -3
  16. basic_memory/mcp/tools/read_note.py +2 -3
  17. basic_memory/mcp/tools/search.py +64 -28
  18. basic_memory/mcp/tools/write_note.py +3 -1
  19. basic_memory/repository/repository.py +0 -4
  20. basic_memory/repository/search_repository.py +11 -11
  21. basic_memory/schemas/search.py +2 -2
  22. basic_memory/services/context_service.py +1 -1
  23. basic_memory/services/entity_service.py +10 -10
  24. basic_memory/services/file_service.py +1 -1
  25. basic_memory/services/initialization.py +143 -0
  26. basic_memory/services/link_resolver.py +8 -1
  27. basic_memory/services/search_service.py +3 -23
  28. basic_memory/sync/sync_service.py +120 -191
  29. basic_memory/sync/watch_service.py +49 -30
  30. basic_memory/utils.py +10 -2
  31. {basic_memory-0.11.0.dist-info → basic_memory-0.12.1.dist-info}/METADATA +42 -11
  32. {basic_memory-0.11.0.dist-info → basic_memory-0.12.1.dist-info}/RECORD +35 -34
  33. {basic_memory-0.11.0.dist-info → basic_memory-0.12.1.dist-info}/WHEEL +0 -0
  34. {basic_memory-0.11.0.dist-info → basic_memory-0.12.1.dist-info}/entry_points.txt +0 -0
  35. {basic_memory-0.11.0.dist-info → basic_memory-0.12.1.dist-info}/licenses/LICENSE +0 -0
@@ -70,22 +70,30 @@ class WatchServiceState(BaseModel):
70
70
 
71
71
 
72
72
  class WatchService:
73
- def __init__(self, sync_service: SyncService, file_service: FileService, config: ProjectConfig):
73
+ def __init__(
74
+ self,
75
+ sync_service: SyncService,
76
+ file_service: FileService,
77
+ config: ProjectConfig,
78
+ quiet: bool = False,
79
+ ):
74
80
  self.sync_service = sync_service
75
81
  self.file_service = file_service
76
82
  self.config = config
77
83
  self.state = WatchServiceState()
78
84
  self.status_path = config.home / ".basic-memory" / WATCH_STATUS_JSON
79
85
  self.status_path.parent.mkdir(parents=True, exist_ok=True)
80
- self.console = Console()
86
+
87
+ # quiet mode for mcp so it doesn't mess up stdout
88
+ self.console = Console(quiet=quiet)
81
89
 
82
90
  async def run(self): # pragma: no cover
83
91
  """Watch for file changes and sync them"""
84
92
  logger.info(
85
93
  "Watch service started",
86
- directory=str(self.config.home),
87
- debounce_ms=self.config.sync_delay,
88
- pid=os.getpid(),
94
+ f"directory={str(self.config.home)}",
95
+ f"debounce_ms={self.config.sync_delay}",
96
+ f"pid={os.getpid()}",
89
97
  )
90
98
 
91
99
  self.state.running = True
@@ -111,8 +119,8 @@ class WatchService:
111
119
  finally:
112
120
  logger.info(
113
121
  "Watch service stopped",
114
- directory=str(self.config.home),
115
- runtime_seconds=int((datetime.now() - self.state.start_time).total_seconds()),
122
+ f"directory={str(self.config.home)}",
123
+ f"runtime_seconds={int((datetime.now() - self.state.start_time).total_seconds())}",
116
124
  )
117
125
 
118
126
  self.state.running = False
@@ -154,7 +162,7 @@ class WatchService:
154
162
 
155
163
  start_time = time.time()
156
164
 
157
- logger.info("Processing file changes", change_count=len(changes), directory=str(directory))
165
+ logger.info(f"Processing file changes, change_count={len(changes)}, directory={directory}")
158
166
 
159
167
  # Group changes by type
160
168
  adds: List[str] = []
@@ -177,9 +185,17 @@ class WatchService:
177
185
  modifies.append(relative_path)
178
186
 
179
187
  logger.debug(
180
- "Grouped file changes", added=len(adds), deleted=len(deletes), modified=len(modifies)
188
+ f"Grouped file changes, added={len(adds)}, deleted={len(deletes)}, modified={len(modifies)}"
181
189
  )
182
190
 
191
+ # because of our atomic writes on updates, an add may be an existing file
192
+ for added_path in adds: # pragma: no cover TODO add test
193
+ entity = await self.sync_service.entity_repository.get_by_file_path(added_path)
194
+ if entity is not None:
195
+ logger.debug(f"Existing file will be processed as modified, path={added_path}")
196
+ adds.remove(added_path)
197
+ modifies.append(added_path)
198
+
183
199
  # Track processed files to avoid duplicates
184
200
  processed: Set[str] = set()
185
201
 
@@ -223,15 +239,16 @@ class WatchService:
223
239
  status="success",
224
240
  )
225
241
  self.console.print(f"[blue]→[/blue] {deleted_path} → {added_path}")
242
+ logger.info(f"move: {deleted_path} -> {added_path}")
226
243
  processed.add(added_path)
227
244
  processed.add(deleted_path)
228
245
  break
229
246
  except Exception as e: # pragma: no cover
230
247
  logger.warning(
231
248
  "Error checking for move",
232
- old_path=deleted_path,
233
- new_path=added_path,
234
- error=str(e),
249
+ f"old_path={deleted_path}",
250
+ f"new_path={added_path}",
251
+ f"error={str(e)}",
235
252
  )
236
253
 
237
254
  # Handle remaining changes - group them by type for concise output
@@ -247,6 +264,7 @@ class WatchService:
247
264
  await self.sync_service.handle_delete(path)
248
265
  self.state.add_event(path=path, action="deleted", status="success")
249
266
  self.console.print(f"[red]✕[/red] {path}")
267
+ logger.info(f"deleted: {path}")
250
268
  processed.add(path)
251
269
  delete_count += 1
252
270
 
@@ -257,28 +275,27 @@ class WatchService:
257
275
  full_path = directory / path
258
276
  if not full_path.exists() or full_path.is_dir():
259
277
  logger.debug(
260
- "Skipping non-existent or directory path", path=path
278
+ f"Skipping non-existent or directory path, path={path}"
261
279
  ) # pragma: no cover
262
280
  processed.add(path) # pragma: no cover
263
281
  continue # pragma: no cover
264
282
 
265
- logger.debug("Processing new file", path=path)
283
+ logger.debug(f"Processing new file, path={path}")
266
284
  entity, checksum = await self.sync_service.sync_file(path, new=True)
267
285
  if checksum:
268
286
  self.state.add_event(
269
287
  path=path, action="new", status="success", checksum=checksum
270
288
  )
271
289
  self.console.print(f"[green]✓[/green] {path}")
272
- logger.debug(
273
- "Added file processed",
274
- path=path,
275
- entity_id=entity.id if entity else None,
276
- checksum=checksum,
290
+ logger.info(
291
+ "new file processed",
292
+ f"path={path}",
293
+ f"checksum={checksum}",
277
294
  )
278
295
  processed.add(path)
279
296
  add_count += 1
280
297
  else: # pragma: no cover
281
- logger.warning("Error syncing new file", path=path) # pragma: no cover
298
+ logger.warning(f"Error syncing new file, path={path}") # pragma: no cover
282
299
  self.console.print(
283
300
  f"[orange]?[/orange] Error syncing: {path}"
284
301
  ) # pragma: no cover
@@ -296,7 +313,7 @@ class WatchService:
296
313
  processed.add(path)
297
314
  continue
298
315
 
299
- logger.debug("Processing modified file", path=path)
316
+ logger.debug(f"Processing modified file: path={path}")
300
317
  entity, checksum = await self.sync_service.sync_file(path, new=False)
301
318
  self.state.add_event(
302
319
  path=path, action="modified", status="success", checksum=checksum
@@ -311,17 +328,18 @@ class WatchService:
311
328
  f"[yellow]...[/yellow] Repeated changes to {path}"
312
329
  ) # pragma: no cover
313
330
  else:
314
- # New file being modified
331
+ # haven't processed this file
315
332
  self.console.print(f"[yellow]✎[/yellow] {path}")
333
+ logger.info(f"modified: {path}")
316
334
  last_modified_path = path
317
335
  repeat_count = 0
318
336
  modify_count += 1
319
337
 
320
338
  logger.debug(
321
- "Modified file processed",
322
- path=path,
323
- entity_id=entity.id if entity else None,
324
- checksum=checksum,
339
+ "Modified file processed, "
340
+ f"path={path} "
341
+ f"entity_id={entity.id if entity else None} "
342
+ f"checksum={checksum}",
325
343
  )
326
344
  processed.add(path)
327
345
 
@@ -339,16 +357,17 @@ class WatchService:
339
357
 
340
358
  if changes:
341
359
  self.console.print(f"{', '.join(changes)}", style="dim") # pyright: ignore
360
+ logger.info(f"changes: {len(changes)}")
342
361
 
343
362
  duration_ms = int((time.time() - start_time) * 1000)
344
363
  self.state.last_scan = datetime.now()
345
364
  self.state.synced_files += len(processed)
346
365
 
347
366
  logger.info(
348
- "File change processing completed",
349
- processed_files=len(processed),
350
- total_synced_files=self.state.synced_files,
351
- duration_ms=duration_ms,
367
+ "File change processing completed, "
368
+ f"processed_files={len(processed)}, "
369
+ f"total_synced_files={self.state.synced_files}, "
370
+ f"duration_ms={duration_ms}"
352
371
  )
353
372
 
354
373
  await self.write_status()
basic_memory/utils.py CHANGED
@@ -138,15 +138,23 @@ def parse_tags(tags: Union[List[str], str, None]) -> List[str]:
138
138
 
139
139
  Returns:
140
140
  A list of tag strings, or an empty list if no tags
141
+
142
+ Note:
143
+ This function strips leading '#' characters from tags to prevent
144
+ their accumulation when tags are processed multiple times.
141
145
  """
142
146
  if tags is None:
143
147
  return []
144
148
 
149
+ # Process list of tags
145
150
  if isinstance(tags, list):
146
- return tags
151
+ # First strip whitespace, then strip leading '#' characters to prevent accumulation
152
+ return [tag.strip().lstrip("#") for tag in tags if tag and tag.strip()]
147
153
 
154
+ # Process comma-separated string of tags
148
155
  if isinstance(tags, str):
149
- return [tag.strip() for tag in tags.split(",") if tag.strip()]
156
+ # Split by comma, strip whitespace, then strip leading '#' characters
157
+ return [tag.strip().lstrip("#") for tag in tags.split(",") if tag and tag.strip()]
150
158
 
151
159
  # For any other type, try to convert to string and parse
152
160
  try: # pragma: no cover
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: basic-memory
3
- Version: 0.11.0
3
+ Version: 0.12.1
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
@@ -47,8 +47,8 @@ Basic Memory lets you build persistent knowledge through natural conversations w
47
47
  Claude, while keeping everything in simple Markdown files on your computer. It uses the Model Context Protocol (MCP) to
48
48
  enable any compatible LLM to read and write to your local knowledge base.
49
49
 
50
- - Website: http://basicmachines.co
51
- - Documentation: http://memory.basicmachines.co
50
+ - Website: https://basicmachines.co
51
+ - Documentation: https://memory.basicmachines.co
52
52
 
53
53
  ## Pick up your conversation right where you left off
54
54
 
@@ -187,7 +187,7 @@ The note embeds semantic content and links to other topics via simple Markdown f
187
187
 
188
188
  3. You see this file on your computer in real time in the current project directory (default `~/$HOME/basic-memory`).
189
189
 
190
- - Realtime sync can be enabled via running `basic-memory sync --watch`
190
+ - Realtime sync is enabled by default with the v0.12.0 version
191
191
 
192
192
  4. In a chat with the LLM, you can reference a topic:
193
193
 
@@ -296,6 +296,43 @@ Examples of relations:
296
296
  - documented_in [[Coffee Journal]]
297
297
  ```
298
298
 
299
+ ## Using with VS Code
300
+ For one-click installation, click one of the install buttons below...
301
+
302
+ [![Install with UV in VS Code](https://img.shields.io/badge/VS_Code-UV-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://insiders.vscode.dev/redirect/mcp/install?name=basic-memory&config=%7B%22command%22%3A%22uvx%22%2C%22args%22%3A%5B%22basic-memory%22%2C%22mcp%22%5D%7D) [![Install with UV in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-UV-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://insiders.vscode.dev/redirect/mcp/install?name=basic-memory&config=%7B%22command%22%3A%22uvx%22%2C%22args%22%3A%5B%22basic-memory%22%2C%22mcp%22%5D%7D&quality=insiders)
303
+
304
+ You can use Basic Memory with VS Code to easily retrieve and store information while coding. Click the installation buttons above for one-click setup, or follow the manual installation instructions below.
305
+
306
+ ### Manual Installation
307
+
308
+ Add the following JSON block to your User Settings (JSON) file in VS Code. You can do this by pressing `Ctrl + Shift + P` and typing `Preferences: Open User Settings (JSON)`.
309
+
310
+ ```json
311
+ {
312
+ "mcp": {
313
+ "servers": {
314
+ "basic-memory": {
315
+ "command": "uvx",
316
+ "args": ["basic-memory", "mcp"]
317
+ }
318
+ }
319
+ }
320
+ }
321
+ ```
322
+
323
+ Optionally, you can add it to a file called `.vscode/mcp.json` in your workspace. This will allow you to share the configuration with others.
324
+
325
+ ```json
326
+ {
327
+ "servers": {
328
+ "basic-memory": {
329
+ "command": "uvx",
330
+ "args": ["basic-memory", "mcp"]
331
+ }
332
+ }
333
+ }
334
+ ```
335
+
299
336
  ## Using with Claude Desktop
300
337
 
301
338
  Basic Memory is built using the MCP (Model Context Protocol) and works with the Claude desktop app (https://claude.ai/):
@@ -341,13 +378,7 @@ config:
341
378
 
342
379
  2. Sync your knowledge:
343
380
 
344
- ```bash
345
- # One-time sync of local knowledge updates
346
- basic-memory sync
347
-
348
- # Run realtime sync process (recommended)
349
- basic-memory sync --watch
350
- ```
381
+ Basic Memory will sync the files in your project in real time if you make manual edits.
351
382
 
352
383
  3. In Claude Desktop, the LLM can now use these tools:
353
384
 
@@ -1,9 +1,9 @@
1
- basic_memory/__init__.py,sha256=06l2-O3MzDid6DzYEdAOjAn3OLuVGdUYBo17g6ZALWQ,123
2
- basic_memory/config.py,sha256=3lwRFYA1e2dk5JIRNvnuVVIAGT3UXI4FUjN-CEHpJy8,8432
3
- basic_memory/db.py,sha256=UDWBr52u7oBT4aXputhAG_Prmsv5og00sYVzPmaylhk,6026
1
+ basic_memory/__init__.py,sha256=45SW0xM0KuIkvy6KfeAwERAglEya26oqmJ0WvHoG_gA,123
2
+ basic_memory/config.py,sha256=jZmBOj4Gl2l56pApiN88s6juPDaX1g2LcvuVUnUeG0Q,9203
3
+ basic_memory/db.py,sha256=8SmrmNAlJlmYT9yIJiPwNq8SN8mB2rbW5t33Rqpyl2I,6052
4
4
  basic_memory/deps.py,sha256=yI6RL_5-8LXw7ywSJ_84BXAczDtv2h9GFLw-E9XDJFg,5770
5
- basic_memory/file_utils.py,sha256=csvij8o_j14A-rr8NTDeH6pUaI4DdBqNAWJIVc5r4A0,6658
6
- basic_memory/utils.py,sha256=0EfSx_PiTtFkWIDN2wic9nTPIH35B4fddT-GWi8aVsk,4553
5
+ basic_memory/file_utils.py,sha256=eaxTKLLEbTIy_Mb_Iv_Dmt4IXAJSrZGVi-Knrpyci3E,6700
6
+ basic_memory/utils.py,sha256=2dbUbChLn5gwQgPY-m5XKYOBbeKFEwnRUrZDsm2kGIE,5026
7
7
  basic_memory/alembic/alembic.ini,sha256=IEZsnF8CbbZnkwBr67LzKKNobHuzTaQNUvM8Psop5xc,3733
8
8
  basic_memory/alembic/env.py,sha256=GyQpEpQu84flqAdelxR0-H9nbkHrVoCboYGfmltBDoA,2737
9
9
  basic_memory/alembic/migrations.py,sha256=lriHPXDdBLSNXEW3QTpU0SJKuVd1V-8NrVkpN3qfsUQ,718
@@ -13,7 +13,7 @@ basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink
13
13
  basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py,sha256=RsGymQzfRXV1LSNKiyi0lMilTxW1NgwS9jR67ye2apI,1428
14
14
  basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py,sha256=Lbo3dEzdId_vKRFe3jMkGFF3dNQpblPIQa4Bh7np-zA,4020
15
15
  basic_memory/api/__init__.py,sha256=wCpj-21j1D0KzKl9Ql6unLBVFY0K1uGp_FeSZRKtqpk,72
16
- basic_memory/api/app.py,sha256=NLcNpfNzVz4pgtbjaZUHTvRCqay16J_G4K1ok9DMDCU,1516
16
+ basic_memory/api/app.py,sha256=GFFX3MOusEzbDaAVDECk3B46xybuinUfMt4Atw0Nr8c,1724
17
17
  basic_memory/api/routers/__init__.py,sha256=SKuL-weA58hYj0NOMCQRfmsaumlNjjyVHDXNpRO38bQ,305
18
18
  basic_memory/api/routers/knowledge_router.py,sha256=iYuBguMb6ERitAwoelSejBYJqLTGfjpkzAHrqwTKjVE,5876
19
19
  basic_memory/api/routers/memory_router.py,sha256=W_uHJe2c4XN96mFj6XNvUH6INVbl1BMxy0KUchLcbxU,5421
@@ -21,34 +21,34 @@ basic_memory/api/routers/project_info_router.py,sha256=Qv12_QL3SRpo7bPcpAjizJmkZ
21
21
  basic_memory/api/routers/resource_router.py,sha256=WEJEqEaY_yTKj5-U-rW4kXQKUcJflykgwI6_g_R41ck,8058
22
22
  basic_memory/api/routers/search_router.py,sha256=R_a5OF5_8rCjmoOMhmw3M4VLCy6I1KLGJ-otSLB0rbI,1953
23
23
  basic_memory/cli/__init__.py,sha256=arcKLAWRDhPD7x5t80MlviZeYzwHZ0GZigyy3NKVoGk,33
24
- basic_memory/cli/app.py,sha256=J4mkWnxbevOYmJwwRMx344olGOxoXq0o4RNG6DMQLKE,1804
25
- basic_memory/cli/main.py,sha256=9uwxOUc4mDeTeZCEWyJh7X5PzPXG1fva2veV2OPbFtg,1442
24
+ basic_memory/cli/app.py,sha256=hFRYznTSI58t6FEDUwF_PUgKZF0V63sCHzBDDb5FOAk,2142
25
+ basic_memory/cli/main.py,sha256=WhYOCKliF48DLDOukOg3QPiD16IP3AJfhdCIe7Wlh2g,666
26
26
  basic_memory/cli/commands/__init__.py,sha256=3oojcC-Y-4RPqff9vtwWziT_T4uvBVicL0pSHNilVkU,393
27
27
  basic_memory/cli/commands/db.py,sha256=-jgVH2fs_s1vvBNJx_FWspQVHv0F6Qd7V5ZPxtYn_jQ,1125
28
28
  basic_memory/cli/commands/import_chatgpt.py,sha256=M4_oUN9o_BaW5jpKQu2pTEybivB5ccVolhdZzmhLOsI,8162
29
29
  basic_memory/cli/commands/import_claude_conversations.py,sha256=D_4-0xFKkZka7xFvvW8OkgjLv3TFqsC_VuB2Z-Y3avU,6827
30
30
  basic_memory/cli/commands/import_claude_projects.py,sha256=KzUuf3wrlvJlqTWCzoLRrNxD3OYNteRXaTFj5IB1FA8,6649
31
31
  basic_memory/cli/commands/import_memory_json.py,sha256=zqpU4eCzQXx04aRsigddJAyhvklmTgSAzeRTuEdNw0c,5194
32
- basic_memory/cli/commands/mcp.py,sha256=ue_zDA8w0zZZToHLvu56s8hWkalgZsC64CfTyXX6z2I,715
32
+ basic_memory/cli/commands/mcp.py,sha256=sWwRLRbY_FYUNxoy1a8risypnjS9YvZbnP3IjijiUZ0,1025
33
33
  basic_memory/cli/commands/project.py,sha256=BSjdz07xDM3R4CUXggv1qhrWLJsEgvGFir6aOUzdr2Q,11330
34
34
  basic_memory/cli/commands/status.py,sha256=nbs3myxaNtehEEJ4BBngPuKs-vqZTHNCCb0bTgDsE-s,5277
35
- basic_memory/cli/commands/sync.py,sha256=JxGJA6b7Qksz0ZKonHfB3s--7qzY7eWeLogPX8tR1pY,8351
36
- basic_memory/cli/commands/tool.py,sha256=0YFWEmaKZ--1SsNjs_Q3hBsg94CMiyqVc3S8gUmxJNo,9101
35
+ basic_memory/cli/commands/sync.py,sha256=3jwgabxkF4WyFZ-gRC1l8A8p8Z_aYrzHRXOtUfYy2yc,8324
36
+ basic_memory/cli/commands/tool.py,sha256=7wte1TqjG__NcC7BB0BRLl8THB3t5eAngud0zVHBQ8k,9506
37
37
  basic_memory/markdown/__init__.py,sha256=DdzioCWtDnKaq05BHYLgL_78FawEHLpLXnp-kPSVfIc,501
38
- basic_memory/markdown/entity_parser.py,sha256=Pc6hTm9TB5SRW_ghf7WD-UMjEgOPyc8j8tgCtxEWfLQ,3893
38
+ basic_memory/markdown/entity_parser.py,sha256=I4K1Uq8kLYBmShIZQuXI9FuQjzpoV924-jDH9dIiYb8,4420
39
39
  basic_memory/markdown/markdown_processor.py,sha256=S5ny69zu2dlqO7tWJoLrpLSzg8emQIDq7Du7olpJUsk,4968
40
40
  basic_memory/markdown/plugins.py,sha256=gtIzKRjoZsyvBqLpVNnrmzl_cbTZ5ZGn8kcuXxQjRko,6639
41
41
  basic_memory/markdown/schemas.py,sha256=eyxYCr1hVyWmImcle0asE5It_DD6ARkqaBZYu1KK5n4,1896
42
- basic_memory/markdown/utils.py,sha256=zlHlUtrnXaUCnsaPNJzR0wlhg2kB1YbXx0DMvs-snJM,2973
42
+ basic_memory/markdown/utils.py,sha256=wr7KnDMThgnztkOoqSG_ANPhwNBoPkyjYP1sA1Wnxe4,3270
43
43
  basic_memory/mcp/__init__.py,sha256=dsDOhKqjYeIbCULbHIxfcItTbqudEuEg1Np86eq0GEQ,35
44
44
  basic_memory/mcp/async_client.py,sha256=Eo345wANiBRSM4u3j_Vd6Ax4YtMg7qbWd9PIoFfj61I,236
45
45
  basic_memory/mcp/main.py,sha256=0kbcyf1PxRC1bLnHv2zzParfJ6cOq7Am9ScF9UoI50U,703
46
- basic_memory/mcp/server.py,sha256=VGv0uWma6JGkT6Y_GESYGhGMYfPavkhEKlCNza8bvtY,287
46
+ basic_memory/mcp/server.py,sha256=RgNIyRUsuBgoCntj_5Dn2_QNTBYQ1tjFSEn-Z1PoFzU,1099
47
47
  basic_memory/mcp/prompts/__init__.py,sha256=-Bl9Dgj2TD9PULjzggPqXuvPEjWCRy7S9Yg03h2-U7A,615
48
48
  basic_memory/mcp/prompts/ai_assistant_guide.py,sha256=8TI5xObiRVcwv6w9by1xQHlX0whvyE7-LGsiqDMRTFg,821
49
- basic_memory/mcp/prompts/continue_conversation.py,sha256=0AN44p8eF9l3VbtFX8RToSuHwnGYAkKYTZCgWpbbHX0,4442
49
+ basic_memory/mcp/prompts/continue_conversation.py,sha256=I1FdNXIsSBKsu2ABj8TRRr-mdZKZ1K8LMCUfAik5Iqs,4424
50
50
  basic_memory/mcp/prompts/recent_activity.py,sha256=7607MWiGJWY0vPurhVII17LxLZlXY_zmH3xH9LfT6SY,2793
51
- basic_memory/mcp/prompts/search.py,sha256=wokpuP4uN-N2YVN3VTyIjBG8Uu_HkjYSaln7i4dvfDw,6307
51
+ basic_memory/mcp/prompts/search.py,sha256=Z4eb1HFb46p9Ezz9nDLsqedePDQtxWafmpcnR_NZUtA,6282
52
52
  basic_memory/mcp/prompts/utils.py,sha256=u_bG8DMtMMERvGPJfA3gbl5VAs0xmkuK8ZJBkY8xyV8,5371
53
53
  basic_memory/mcp/resources/ai_assistant_guide.md,sha256=qnYWDkYlb-JmKuOoZ5llmRas_t4dWDXB_i8LE277Lgs,14777
54
54
  basic_memory/mcp/tools/__init__.py,sha256=prvB6M150ba8WT-v-tmo4Yfu4JG-0yCi6nfK4SsL7XI,882
@@ -57,11 +57,11 @@ basic_memory/mcp/tools/canvas.py,sha256=fHC90eshnSSmROTBV-tBB-FSuXSpYVj_BcDrc96p
57
57
  basic_memory/mcp/tools/delete_note.py,sha256=mnrgOv-D7f6nsgZIAK0Wvyn0dbkwCg8adW_xJd7jwc0,829
58
58
  basic_memory/mcp/tools/project_info.py,sha256=pyoHpOMhjMIvZFku2iEIpXc2XDtbnNeb-OMrJlYR9LU,1710
59
59
  basic_memory/mcp/tools/read_content.py,sha256=PKnvLzNmHfzoIxRKXNaYW5P5q0d1azVwG9juPXPYeQo,8148
60
- basic_memory/mcp/tools/read_note.py,sha256=1i1iaCBpGEhkHwOCn83zkil72tdKSCN_Ndt_HVcnTAw,6487
60
+ basic_memory/mcp/tools/read_note.py,sha256=e9un3pKPiIgUzY5x-aFYxBkgQMDwrLAYMMqmDzgq0FQ,6451
61
61
  basic_memory/mcp/tools/recent_activity.py,sha256=S0LgIk9RaeYzIsi2FIHs0KK7R1K-LJy3QaSokGlY9ew,3501
62
- basic_memory/mcp/tools/search.py,sha256=96mc8KTo23Olz918S9C2u4UOWD5QAo-koGfuWBqDVjQ,3032
62
+ basic_memory/mcp/tools/search.py,sha256=TU9Q89rv9lCUmAWjxcc-J_jFQE8CAQM0lM_b-J8VLRc,3786
63
63
  basic_memory/mcp/tools/utils.py,sha256=tOWklfSlDcoAJCRBmxkCVwkTY_TDBa5vOGxzU8J5eiQ,13636
64
- basic_memory/mcp/tools/write_note.py,sha256=Z2z92pHb74-uLzahY2Cz5Kj8kGikS4VSWPZ1I1rGy1U,4942
64
+ basic_memory/mcp/tools/write_note.py,sha256=d7vb8vqwLmDJfSOYV_ZWJlbJD9tZyKvLlb7LTMgPXSM,4990
65
65
  basic_memory/models/__init__.py,sha256=Bf0xXV_ryndogvZDiVM_Wb6iV2fHUxYNGMZNWNcZi0s,307
66
66
  basic_memory/models/base.py,sha256=4hAXJ8CE1RnjKhb23lPd-QM7G_FXIdTowMJ9bRixspU,225
67
67
  basic_memory/models/knowledge.py,sha256=lbKd8VOOVPqXtIhNMY30bIokoQutFjLpHwLD5At90MY,6644
@@ -71,8 +71,8 @@ basic_memory/repository/entity_repository.py,sha256=VLKlQ97-_HhSqc-st_YToWUNE4pJ
71
71
  basic_memory/repository/observation_repository.py,sha256=BOcy4wARqCXu-thYyt7mPxt2A2C8TW0le3s_X9wrK6I,1701
72
72
  basic_memory/repository/project_info_repository.py,sha256=nHWzs0WBQ366WfzIYZgnAfU6tyQ_8slEszWNlDSeIlo,336
73
73
  basic_memory/repository/relation_repository.py,sha256=DwpTcn9z_1sZQcyMOUABz1k1VSwo_AU63x2zR7aerTk,2933
74
- basic_memory/repository/repository.py,sha256=cZFCjp7Q-fKwjEYe3ubG1rgYbPEQXsocAn9LgFNXCG0,12071
75
- basic_memory/repository/search_repository.py,sha256=82NCjq06JUuUQXQ9k_D-h8BBlO5gl51XF9UdcY8gK8Q,11621
74
+ basic_memory/repository/repository.py,sha256=X03U6FA3tpQ8FoULL7J7GByUeArSc2Ajb5GIJjZ8HBA,11934
75
+ basic_memory/repository/search_repository.py,sha256=z6oX6wCLo2JaW2hawtgiyxmTsboKTjuO7cgXsFsQhmA,11607
76
76
  basic_memory/schemas/__init__.py,sha256=KHzF2lZhYXRsH2g6tV5Oivlk1EHFfrlbKuiRllqnBzs,1570
77
77
  basic_memory/schemas/base.py,sha256=dwnaI5fJXsdp81mdH0ZpmJ-WICY-0M7ZPWeW5OUgBG8,5685
78
78
  basic_memory/schemas/delete.py,sha256=UAR2JK99WMj3gP-yoGWlHD3eZEkvlTSRf8QoYIE-Wfw,1180
@@ -80,20 +80,21 @@ basic_memory/schemas/memory.py,sha256=qqQm89nZQKtrhquHlRnR6LaSWynPi4MgtcMcqvGH5z
80
80
  basic_memory/schemas/project_info.py,sha256=qsZfafp8bn2oqCizX_CVwJZS4HE79kOmaNiNK9C_9_w,3380
81
81
  basic_memory/schemas/request.py,sha256=58r9mPGc4Am9rR_zGzo-yqXcsrl5I6n3M5LjGK5gFFk,1626
82
82
  basic_memory/schemas/response.py,sha256=lVYR31DTtSeFRddGWX_wQWnQgyiwX0LEpNJ4f4lKpTM,6440
83
- basic_memory/schemas/search.py,sha256=mfPHo8lzZ8BMLzmID-0g_0pWHhBIBNIvy4c8KYHFuvQ,3655
83
+ basic_memory/schemas/search.py,sha256=21GKEQEM3lebJfaTP_gz6DZR4tusx6AeR2E13LtjOvs,3650
84
84
  basic_memory/services/__init__.py,sha256=oop6SKmzV4_NAYt9otGnupLGVCCKIVgxEcdRQWwh25I,197
85
- basic_memory/services/context_service.py,sha256=fhJNHQoTEeIC9ZmZ49CXcNF2aVBghVnmo6LtdSDcAas,9708
86
- basic_memory/services/entity_service.py,sha256=MlJLpZbr67KpSEZXi1yBJSkA_a7_9Ysa-aZnyEi6b7I,12896
85
+ basic_memory/services/context_service.py,sha256=vUo4j-_UDDlpL_PxoNTqmG5kZ2m7UfPyIz6FY3SCU7o,9715
86
+ basic_memory/services/entity_service.py,sha256=lCdqRnAkaolt_pr48lFxRXAj2YRS-nasJTkepBf3zlU,12915
87
87
  basic_memory/services/exceptions.py,sha256=VGlCLd4UD2w5NWKqC7QpG4jOM_hA7jKRRM-MqvEVMNk,288
88
- basic_memory/services/file_service.py,sha256=7uLVkcFMFj20srdch8c6u9T6nO5X4wHgcXdL81pGV88,9935
89
- basic_memory/services/link_resolver.py,sha256=yWqqKqJtGU_93xy25y6Us4xRTNijrBLz76Nvm_zFEOI,3326
90
- basic_memory/services/search_service.py,sha256=t3d5jhABs5bXwtOu7_AvRCpVd8RRd2j6Gg59BAYZ0l8,10625
88
+ basic_memory/services/file_service.py,sha256=egoJnhoHBUX_wepjkLyyc6qZkPfOexlj8p0HRvtdxWw,9940
89
+ basic_memory/services/initialization.py,sha256=T8KPFpFzeURORPjvfhvHE7Vnmx_TXUUGumBCEEiCJaM,4787
90
+ basic_memory/services/link_resolver.py,sha256=3I3wp5HHpe17DNHhn1IG3_yWWHYtEZKRNL7I2j_AHos,3599
91
+ basic_memory/services/search_service.py,sha256=1K1YuWFVreKjn6LkbOpl-zCmXYjqOQS1qB-yvkwu-zc,9817
91
92
  basic_memory/services/service.py,sha256=V-d_8gOV07zGIQDpL-Ksqs3ZN9l3qf3HZOK1f_YNTag,336
92
93
  basic_memory/sync/__init__.py,sha256=CVHguYH457h2u2xoM8KvOilJC71XJlZ-qUh8lHcjYj4,156
93
- basic_memory/sync/sync_service.py,sha256=YirSOgk0PyqPJoHXVUzAxhNKdd2pebP8sFeXeAYmGjM,21957
94
- basic_memory/sync/watch_service.py,sha256=IliisNN8HMKLnBaF95wGHpA5WqRWujprWJVxOnAQ2yc,13468
95
- basic_memory-0.11.0.dist-info/METADATA,sha256=G3NFwoGFvifzfrnPYnBemgmGYmz7jUF8qlaN3LpFe_8,13504
96
- basic_memory-0.11.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
97
- basic_memory-0.11.0.dist-info/entry_points.txt,sha256=wvE2mRF6-Pg4weIYcfQ-86NOLZD4WJg7F7TIsRVFLb8,90
98
- basic_memory-0.11.0.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
99
- basic_memory-0.11.0.dist-info/RECORD,,
94
+ basic_memory/sync/sync_service.py,sha256=UYIHk6ACVLo34RLg08voo_vDosNh_pua3HEXY9JM2zw,19610
95
+ basic_memory/sync/watch_service.py,sha256=ipkW9zK1MhisvdHambB9sesB6vNm0OapMZZM7w0GmsQ,14338
96
+ basic_memory-0.12.1.dist-info/METADATA,sha256=zdQD7uRrb9DBoBS8XM362yUZ5nd-w3PFARc4E7BIMAI,14992
97
+ basic_memory-0.12.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
98
+ basic_memory-0.12.1.dist-info/entry_points.txt,sha256=wvE2mRF6-Pg4weIYcfQ-86NOLZD4WJg7F7TIsRVFLb8,90
99
+ basic_memory-0.12.1.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
100
+ basic_memory-0.12.1.dist-info/RECORD,,