memleaf 0.2.79__tar.gz → 0.2.80__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.79 → memleaf-0.2.80}/CHANGELOG.md +8 -0
- {memleaf-0.2.79/src/memleaf.egg-info → memleaf-0.2.80}/PKG-INFO +2 -2
- {memleaf-0.2.79 → memleaf-0.2.80}/README.en.md +1 -1
- {memleaf-0.2.79 → memleaf-0.2.80}/README.md +1 -1
- {memleaf-0.2.79 → memleaf-0.2.80}/pyproject.toml +1 -1
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/__init__.py +1 -1
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/hermes_provider/plugin.yaml +1 -1
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/incremental_dates.py +18 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/incremental_protocol.py +1 -1
- {memleaf-0.2.79 → memleaf-0.2.80/src/memleaf.egg-info}/PKG-INFO +2 -2
- {memleaf-0.2.79 → memleaf-0.2.80}/LICENSE +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/MANIFEST.in +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/acceptance-evidence-guide.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/automatic-processing-route.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/body-compaction.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/candidate-reconciliation.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/capture-budget-design.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/config-migrations.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/core-refactor.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/development-closeout.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/evidence-retention.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/explicit-memory-update.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/extraction-latency.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/gate-evidence-boundary.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/general-processing.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/hermes-mcp-runtime.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/hermes-provider-compatibility.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/host-acceptance-runbook.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/immutable-release-assets.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/incremental-commit-contract.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/incremental-execution.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/incremental-native-comparison.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/incremental-partial-recovery.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/incremental-planner-preview.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/incremental-runtime-contract.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/incremental-scope-registration.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/incremental-selected-retention.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/installed-artifact-verification.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/memory-state-contract.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/migration-preflight.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/processing-quality-acceptance.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/public-query-integrity.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/query-performance.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/remember-incremental-route.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/runtime-state-retention.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/semantic-extraction-protocol.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/source-work-contract.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/docs/v0.2.26-processing-status.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/examples/README.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/examples/basic_usage.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/examples/incremental_acceptance.json +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/examples/mcp_stdio.ndjson +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/examples/query_benchmark.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/install.ps1 +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/install.sh +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/setup.cfg +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/__main__.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/acceptance.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/adapters/__init__.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/adapters/antigravity.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/adapters/base.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/adapters/codex.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/adapters/hermes.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/admission.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/batch_review.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/budget.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/capture.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/cli.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/compaction.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/config.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/create_coordinator.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/credentials.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/evidence_budget.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/evidence_policy.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/evidence_structure.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/evidence_syntax.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/explicit_text_source.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/extraction_budget.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/extraction_capability.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/extraction_work_state.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/frontmatter.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/hermes_provider/README.md +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/hermes_provider/__init__.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/hermes_provider/_mcp_client.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/hermes_provider/_provider.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/hermes_provider/_shared.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/hermes_provider/evidence_budget.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/hermes_provider/provider_compatibility.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/hermes_runtime.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/host_events.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/host_runtime.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/inbox.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/incremental_commit.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/incremental_execution.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/incremental_explicit.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/incremental_journal.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/incremental_native.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/incremental_partial.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/incremental_preview.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/incremental_prompts.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/incremental_recovery.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/incremental_run_state.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/incremental_runtime.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/incremental_scopes.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/incremental_selection.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/index.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/inspection.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/installer.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/legacy_update_journal.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/llm/__init__.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/llm/base.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/llm/claude_compatible.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/llm/gemini.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/llm/openai_compatible.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/llm/router.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/llm/thinking.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/locking.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/mcp_server.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/memory_commit.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/memory_planner.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/memory_retraction.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/memory_update.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/memory_writer.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/migration.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/model_capabilities.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/model_discovery.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/model_execution.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/models.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/native_index.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/native_registration.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/parallel_model.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/planning_context.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/process_common.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/process_jobs.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/process_journal.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/process_owner.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/processing.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/processing_route.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/prompts.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/provenance.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/provider_compatibility.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/query_clock.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/query_progress.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/query_scan.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/receipt_codec.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/recording_policy.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/redaction.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/remember_route.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/retention.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/retrieval.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/retrieval_gate.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/runtime_retention.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/scope_maintenance.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/scope_state.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/semantic_maintenance.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/semantic_protocol.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/service.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/single_pass_memory_planner.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/single_pass_plan.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/source_policy.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/state_layout.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/subprocess_flags.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/summary_batch.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/target_reconciliation.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/turn_audit.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/turn_plan.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/update_coordinator.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/update_review.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/validation.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf/vault.py +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf.egg-info/SOURCES.txt +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf.egg-info/dependency_links.txt +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf.egg-info/entry_points.txt +0 -0
- {memleaf-0.2.79 → memleaf-0.2.80}/src/memleaf.egg-info/top_level.txt +0 -0
|
@@ -4,6 +4,14 @@ All notable changes to memleaf are documented here.
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 0.2.80 — 2026-09-29
|
|
8
|
+
|
|
9
|
+
### Explicit deadline annotations
|
|
10
|
+
|
|
11
|
+
- Resolve model-selected deadlines such as `明天(2026-09-30)` from their
|
|
12
|
+
explicit full-date annotation when source time is absent, retaining the
|
|
13
|
+
original text and leaving ambiguous expressions unresolved.
|
|
14
|
+
|
|
7
15
|
## 0.2.79 — 2026-09-29
|
|
8
16
|
|
|
9
17
|
### Model-owned content dates
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: memleaf
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.80
|
|
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.80。**
|
|
27
27
|
> 自动提炼和复核共用同一条“未来记忆价值”标准:模型综合未来复用、信息增量、再次读取时的直接可用性和忘记成本,只保留对未来理解、判断或行动有实质影响的最小核心;没有明确价值的信息不提炼,不按具体业务场景硬编码排除。
|
|
28
28
|
> 提炼契约现在只有一份中文语义契约(旧版英文 B3 提示词已删除),首轮、主题选择、候选修复和 `semantic_maintenance` 使用同一套保留价值判断;同一件事只写一次。
|
|
29
29
|
> Core 不再因为归属、日期、任务依据或跨项目而丢弃整条候选:归属缺失会归一到证据里唯一被点名的项目、否则落 `global`;日期只接受能在本候选证据里找到出处、且能锚定成 ISO 的写法(`明天`、`周五`、`月底` 都会被解析),无法解析时只丢掉日期字段,记忆照常写入;未获授权的改归属沿用目标原归属。
|
|
@@ -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.80.**
|
|
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.
|
|
@@ -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.80。**
|
|
8
8
|
> 自动提炼和复核共用同一条“未来记忆价值”标准:模型综合未来复用、信息增量、再次读取时的直接可用性和忘记成本,只保留对未来理解、判断或行动有实质影响的最小核心;没有明确价值的信息不提炼,不按具体业务场景硬编码排除。
|
|
9
9
|
> 提炼契约现在只有一份中文语义契约(旧版英文 B3 提示词已删除),首轮、主题选择、候选修复和 `semantic_maintenance` 使用同一套保留价值判断;同一件事只写一次。
|
|
10
10
|
> Core 不再因为归属、日期、任务依据或跨项目而丢弃整条候选:归属缺失会归一到证据里唯一被点名的项目、否则落 `global`;日期只接受能在本候选证据里找到出处、且能锚定成 ISO 的写法(`明天`、`周五`、`月底` 都会被解析),无法解析时只丢掉日期字段,记忆照常写入;未获授权的改归属沿用目标原归属。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Local-first Markdown memory core for AI agents."""
|
|
2
2
|
|
|
3
|
-
__version__ = "0.2.
|
|
3
|
+
__version__ = "0.2.80"
|
|
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
|
|
@@ -123,6 +123,24 @@ def selected_calendar(text: str, evidence: Mapping[str, Any]) -> dict[str, Any]:
|
|
|
123
123
|
anchor = parse_source_time(evidence.get("source_time"))
|
|
124
124
|
local_day = anchor.date() if anchor is not None else None
|
|
125
125
|
view = reading_text(text)
|
|
126
|
+
# A model-selected expression can already spell out its absolute date,
|
|
127
|
+
# e.g. "明天(2026-09-30)". Resolve that local annotation even when an
|
|
128
|
+
# explicit remember call carries no source timestamp. Do not borrow an
|
|
129
|
+
# unrelated date elsewhere in the expression or infer a missing year.
|
|
130
|
+
if local_day is None:
|
|
131
|
+
def explicit_annotation(match: re.Match[str]) -> str:
|
|
132
|
+
tail = view[match.end():]
|
|
133
|
+
note = re.match(r"\s*(?:(([^()()]*))|\(([^()()]*)\))", tail)
|
|
134
|
+
if note is None:
|
|
135
|
+
return match.group()
|
|
136
|
+
literal = (note.group(1) if note.group(1) is not None else note.group(2)).strip()
|
|
137
|
+
dates = calendar_tokens(literal)
|
|
138
|
+
if (len(dates) == 1 and dates[0].has_year and dates[0].canonical
|
|
139
|
+
and dates[0].raw == literal):
|
|
140
|
+
return dates[0].canonical
|
|
141
|
+
return match.group()
|
|
142
|
+
|
|
143
|
+
view = _RELATIVE_CALENDAR_EXPRESSION.sub(explicit_annotation, view)
|
|
126
144
|
converted = normalize_relative_calendar_text(view, local_day)
|
|
127
145
|
if local_day is None and not _RELATIVE_CALENDAR_EXPRESSION.search(view):
|
|
128
146
|
converted = view
|
|
@@ -24,7 +24,7 @@ from .turn_plan import revision_digest
|
|
|
24
24
|
from .validation import ModelOutputError, parse_strict_json
|
|
25
25
|
|
|
26
26
|
PROTOCOL_VERSION = "incremental-items-v1"
|
|
27
|
-
SEMANTIC_PROTOCOL = "incremental-turn-
|
|
27
|
+
SEMANTIC_PROTOCOL = "incremental-turn-v9"
|
|
28
28
|
MAX_BYTES = 128 * 1024
|
|
29
29
|
MAX_ITEMS = 64
|
|
30
30
|
_TYPES = frozenset(("fact", "todo", "preference", "project", "event", "identity", "other"))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: memleaf
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.80
|
|
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.80。**
|
|
27
27
|
> 自动提炼和复核共用同一条“未来记忆价值”标准:模型综合未来复用、信息增量、再次读取时的直接可用性和忘记成本,只保留对未来理解、判断或行动有实质影响的最小核心;没有明确价值的信息不提炼,不按具体业务场景硬编码排除。
|
|
28
28
|
> 提炼契约现在只有一份中文语义契约(旧版英文 B3 提示词已删除),首轮、主题选择、候选修复和 `semantic_maintenance` 使用同一套保留价值判断;同一件事只写一次。
|
|
29
29
|
> Core 不再因为归属、日期、任务依据或跨项目而丢弃整条候选:归属缺失会归一到证据里唯一被点名的项目、否则落 `global`;日期只接受能在本候选证据里找到出处、且能锚定成 ISO 的写法(`明天`、`周五`、`月底` 都会被解析),无法解析时只丢掉日期字段,记忆照常写入;未获授权的改归属沿用目标原归属。
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|