memleaf 0.2.81__tar.gz → 0.2.82__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.
- {memleaf-0.2.81 → memleaf-0.2.82}/CHANGELOG.md +10 -0
- {memleaf-0.2.81/src/memleaf.egg-info → memleaf-0.2.82}/PKG-INFO +6 -5
- {memleaf-0.2.81 → memleaf-0.2.82}/README.en.md +5 -4
- {memleaf-0.2.81 → memleaf-0.2.82}/README.md +5 -4
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/hermes-mcp-runtime.md +1 -1
- {memleaf-0.2.81 → memleaf-0.2.82}/pyproject.toml +1 -1
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/__init__.py +1 -1
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/adapters/hermes.py +12 -4
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/hermes_provider/README.md +2 -1
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/hermes_provider/plugin.yaml +1 -1
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/installer.py +4 -3
- {memleaf-0.2.81 → memleaf-0.2.82/src/memleaf.egg-info}/PKG-INFO +6 -5
- {memleaf-0.2.81 → memleaf-0.2.82}/LICENSE +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/MANIFEST.in +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/acceptance-evidence-guide.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/automatic-processing-route.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/body-compaction.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/candidate-reconciliation.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/capture-budget-design.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/config-migrations.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/core-refactor.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/development-closeout.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/evidence-retention.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/explicit-memory-update.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/extraction-latency.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/failed-run-recovery.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/gate-evidence-boundary.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/general-processing.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/hermes-provider-compatibility.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/host-acceptance-runbook.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/immutable-release-assets.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/incremental-commit-contract.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/incremental-execution.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/incremental-native-comparison.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/incremental-partial-recovery.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/incremental-planner-preview.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/incremental-runtime-contract.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/incremental-scope-registration.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/incremental-selected-retention.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/installed-artifact-verification.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/memory-state-contract.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/migration-preflight.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/processing-quality-acceptance.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/public-query-integrity.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/query-performance.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/remember-incremental-route.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/runtime-state-retention.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/semantic-extraction-protocol.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/source-work-contract.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/docs/v0.2.26-processing-status.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/examples/README.md +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/examples/basic_usage.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/examples/incremental_acceptance.json +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/examples/mcp_stdio.ndjson +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/examples/query_benchmark.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/install.ps1 +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/install.sh +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/setup.cfg +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/__main__.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/acceptance.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/adapters/__init__.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/adapters/antigravity.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/adapters/base.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/adapters/codex.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/admission.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/batch_review.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/budget.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/capture.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/cli.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/compaction.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/config.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/create_coordinator.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/credentials.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/evidence_budget.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/evidence_policy.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/evidence_structure.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/evidence_syntax.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/explicit_text_source.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/extraction_budget.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/extraction_capability.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/extraction_work_state.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/frontmatter.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/hermes_provider/__init__.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/hermes_provider/_mcp_client.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/hermes_provider/_provider.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/hermes_provider/_shared.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/hermes_provider/evidence_budget.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/hermes_provider/provider_compatibility.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/hermes_runtime.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/host_events.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/host_runtime.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/inbox.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/incremental_commit.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/incremental_dates.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/incremental_execution.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/incremental_explicit.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/incremental_failed_recovery.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/incremental_journal.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/incremental_native.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/incremental_partial.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/incremental_preview.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/incremental_prompts.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/incremental_protocol.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/incremental_recovery.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/incremental_run_state.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/incremental_runtime.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/incremental_scopes.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/incremental_selection.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/index.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/inspection.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/legacy_update_journal.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/llm/__init__.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/llm/base.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/llm/claude_compatible.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/llm/gemini.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/llm/openai_compatible.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/llm/router.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/llm/thinking.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/locking.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/mcp_server.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/memory_commit.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/memory_planner.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/memory_retraction.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/memory_update.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/memory_writer.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/migration.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/model_capabilities.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/model_discovery.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/model_execution.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/models.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/native_index.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/native_registration.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/parallel_model.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/planning_context.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/process_common.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/process_jobs.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/process_journal.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/process_owner.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/processing.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/processing_route.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/prompts.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/provenance.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/provider_compatibility.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/query_clock.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/query_progress.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/query_scan.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/receipt_codec.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/recording_policy.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/redaction.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/remember_route.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/retention.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/retrieval.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/retrieval_gate.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/runtime_retention.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/scope_maintenance.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/scope_state.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/semantic_maintenance.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/semantic_protocol.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/service.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/single_pass_memory_planner.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/single_pass_plan.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/source_policy.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/state_layout.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/subprocess_flags.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/summary_batch.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/target_reconciliation.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/turn_audit.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/turn_plan.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/update_coordinator.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/update_review.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/validation.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf/vault.py +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf.egg-info/SOURCES.txt +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf.egg-info/dependency_links.txt +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf.egg-info/entry_points.txt +0 -0
- {memleaf-0.2.81 → memleaf-0.2.82}/src/memleaf.egg-info/top_level.txt +0 -0
|
@@ -4,6 +4,16 @@ All notable changes to memleaf are documented here.
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 0.2.82 — 2026-09-30
|
|
8
|
+
|
|
9
|
+
### Hermes installation tool discovery
|
|
10
|
+
|
|
11
|
+
- Derive the Hermes MCP installation check from the installed server tool
|
|
12
|
+
declarations instead of a separately maintained tool-count constant. This
|
|
13
|
+
fixes the 0.2.81 installation rollback after adding `recover_failed_run`.
|
|
14
|
+
- Verify actual stdio tool discovery and Hermes count acceptance/rejection in
|
|
15
|
+
both installed distributions on every supported CI platform.
|
|
16
|
+
|
|
7
17
|
## 0.2.81 — 2026-09-30
|
|
8
18
|
|
|
9
19
|
### HTTP failure classification and controlled run recovery
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: memleaf
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.82
|
|
4
4
|
Summary: A local-first Markdown memory core for AI agents
|
|
5
5
|
Author: memleaf contributors
|
|
6
6
|
License-Expression: MIT
|
|
@@ -23,7 +23,7 @@ Dynamic: license-file
|
|
|
23
23
|
|
|
24
24
|
[English](README.en.md) · [PyPI](https://pypi.org/project/memleaf/) · [GitHub](https://github.com/miffyblueboo/memleaf)
|
|
25
25
|
|
|
26
|
-
> **版本:0.2.
|
|
26
|
+
> **版本:0.2.82。**
|
|
27
27
|
> 自动提炼和复核共用同一条“未来记忆价值”标准:模型综合未来复用、信息增量、再次读取时的直接可用性和忘记成本,只保留对未来理解、判断或行动有实质影响的最小核心;没有明确价值的信息不提炼,不按具体业务场景硬编码排除。
|
|
28
28
|
> 提炼契约现在只有一份中文语义契约(旧版英文 B3 提示词已删除),首轮、主题选择、候选修复和 `semantic_maintenance` 使用同一套保留价值判断;同一件事只写一次。
|
|
29
29
|
> Core 不再因为归属、日期、任务依据或跨项目而丢弃整条候选:归属缺失会归一到证据里唯一被点名的项目、否则落 `global`;日期只接受能在本候选证据里找到出处、且能锚定成 ISO 的写法(`明天`、`周五`、`月底` 都会被解析),无法解析时只丢掉日期字段,记忆照常写入;未获授权的改归属沿用目标原归属。
|
|
@@ -167,12 +167,12 @@ python -m pip install -U memleaf && python -m memleaf install
|
|
|
167
167
|
4. 激活 `memory.provider=memleaf`;
|
|
168
168
|
5. 通过 Hermes 官方 CLI 配置 memleaf MCP;
|
|
169
169
|
6. 配置 MCP lazy/idle 生命周期;
|
|
170
|
-
7. 验证 MCP Server
|
|
170
|
+
7. 验证 MCP Server 能发现当前版本声明的全部工具;
|
|
171
171
|
8. 写入本地 Agent 状态索引。
|
|
172
172
|
|
|
173
173
|
完成后重启 Hermes。
|
|
174
174
|
|
|
175
|
-
如果没有检测到 Hermes、无法取得完整模型路由、Provider 激活失败或 MCP
|
|
175
|
+
如果没有检测到 Hermes、无法取得完整模型路由、Provider 激活失败或 MCP 工具发现验证失败,安装会明确返回失败,不会把未完成的接入报告为成功。
|
|
176
176
|
|
|
177
177
|
仓库中的 `install.sh` 保留给源码开发、离线源码安装和故障排查;普通 PyPI 用户不需要执行它。
|
|
178
178
|
|
|
@@ -269,7 +269,7 @@ python -m memleaf.mcp_server --vault "$HOME/.memleaf"
|
|
|
269
269
|
|
|
270
270
|
不传 `--vault` 时默认使用 `~/.memleaf`;也可以设置 `MEMLEAF_VAULT`。正常情况下不需要手工常驻,Hermes 或 Codex 会按需启动它。stdout 只输出 JSON-RPC,日志不会污染协议通道。
|
|
271
271
|
|
|
272
|
-
|
|
272
|
+
当前提供以下工具:
|
|
273
273
|
|
|
274
274
|
| 工具 | 用途 |
|
|
275
275
|
| --- | --- |
|
|
@@ -277,6 +277,7 @@ python -m memleaf.mcp_server --vault "$HOME/.memleaf"
|
|
|
277
277
|
| `context` | 兼容保留的有界轻量目录,不用于自动检索路径 |
|
|
278
278
|
| `scope_catalog` | 返回 Scope、父级和别名,不返回具体记忆正文 |
|
|
279
279
|
| `search` | 返回有界候选目录和 `found`/`no_match` 状态 |
|
|
280
|
+
| `list_todos` | 跨 Scope 按状态和日期筛选并分页列出当前待办 |
|
|
280
281
|
| `read` | 使用当前 `retrieval_id` 分页读取选中的记忆正文 |
|
|
281
282
|
| `process` | 处理完整 inbox 轮次并按准入规则提炼;`background=true` 时异步入队 |
|
|
282
283
|
| `process_status` | 只读查询异步处理 job 状态 |
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
[中文](README.md) · [PyPI](https://pypi.org/project/memleaf/) · [GitHub](https://github.com/miffyblueboo/memleaf)
|
|
6
6
|
|
|
7
|
-
> **Version: 0.2.
|
|
7
|
+
> **Version: 0.2.82.**
|
|
8
8
|
> Automatic extraction and review share one future-value standard: the model weighs likely reuse, information gain, direct usability when read again, and the cost of forgetting. It keeps only the smallest core that can materially help future understanding, decisions, or actions; information without clear value is not extracted, and no business-specific exclusion rule is hard-coded.
|
|
9
9
|
> A single Chinese semantic contract is sent for extraction, topic selection, candidate repair, and `semantic_maintenance`; the older English B3 prompt has been deleted and B3 remains only as a compatibility read format. One topic is written once.
|
|
10
10
|
> Core no longer discards a whole candidate over ownership, dates, task basis or cross-project wording. A missing owner normalizes to the single project named by that candidate's own evidence, otherwise `global`. A deadline is accepted only when it appears in the candidate's own evidence and can be anchored to ISO (`明天`, `周五`, `月底` all resolve); when it cannot, only the date field is dropped and the memory is still written. An unauthorized ownership change keeps the target's existing scope.
|
|
@@ -148,12 +148,12 @@ Both installation paths automatically:
|
|
|
148
148
|
4. Activate `memory.provider=memleaf`.
|
|
149
149
|
5. Configure the memleaf MCP entry through Hermes' official CLI.
|
|
150
150
|
6. Configure MCP lazy/idle lifecycle settings.
|
|
151
|
-
7. Verify that the MCP server exposes all
|
|
151
|
+
7. Verify that the MCP server exposes all tools declared by the installed version.
|
|
152
152
|
8. Record the local Agent integration status.
|
|
153
153
|
|
|
154
154
|
Restart Hermes after installation.
|
|
155
155
|
|
|
156
|
-
If Hermes cannot be detected, no complete model route can be configured, Provider activation fails, or
|
|
156
|
+
If Hermes cannot be detected, no complete model route can be configured, Provider activation fails, or MCP tool-discovery verification fails, the installer returns an explicit failure rather than reporting an incomplete integration as successful.
|
|
157
157
|
|
|
158
158
|
The repository `install.sh` remains for source development, offline source installation, and troubleshooting. Normal PyPI users do not need to run it.
|
|
159
159
|
|
|
@@ -250,7 +250,7 @@ python -m memleaf.mcp_server --vault "$HOME/.memleaf"
|
|
|
250
250
|
|
|
251
251
|
Without `--vault`, the server uses `~/.memleaf`; `MEMLEAF_VAULT` can also specify the Vault. In normal use the server does not need to be kept running manually: Hermes or Codex starts it on demand. stdout contains only JSON-RPC messages so logs do not corrupt the protocol stream.
|
|
252
252
|
|
|
253
|
-
The server
|
|
253
|
+
The server exposes the following tools:
|
|
254
254
|
|
|
255
255
|
| Tool | Purpose |
|
|
256
256
|
| --- | --- |
|
|
@@ -262,6 +262,7 @@ The server currently exposes 13 tools:
|
|
|
262
262
|
| `read` | Read a selected memory body in pages using the current `retrieval_id` |
|
|
263
263
|
| `process` | Process complete inbox turns under the admission rules; `background=true` enqueues a job |
|
|
264
264
|
| `process_status` | Read the status of a background processing job |
|
|
265
|
+
| `recover_failed_run` | Preview and explicitly recover terminal transport failures within the original request budget |
|
|
265
266
|
| `remember` | Create or update memory after an explicit request |
|
|
266
267
|
| `forget_memory` | Delete one memory by exact ID |
|
|
267
268
|
| `forget_about` | Forget an unambiguous topic; return candidates when ambiguous |
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
[English](README.en.md) · [PyPI](https://pypi.org/project/memleaf/) · [GitHub](https://github.com/miffyblueboo/memleaf)
|
|
6
6
|
|
|
7
|
-
> **版本:0.2.
|
|
7
|
+
> **版本:0.2.82。**
|
|
8
8
|
> 自动提炼和复核共用同一条“未来记忆价值”标准:模型综合未来复用、信息增量、再次读取时的直接可用性和忘记成本,只保留对未来理解、判断或行动有实质影响的最小核心;没有明确价值的信息不提炼,不按具体业务场景硬编码排除。
|
|
9
9
|
> 提炼契约现在只有一份中文语义契约(旧版英文 B3 提示词已删除),首轮、主题选择、候选修复和 `semantic_maintenance` 使用同一套保留价值判断;同一件事只写一次。
|
|
10
10
|
> Core 不再因为归属、日期、任务依据或跨项目而丢弃整条候选:归属缺失会归一到证据里唯一被点名的项目、否则落 `global`;日期只接受能在本候选证据里找到出处、且能锚定成 ISO 的写法(`明天`、`周五`、`月底` 都会被解析),无法解析时只丢掉日期字段,记忆照常写入;未获授权的改归属沿用目标原归属。
|
|
@@ -148,12 +148,12 @@ python -m pip install -U memleaf && python -m memleaf install
|
|
|
148
148
|
4. 激活 `memory.provider=memleaf`;
|
|
149
149
|
5. 通过 Hermes 官方 CLI 配置 memleaf MCP;
|
|
150
150
|
6. 配置 MCP lazy/idle 生命周期;
|
|
151
|
-
7. 验证 MCP Server
|
|
151
|
+
7. 验证 MCP Server 能发现当前版本声明的全部工具;
|
|
152
152
|
8. 写入本地 Agent 状态索引。
|
|
153
153
|
|
|
154
154
|
完成后重启 Hermes。
|
|
155
155
|
|
|
156
|
-
如果没有检测到 Hermes、无法取得完整模型路由、Provider 激活失败或 MCP
|
|
156
|
+
如果没有检测到 Hermes、无法取得完整模型路由、Provider 激活失败或 MCP 工具发现验证失败,安装会明确返回失败,不会把未完成的接入报告为成功。
|
|
157
157
|
|
|
158
158
|
仓库中的 `install.sh` 保留给源码开发、离线源码安装和故障排查;普通 PyPI 用户不需要执行它。
|
|
159
159
|
|
|
@@ -250,7 +250,7 @@ python -m memleaf.mcp_server --vault "$HOME/.memleaf"
|
|
|
250
250
|
|
|
251
251
|
不传 `--vault` 时默认使用 `~/.memleaf`;也可以设置 `MEMLEAF_VAULT`。正常情况下不需要手工常驻,Hermes 或 Codex 会按需启动它。stdout 只输出 JSON-RPC,日志不会污染协议通道。
|
|
252
252
|
|
|
253
|
-
|
|
253
|
+
当前提供以下工具:
|
|
254
254
|
|
|
255
255
|
| 工具 | 用途 |
|
|
256
256
|
| --- | --- |
|
|
@@ -258,6 +258,7 @@ python -m memleaf.mcp_server --vault "$HOME/.memleaf"
|
|
|
258
258
|
| `context` | 兼容保留的有界轻量目录,不用于自动检索路径 |
|
|
259
259
|
| `scope_catalog` | 返回 Scope、父级和别名,不返回具体记忆正文 |
|
|
260
260
|
| `search` | 返回有界候选目录和 `found`/`no_match` 状态 |
|
|
261
|
+
| `list_todos` | 跨 Scope 按状态和日期筛选并分页列出当前待办 |
|
|
261
262
|
| `read` | 使用当前 `retrieval_id` 分页读取选中的记忆正文 |
|
|
262
263
|
| `process` | 处理完整 inbox 轮次并按准入规则提炼;`background=true` 时异步入队 |
|
|
263
264
|
| `process_status` | 只读查询异步处理 job 状态 |
|
|
@@ -152,7 +152,7 @@ Vault. Once changes begin, it snapshots:
|
|
|
152
152
|
- Hermes `memleaf.json`; and
|
|
153
153
|
- the installed `plugins/memleaf` Provider directory.
|
|
154
154
|
|
|
155
|
-
If MCP persistence, MCP lifecycle configuration, the
|
|
155
|
+
If MCP persistence, MCP lifecycle configuration, the declared-tool discovery test, Provider
|
|
156
156
|
copy/version validation, Provider activation, or native-source registration
|
|
157
157
|
fails, those Hermes paths are restored to their pre-install state. Each
|
|
158
158
|
snapshot is restored independently: a failure on one path does not prevent the
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Local-first Markdown memory core for AI agents."""
|
|
2
2
|
|
|
3
|
-
__version__ = "0.2.
|
|
3
|
+
__version__ = "0.2.82"
|
|
4
4
|
|
|
5
5
|
from .config import DEFAULT_CONFIG, default_config, load_config, save_config
|
|
6
6
|
from .frontmatter import FrontmatterError, dump_frontmatter, dump_yaml, load_yaml, parse_frontmatter
|
|
@@ -24,8 +24,14 @@ from .base import (
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
_MCP_IDLE_TIMEOUT_SECONDS = 60
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def expected_mcp_tool_count() -> int:
|
|
30
|
+
"""Read the installed server's declarations instead of a second tool inventory."""
|
|
31
|
+
|
|
32
|
+
from ..mcp_server import _TOOLS
|
|
33
|
+
|
|
34
|
+
return len(_TOOLS)
|
|
29
35
|
|
|
30
36
|
|
|
31
37
|
def hermes_home_for_platform(
|
|
@@ -418,7 +424,7 @@ class HermesAdapter:
|
|
|
418
424
|
self,
|
|
419
425
|
detection: Detection | None = None,
|
|
420
426
|
*,
|
|
421
|
-
expected_tools: int =
|
|
427
|
+
expected_tools: int | None = None,
|
|
422
428
|
) -> bool:
|
|
423
429
|
"""Run the official MCP test and require the expected tool count."""
|
|
424
430
|
|
|
@@ -426,7 +432,9 @@ class HermesAdapter:
|
|
|
426
432
|
executable = detection.executable if detection.detected else None
|
|
427
433
|
if detection.confidence != "high" or not executable:
|
|
428
434
|
return False
|
|
429
|
-
if
|
|
435
|
+
if expected_tools is None:
|
|
436
|
+
expected_tools = expected_mcp_tool_count()
|
|
437
|
+
if not isinstance(expected_tools, int) or isinstance(expected_tools, bool) or expected_tools < 0:
|
|
430
438
|
return False
|
|
431
439
|
try:
|
|
432
440
|
result = run_argv(
|
|
@@ -61,7 +61,8 @@ mcp_servers:
|
|
|
61
61
|
|
|
62
62
|
Use `python -m memleaf install` to configure both entries. The installer writes
|
|
63
63
|
the MCP entry through `hermes config set`, reads `config.yaml` back, and tests
|
|
64
|
-
that all
|
|
64
|
+
that all tools declared by the installed MCP server are discoverable before it
|
|
65
|
+
reports success. When two memleaf
|
|
65
66
|
virtual environments are present, use `--mcp-runtime current` to migrate to the
|
|
66
67
|
runtime executing the installer or `--mcp-runtime existing` to retain an
|
|
67
68
|
already configured executable after an exact version check. See the
|
|
@@ -30,7 +30,7 @@ from .adapters.base import (
|
|
|
30
30
|
from .adapters.codex import CodexAdapter
|
|
31
31
|
from .adapters.hermes import (
|
|
32
32
|
HermesAdapter,
|
|
33
|
-
|
|
33
|
+
expected_mcp_tool_count,
|
|
34
34
|
hermes_home_for_platform,
|
|
35
35
|
)
|
|
36
36
|
from .cli import _home_from_environment, _prepare_model_route
|
|
@@ -1227,10 +1227,11 @@ def install_hermes(
|
|
|
1227
1227
|
vault.root,
|
|
1228
1228
|
),
|
|
1229
1229
|
)
|
|
1230
|
-
|
|
1230
|
+
expected_tools = expected_mcp_tool_count()
|
|
1231
|
+
if not adapter.test_mcp(detection, expected_tools=expected_tools):
|
|
1231
1232
|
raise _HermesInstallFailure(
|
|
1232
1233
|
stage="mcp_test",
|
|
1233
|
-
reason=f"Hermes MCP test did not confirm {
|
|
1234
|
+
reason=f"Hermes MCP test did not confirm {expected_tools} tools",
|
|
1234
1235
|
mcp=configured.to_dict(),
|
|
1235
1236
|
user_action="Inspect the MCP process error, then rerun the installer.",
|
|
1236
1237
|
recovery_commands=[
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: memleaf
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.82
|
|
4
4
|
Summary: A local-first Markdown memory core for AI agents
|
|
5
5
|
Author: memleaf contributors
|
|
6
6
|
License-Expression: MIT
|
|
@@ -23,7 +23,7 @@ Dynamic: license-file
|
|
|
23
23
|
|
|
24
24
|
[English](README.en.md) · [PyPI](https://pypi.org/project/memleaf/) · [GitHub](https://github.com/miffyblueboo/memleaf)
|
|
25
25
|
|
|
26
|
-
> **版本:0.2.
|
|
26
|
+
> **版本:0.2.82。**
|
|
27
27
|
> 自动提炼和复核共用同一条“未来记忆价值”标准:模型综合未来复用、信息增量、再次读取时的直接可用性和忘记成本,只保留对未来理解、判断或行动有实质影响的最小核心;没有明确价值的信息不提炼,不按具体业务场景硬编码排除。
|
|
28
28
|
> 提炼契约现在只有一份中文语义契约(旧版英文 B3 提示词已删除),首轮、主题选择、候选修复和 `semantic_maintenance` 使用同一套保留价值判断;同一件事只写一次。
|
|
29
29
|
> Core 不再因为归属、日期、任务依据或跨项目而丢弃整条候选:归属缺失会归一到证据里唯一被点名的项目、否则落 `global`;日期只接受能在本候选证据里找到出处、且能锚定成 ISO 的写法(`明天`、`周五`、`月底` 都会被解析),无法解析时只丢掉日期字段,记忆照常写入;未获授权的改归属沿用目标原归属。
|
|
@@ -167,12 +167,12 @@ python -m pip install -U memleaf && python -m memleaf install
|
|
|
167
167
|
4. 激活 `memory.provider=memleaf`;
|
|
168
168
|
5. 通过 Hermes 官方 CLI 配置 memleaf MCP;
|
|
169
169
|
6. 配置 MCP lazy/idle 生命周期;
|
|
170
|
-
7. 验证 MCP Server
|
|
170
|
+
7. 验证 MCP Server 能发现当前版本声明的全部工具;
|
|
171
171
|
8. 写入本地 Agent 状态索引。
|
|
172
172
|
|
|
173
173
|
完成后重启 Hermes。
|
|
174
174
|
|
|
175
|
-
如果没有检测到 Hermes、无法取得完整模型路由、Provider 激活失败或 MCP
|
|
175
|
+
如果没有检测到 Hermes、无法取得完整模型路由、Provider 激活失败或 MCP 工具发现验证失败,安装会明确返回失败,不会把未完成的接入报告为成功。
|
|
176
176
|
|
|
177
177
|
仓库中的 `install.sh` 保留给源码开发、离线源码安装和故障排查;普通 PyPI 用户不需要执行它。
|
|
178
178
|
|
|
@@ -269,7 +269,7 @@ python -m memleaf.mcp_server --vault "$HOME/.memleaf"
|
|
|
269
269
|
|
|
270
270
|
不传 `--vault` 时默认使用 `~/.memleaf`;也可以设置 `MEMLEAF_VAULT`。正常情况下不需要手工常驻,Hermes 或 Codex 会按需启动它。stdout 只输出 JSON-RPC,日志不会污染协议通道。
|
|
271
271
|
|
|
272
|
-
|
|
272
|
+
当前提供以下工具:
|
|
273
273
|
|
|
274
274
|
| 工具 | 用途 |
|
|
275
275
|
| --- | --- |
|
|
@@ -277,6 +277,7 @@ python -m memleaf.mcp_server --vault "$HOME/.memleaf"
|
|
|
277
277
|
| `context` | 兼容保留的有界轻量目录,不用于自动检索路径 |
|
|
278
278
|
| `scope_catalog` | 返回 Scope、父级和别名,不返回具体记忆正文 |
|
|
279
279
|
| `search` | 返回有界候选目录和 `found`/`no_match` 状态 |
|
|
280
|
+
| `list_todos` | 跨 Scope 按状态和日期筛选并分页列出当前待办 |
|
|
280
281
|
| `read` | 使用当前 `retrieval_id` 分页读取选中的记忆正文 |
|
|
281
282
|
| `process` | 处理完整 inbox 轮次并按准入规则提炼;`background=true` 时异步入队 |
|
|
282
283
|
| `process_status` | 只读查询异步处理 job 状态 |
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|