memleaf 0.2.94__tar.gz → 0.2.95__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.94 → memleaf-0.2.95}/CHANGELOG.md +20 -0
- {memleaf-0.2.94/src/memleaf.egg-info → memleaf-0.2.95}/PKG-INFO +2 -2
- {memleaf-0.2.94 → memleaf-0.2.95}/README.en.md +1 -1
- {memleaf-0.2.94 → memleaf-0.2.95}/README.md +1 -1
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/hermes-source-comparison-context.md +5 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/pyproject.toml +1 -1
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/__init__.py +1 -1
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/hermes_provider/_provider.py +19 -1
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/hermes_provider/plugin.yaml +1 -1
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/incremental_prompts.py +1 -1
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/incremental_protocol.py +9 -3
- {memleaf-0.2.94 → memleaf-0.2.95/src/memleaf.egg-info}/PKG-INFO +2 -2
- {memleaf-0.2.94 → memleaf-0.2.95}/LICENSE +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/MANIFEST.in +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/acceptance-evidence-guide.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/automatic-processing-route.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/body-compaction.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/candidate-reconciliation.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/capture-budget-design.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/config-migrations.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/core-refactor.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/development-closeout.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/evidence-retention.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/explicit-memory-update.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/extraction-latency.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/failed-run-recovery.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/gate-evidence-boundary.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/general-processing.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/hermes-mcp-runtime.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/hermes-provider-compatibility.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/host-acceptance-runbook.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/immutable-release-assets.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/incremental-commit-contract.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/incremental-execution.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/incremental-native-comparison.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/incremental-partial-recovery.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/incremental-planner-preview.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/incremental-runtime-contract.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/incremental-scope-registration.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/incremental-selected-retention.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/installed-artifact-verification.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/memory-lifecycle-tools.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/memory-state-contract.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/migration-preflight.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/processing-quality-acceptance.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/public-query-integrity.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/query-performance.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/remember-incremental-route.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/runtime-state-retention.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/semantic-extraction-protocol.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/source-work-contract.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/docs/v0.2.26-processing-status.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/examples/README.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/examples/basic_usage.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/examples/incremental_acceptance.json +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/examples/mcp_stdio.ndjson +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/examples/query_benchmark.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/install.ps1 +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/install.sh +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/setup.cfg +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/__main__.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/acceptance.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/adapters/__init__.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/adapters/antigravity.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/adapters/base.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/adapters/codex.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/adapters/hermes.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/admission.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/batch_review.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/budget.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/capture.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/cli.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/compaction.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/config.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/create_coordinator.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/credentials.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/evidence_budget.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/evidence_policy.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/evidence_structure.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/evidence_syntax.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/explicit_text_source.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/extraction_budget.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/extraction_capability.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/extraction_work_state.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/frontmatter.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/hermes_provider/README.md +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/hermes_provider/__init__.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/hermes_provider/_mcp_client.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/hermes_provider/_shared.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/hermes_provider/evidence_budget.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/hermes_provider/provider_compatibility.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/hermes_runtime.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/historical_context.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/host_events.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/host_retention.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/host_runtime.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/host_turn_identity.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/inbox.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/incremental_commit.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/incremental_dates.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/incremental_execution.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/incremental_explicit.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/incremental_failed_recovery.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/incremental_journal.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/incremental_merge.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/incremental_native.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/incremental_partial.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/incremental_preview.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/incremental_recovery.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/incremental_run_state.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/incremental_runtime.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/incremental_scopes.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/incremental_selection.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/incremental_semantics.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/index.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/inspection.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/installer.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/legacy_update_journal.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/lifecycle_maintenance.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/llm/__init__.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/llm/base.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/llm/claude_compatible.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/llm/gemini.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/llm/openai_compatible.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/llm/router.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/llm/thinking.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/locking.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/mcp_server.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/memory_commit.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/memory_planner.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/memory_retraction.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/memory_update.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/memory_writer.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/migration.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/model_capabilities.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/model_discovery.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/model_execution.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/models.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/native_index.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/native_registration.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/parallel_model.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/planning_candidates.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/planning_context.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/process_common.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/process_jobs.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/process_journal.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/process_owner.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/processing.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/processing_route.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/prompts.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/provenance.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/provider_compatibility.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/query_clock.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/query_progress.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/query_scan.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/receipt_codec.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/recording_policy.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/redaction.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/remember_route.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/retention.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/retrieval.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/retrieval_gate.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/retrieval_lifecycle.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/runtime_retention.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/scope_maintenance.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/scope_state.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/semantic_maintenance.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/semantic_protocol.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/service.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/single_pass_memory_planner.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/single_pass_plan.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/source_policy.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/state_layout.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/subprocess_flags.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/summary_batch.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/target_reconciliation.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/turn_audit.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/turn_plan.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/update_coordinator.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/update_review.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/validation.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf/vault.py +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf.egg-info/SOURCES.txt +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf.egg-info/dependency_links.txt +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf.egg-info/entry_points.txt +0 -0
- {memleaf-0.2.94 → memleaf-0.2.95}/src/memleaf.egg-info/top_level.txt +0 -0
|
@@ -5,6 +5,26 @@ All notable changes to memleaf are documented here.
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
7
|
|
|
8
|
+
## 0.2.95 — 2026-10-05
|
|
9
|
+
|
|
10
|
+
### Preserve turn identity around internal Hermes continuations
|
|
11
|
+
|
|
12
|
+
- Exclude ephemeral transcript rows using the installed Hermes persistence
|
|
13
|
+
contract before checking sources and resolving capture identity. Internal
|
|
14
|
+
continuation nudges with role=user no longer hide the actual user admission.
|
|
15
|
+
Keep exact real-user boundaries, unsupported-host fallback, source checks and
|
|
16
|
+
duplicate-delivery handling; never identify scaffolding by business wording.
|
|
17
|
+
- Accept valid redundant responsibility annotations for unchanged existing
|
|
18
|
+
assignees in UPDATE. Preserve the original responsibility basis; unknown
|
|
19
|
+
assignees, conflicting clears, invalid citations and unauthorized changes
|
|
20
|
+
remain rejected. Bind the adjusted instructions to the protocol digest.
|
|
21
|
+
- Add no model stage, request or retry. Source callback and saved-candidate
|
|
22
|
+
replays used no external model calls. All 58 affected checks passed in the
|
|
23
|
+
native Hermes runtime. Three live Hermes acceptance turns updated, completed
|
|
24
|
+
and reopened the original two memories correctly: six Memleaf requests,
|
|
25
|
+
24,758 observed tokens, and no unresolved post-fix retention intents.
|
|
26
|
+
|
|
27
|
+
|
|
8
28
|
## 0.2.94 — 2026-10-05
|
|
9
29
|
|
|
10
30
|
### Reopen existing memories without redundant model fields
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: memleaf
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.95
|
|
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.95。**
|
|
27
27
|
> 自动提炼和复核共用同一条“未来记忆价值”标准:模型综合未来复用、信息增量、再次读取时的直接可用性和忘记成本,只保留对未来理解、判断或行动有实质影响的最小核心;没有明确价值的信息不提炼,不按具体业务场景硬编码排除。
|
|
28
28
|
> 提炼先比较旧事项中的编号、目标、进展、责任和期限;补全未知信息也应维护原事项,另建独立待办不能替代项目事实更新。确认重复的记忆在现有处理请求中合并,保留历史与来源;项目和独立任务保持各自生命周期,Core 不按标题强行合并。
|
|
29
29
|
> 新请求兼容等价的字段表示;未知执行人保持 `null`,新增或变更负责人和期限需要真实来源;等待条件在正文维护,不再提炼 `waiting_on`。行动及相关字段经过有界语义复核,提炼与复核共用每份工作的最多五次模型请求额度,成功即停止;复核失败不写入。来源时间用于解析相对日期,不补造事实日期。
|
|
@@ -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.95.**
|
|
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
|
> Extraction compares existing identifiers, objectives, progress, responsibility and deadlines first. Filling an unknown also maintains the original item; a separate task does not replace updating shared project facts. Confirmed duplicates can be merged in the existing processing requests with their sources and history preserved. Independent project and task lifecycles remain separate; Core does not merge matching titles.
|
|
10
10
|
> New requests accept equivalent field representations. Unknown executors remain `null`; new or changed responsibility and deadlines require actual source evidence. Dependencies belong in the body; `waiting_on` is no longer extracted. Proposed actions and related fields undergo bounded semantic verification within a shared five-request limit per work item, stopping on success; failed verification blocks writes. Source time resolves relative dates without inventing factual dates.
|
|
@@ -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.95。**
|
|
8
8
|
> 自动提炼和复核共用同一条“未来记忆价值”标准:模型综合未来复用、信息增量、再次读取时的直接可用性和忘记成本,只保留对未来理解、判断或行动有实质影响的最小核心;没有明确价值的信息不提炼,不按具体业务场景硬编码排除。
|
|
9
9
|
> 提炼先比较旧事项中的编号、目标、进展、责任和期限;补全未知信息也应维护原事项,另建独立待办不能替代项目事实更新。确认重复的记忆在现有处理请求中合并,保留历史与来源;项目和独立任务保持各自生命周期,Core 不按标题强行合并。
|
|
10
10
|
> 新请求兼容等价的字段表示;未知执行人保持 `null`,新增或变更负责人和期限需要真实来源;等待条件在正文维护,不再提炼 `waiting_on`。行动及相关字段经过有界语义复核,提炼与复核共用每份工作的最多五次模型请求额度,成功即停止;复核失败不写入。来源时间用于解析相对日期,不补造事实日期。
|
|
@@ -8,6 +8,11 @@ an event does not create a source time.
|
|
|
8
8
|
|
|
9
9
|
The legacy callback checks the final assistant and the nearest user. It has no
|
|
10
10
|
32-message lookback limit. It does not borrow a matching user from an older turn.
|
|
11
|
+
Before checking that boundary, it excludes ephemeral rows using the installed
|
|
12
|
+
Hermes persistence predicate. Internal continuation nudges are not user events,
|
|
13
|
+
even when their role is `user`. It never identifies them by wording or arbitrary
|
|
14
|
+
private flags. If the host predicate is unavailable, the strict legacy boundary
|
|
15
|
+
is retained. Source checks and turn association use the same filtered snapshot.
|
|
11
16
|
|
|
12
17
|
Some Hermes versions persist a reply before adding their file-mutation verifier
|
|
13
18
|
footer. The Provider accepts that display transformation only when the installed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Local-first Markdown memory core for AI agents."""
|
|
2
2
|
|
|
3
|
-
__version__ = "0.2.
|
|
3
|
+
__version__ = "0.2.95"
|
|
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
|
|
@@ -29,6 +29,23 @@ def _capture_assistant_text(value: str) -> str:
|
|
|
29
29
|
flags=re.IGNORECASE)
|
|
30
30
|
|
|
31
31
|
|
|
32
|
+
def _source_messages(messages: Any) -> Any:
|
|
33
|
+
"""Use the host's durable transcript boundary, not its internal nudges.
|
|
34
|
+
|
|
35
|
+
Hermes may retain synthetic user/assistant rows while continuing after an
|
|
36
|
+
empty response. Its persistence contract excludes those rows. Follow that
|
|
37
|
+
exact host predicate rather than recognizing wording or scanning past a
|
|
38
|
+
real user. Hosts without this predicate retain the strict legacy boundary.
|
|
39
|
+
"""
|
|
40
|
+
if not isinstance(messages, list):
|
|
41
|
+
return messages
|
|
42
|
+
try:
|
|
43
|
+
from agent.session_persistence import _is_ephemeral_scaffolding
|
|
44
|
+
return [row for row in messages if not _is_ephemeral_scaffolding(row)]
|
|
45
|
+
except (ImportError, AttributeError, TypeError, ValueError):
|
|
46
|
+
return messages
|
|
47
|
+
|
|
48
|
+
|
|
32
49
|
def _assistant_source_matches(messages: Any, content: str) -> bool:
|
|
33
50
|
"""Accept exact text or an exactly reconstructed native verifier footer.
|
|
34
51
|
|
|
@@ -163,6 +180,7 @@ def _sync_source_metadata(messages: Any, user_content: str, assistant_content: s
|
|
|
163
180
|
from datetime import datetime
|
|
164
181
|
from math import isfinite
|
|
165
182
|
|
|
183
|
+
messages = _source_messages(messages)
|
|
166
184
|
if not isinstance(messages, list) or not messages:
|
|
167
185
|
logger.info("memleaf source-metadata reason=messages_missing")
|
|
168
186
|
return {}
|
|
@@ -1939,7 +1957,7 @@ class MemleafMemoryProvider(MemoryProvider):
|
|
|
1939
1957
|
# Snapshot the list at invocation; subsequent tool/turn appends cannot
|
|
1940
1958
|
# change which source rows this callback verifies.
|
|
1941
1959
|
import copy
|
|
1942
|
-
messages = copy.deepcopy(messages)
|
|
1960
|
+
messages = _source_messages(copy.deepcopy(messages))
|
|
1943
1961
|
# Hermes serializes provider sync work, but this lock also protects
|
|
1944
1962
|
# direct/plugin-level concurrent calls and makes process one-shot per
|
|
1945
1963
|
# captured turn within this provider instance.
|
|
@@ -31,7 +31,7 @@ status=active|completed|cancelled;完成/取消/交接同时纠正冲突的 ti
|
|
|
31
31
|
assignee 是实际执行人,只有明确由用户本人执行才 user,其他执行人用明确名称,未知为 null。用户记录/转发/协调不证明本人执行。等待依赖、卡点仅在正文维护,按最新事实替换过时内容,不生成等待字段。
|
|
32
32
|
scope 采用输入引用;通用为 global,归属未知为 unscoped;只有 allow_new_scopes 才可提出 project:新名称。不把 scopes 当搜索提示,不扩大 write_scopes。
|
|
33
33
|
patch 只含 title/body/scope/status/actionable/assignee/deadline/validity;type 沿用目标。
|
|
34
|
-
新增/变更非空 assignee 必须提供 responsibility_basis:{"assignee":{"ref":"e1","text":"确立执行人的原文"}};放行级或对应 memory/patch 内均可,不能冲突。ref 必须在 evidence,text 是实际原文;新增用户执行责任必须引用 user 原文,assistant
|
|
34
|
+
新增/变更非空 assignee 必须提供 responsibility_basis:{"assignee":{"ref":"e1","text":"确立执行人的原文"}};放行级或对应 memory/patch 内均可,不能冲突。ref 必须在 evidence,text 是实际原文;新增用户执行责任必须引用 user 原文,assistant 不能赋予用户新义务。原文必须确立这个实际行动的责任,引用另一件事的请求不算。沿用无需重复引用;冗余引用仍须有效,但不刷新旧依据。
|
|
35
35
|
|
|
36
36
|
日期:有明确期限时放 memory.deadline 或 patch.deadline:{"ref":"e1","text":"期限原文"},不能只留正文。没有期限变更时省略 deadline。负责人交接、等待验收、尚未完成不能取消旧期限。取消期限用 {"ref":"e1","clear":true,"text":"取消期限原文"};new 未取消时保留原期限。source_time 只用于解释相对日,不补造发生日;每个相对日按其自己的消息时间解析。无来源时间保持未知,不借处理时间。正文日期与期限、材料日期、发生日期区分;无日期也能记完成事实。CREATE/UPDATE 可给 effective:{"ref":"e1","text":"生效时间原文"}。
|
|
37
37
|
|
|
@@ -559,7 +559,12 @@ def _review_fields(row: Mapping[str, Any], fields: Mapping[str, Any], state: Map
|
|
|
559
559
|
if needed - set(offered):
|
|
560
560
|
raise ValueError("missing_responsibility_basis")
|
|
561
561
|
for key, selection in offered.items():
|
|
562
|
-
|
|
562
|
+
# An unchanged owner may be omitted from UPDATE while its annotation
|
|
563
|
+
# is repeated. Validate that annotation without changing the owner or
|
|
564
|
+
# advancing its field basis. CREATE and explicit clears cannot borrow
|
|
565
|
+
# an old owner to satisfy a supplied annotation.
|
|
566
|
+
value = fields.get(key) if key in fields else old.get(key)
|
|
567
|
+
if value is None:
|
|
563
568
|
raise ValueError("invalid_responsibility_basis")
|
|
564
569
|
if not isinstance(selection, dict) or set(selection) != {"ref", "text"}:
|
|
565
570
|
raise ValueError("invalid_responsibility_basis")
|
|
@@ -568,9 +573,10 @@ def _review_fields(row: Mapping[str, Any], fields: Mapping[str, Any], state: Map
|
|
|
568
573
|
if (ref not in refs or not reading_text(text).strip()
|
|
569
574
|
or reading_text(text) not in reading_text(evidence[ref]["text"])):
|
|
570
575
|
raise ValueError("unproven_responsibility_basis")
|
|
571
|
-
if key == "assignee" and
|
|
576
|
+
if key == "assignee" and value == "user" and evidence[ref]["role"] != "user":
|
|
572
577
|
raise ValueError("unconfirmed_user_responsibility")
|
|
573
|
-
|
|
578
|
+
if key in fields:
|
|
579
|
+
bases[key] = source_basis(evidence[ref])
|
|
574
580
|
return bases
|
|
575
581
|
|
|
576
582
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: memleaf
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.95
|
|
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.95。**
|
|
27
27
|
> 自动提炼和复核共用同一条“未来记忆价值”标准:模型综合未来复用、信息增量、再次读取时的直接可用性和忘记成本,只保留对未来理解、判断或行动有实质影响的最小核心;没有明确价值的信息不提炼,不按具体业务场景硬编码排除。
|
|
28
28
|
> 提炼先比较旧事项中的编号、目标、进展、责任和期限;补全未知信息也应维护原事项,另建独立待办不能替代项目事实更新。确认重复的记忆在现有处理请求中合并,保留历史与来源;项目和独立任务保持各自生命周期,Core 不按标题强行合并。
|
|
29
29
|
> 新请求兼容等价的字段表示;未知执行人保持 `null`,新增或变更负责人和期限需要真实来源;等待条件在正文维护,不再提炼 `waiting_on`。行动及相关字段经过有界语义复核,提炼与复核共用每份工作的最多五次模型请求额度,成功即停止;复核失败不写入。来源时间用于解析相对日期,不补造事实日期。
|
|
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
|
|
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
|