memleaf 0.2.45__tar.gz → 0.2.46__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.45 → memleaf-0.2.46}/CHANGELOG.md +7 -0
- {memleaf-0.2.45/src/memleaf.egg-info → memleaf-0.2.46}/PKG-INFO +2 -2
- {memleaf-0.2.45 → memleaf-0.2.46}/README.en.md +1 -1
- {memleaf-0.2.45 → memleaf-0.2.46}/README.md +1 -1
- {memleaf-0.2.45 → memleaf-0.2.46}/pyproject.toml +1 -1
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/__init__.py +1 -1
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/cli.py +16 -2
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/hermes_provider/plugin.yaml +1 -1
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/installer.py +34 -12
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/model_capabilities.py +10 -0
- {memleaf-0.2.45 → memleaf-0.2.46/src/memleaf.egg-info}/PKG-INFO +2 -2
- {memleaf-0.2.45 → memleaf-0.2.46}/LICENSE +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/MANIFEST.in +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/docs/capture-budget-design.md +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/docs/config-migrations.md +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/docs/core-refactor.md +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/docs/evidence-retention.md +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/docs/extraction-latency.md +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/docs/gate-evidence-boundary.md +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/docs/general-processing.md +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/docs/hermes-mcp-runtime.md +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/docs/processing-quality-acceptance.md +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/docs/v0.2.26-processing-status.md +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/examples/README.md +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/examples/basic_usage.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/examples/mcp_stdio.ndjson +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/install.ps1 +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/install.sh +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/setup.cfg +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/__main__.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/adapters/__init__.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/adapters/antigravity.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/adapters/base.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/adapters/codex.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/adapters/hermes.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/admission.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/batch_review.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/budget.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/capture.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/compaction.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/config.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/create_coordinator.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/credentials.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/evidence_budget.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/evidence_policy.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/evidence_structure.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/evidence_syntax.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/extraction_budget.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/extraction_capability.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/extraction_work_state.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/frontmatter.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/hermes_provider/README.md +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/hermes_provider/__init__.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/hermes_provider/_mcp_client.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/hermes_provider/_provider.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/hermes_provider/_shared.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/hermes_provider/evidence_budget.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/hermes_runtime.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/host_events.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/host_runtime.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/inbox.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/index.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/inspection.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/llm/__init__.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/llm/base.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/llm/claude_compatible.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/llm/gemini.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/llm/openai_compatible.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/llm/router.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/llm/thinking.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/locking.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/mcp_server.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/memory_commit.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/memory_planner.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/memory_writer.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/model_discovery.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/model_execution.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/models.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/native_index.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/native_registration.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/parallel_model.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/planning_context.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/process_common.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/process_jobs.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/process_journal.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/process_owner.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/processing.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/prompts.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/provenance.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/recording_policy.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/redaction.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/retention.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/retrieval.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/retrieval_gate.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/scope_maintenance.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/scope_state.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/service.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/single_pass_memory_planner.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/single_pass_plan.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/source_policy.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/state_layout.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/summary_batch.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/target_reconciliation.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/turn_audit.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/turn_plan.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/update_coordinator.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/update_review.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/validation.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf/vault.py +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf.egg-info/SOURCES.txt +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf.egg-info/dependency_links.txt +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf.egg-info/entry_points.txt +0 -0
- {memleaf-0.2.45 → memleaf-0.2.46}/src/memleaf.egg-info/top_level.txt +0 -0
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to memleaf are documented here.
|
|
4
4
|
|
|
5
|
+
## 0.2.46 — 2026-09-12
|
|
6
|
+
|
|
7
|
+
- Restore the host protocol literals that v0.2.45 dropped from the API-route protocol table. `anthropic_messages`, `chat_completions`, `chat`, `google` and `generate_content` resolve again. v0.2.45 replaced the previous tolerant mapping with an exact table that omitted every canonical Hermes `api_mode` value, so a Hermes custom provider that used to resolve to a protocol began resolving to none and was reported as `missing provider, base URL, protocol, or model`. Substring and model-name matching stay removed: only exact host-contract literals are accepted, and an unknown protocol still fails closed.
|
|
8
|
+
- Stop `memleaf install --host hermes` from aborting when model-route discovery finds nothing. Installation now continues and reports `processing_status: model_route_required` with an explicit user action, matching the Codex installer policy. Previously the install returned `stage: model_route` before touching the provider, which left the core package upgraded while the Hermes provider stayed on its previous version. The provider and MCP surface do not need a model route for capture or retrieval, so a missing route is a deferred configuration step rather than an installation failure.
|
|
9
|
+
- Add `install --no-model-discovery` so an upgrade can skip host model discovery while still preserving an existing memleaf route, matching the `init` flag that already existed. Discovery remains enabled by default, so an installation that already succeeds is unaffected.
|
|
10
|
+
- Verification for this release used synthetic Hermes-shaped routes, a temporary Vault and mocked host calls only: 18 focused tests cover the restored protocol literals, rejection of still-unknown protocols, discovery of a Hermes-shaped custom provider, the degraded-install decision, the new CLI flag, and an end-to-end assertion that `install_hermes` walks past a failed model route. No real provider call was made and no production Vault, Hermes configuration or session was read or written. A real Windows Hermes install and a real macOS Hermes install remain unverified by this release, and the manual model-route configuration step is still required on a host whose credentials the host CLI only reports masked.
|
|
11
|
+
|
|
5
12
|
## 0.2.45 — 2026-09-12
|
|
6
13
|
|
|
7
14
|
- Repair the `b3-single-pass-v1` automatic extraction contract so model output is constrained by the same CREATE / UPDATE / NO_CHANGE / DEFERRED fields, evidence shapes, no-memory/defer reasons, target rules and lookup-completeness checks that Core validates. Pure ASCII decision-case differences are normalized locally; unknown decisions and missing semantic fields still fail closed.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: memleaf
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.46
|
|
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.46。**
|
|
27
27
|
> 记忆只从用户与 Agent 的可见对话提炼。Agent 已在回复中整理的事实、项目进展和明确待办可作为来源;邮件、附件、网页和终端等工具原文不进入记忆提炼。模型负责保留原话中的不确定性,现有记忆仅用于比较、去重和更新。Markdown 仍是唯一事实源。
|
|
28
28
|
> **当前版本支持 Hermes 和 Codex。** Antigravity(反重力)不检测、不安装、不配置。
|
|
29
29
|
|
|
@@ -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.46.**
|
|
8
8
|
> Automatic extraction now uses only the current turn's visible user input and final assistant reply. Raw tool output, attachments, web/file/terminal payloads and legacy tool-evidence bodies are not new source evidence; existing or retrieved memory remains comparison context rather than source authority. Background processing is persisted as a local job and can be checked through the read-only `process_status` MCP tool; failed work remains retryable and fail closed. The release also tightens source/date grounding, target reconciliation, duplicate/no-op handling and semantic review before writes. Markdown remains the sole source of truth with no SQLite runtime dependency. Acceptance covers deterministic regression suites and synthetic inputs; it does not claim real-mail or customer-business acceptance.
|
|
9
9
|
> **The current release supports Hermes and Codex.** Antigravity is not detected, installed, or configured.
|
|
10
10
|
|
|
@@ -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.46。**
|
|
8
8
|
> 记忆只从用户与 Agent 的可见对话提炼。Agent 已在回复中整理的事实、项目进展和明确待办可作为来源;邮件、附件、网页和终端等工具原文不进入记忆提炼。模型负责保留原话中的不确定性,现有记忆仅用于比较、去重和更新。Markdown 仍是唯一事实源。
|
|
9
9
|
> **当前版本支持 Hermes 和 Codex。** Antigravity(反重力)不检测、不安装、不配置。
|
|
10
10
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Local-first Markdown memory core for AI agents."""
|
|
2
2
|
|
|
3
|
-
__version__ = "0.2.
|
|
3
|
+
__version__ = "0.2.46"
|
|
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
|
|
@@ -77,6 +77,14 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
77
77
|
"this installation (current), or retain a version-matched configured runtime (existing)"
|
|
78
78
|
),
|
|
79
79
|
)
|
|
80
|
+
install.add_argument(
|
|
81
|
+
"--no-model-discovery",
|
|
82
|
+
action="store_true",
|
|
83
|
+
help=(
|
|
84
|
+
"Hermes only: skip host model discovery; an existing memleaf route is "
|
|
85
|
+
"still preserved and the install continues either way"
|
|
86
|
+
),
|
|
87
|
+
)
|
|
80
88
|
install.add_argument("--json", action="store_true", help="emit one JSON result")
|
|
81
89
|
audit = commands.add_parser("audit", help="inspect an existing Vault without changing it")
|
|
82
90
|
audit.add_argument("--vault", type=Path, default=None)
|
|
@@ -232,6 +240,8 @@ def main(argv: Sequence[str] | None = None) -> int:
|
|
|
232
240
|
install_kwargs = {"vault_path": args.vault}
|
|
233
241
|
if args.mcp_runtime != "auto":
|
|
234
242
|
install_kwargs["mcp_runtime"] = args.mcp_runtime
|
|
243
|
+
if args.no_model_discovery:
|
|
244
|
+
install_kwargs["skip_model_discovery"] = True
|
|
235
245
|
output = install_hermes(**install_kwargs)
|
|
236
246
|
elif args.command in {"audit", "process"}:
|
|
237
247
|
from .inspection import audit_vault, existing_root, preview_process
|
|
@@ -302,8 +312,12 @@ def main(argv: Sequence[str] | None = None) -> int:
|
|
|
302
312
|
print("Restart Hermes to use memleaf.")
|
|
303
313
|
elif output.get("user_action_required"):
|
|
304
314
|
print(f"Codex action required: {output.get('user_action')}")
|
|
305
|
-
if output.get("
|
|
306
|
-
print(
|
|
315
|
+
if output.get("processing_status") == "model_route_required":
|
|
316
|
+
print(
|
|
317
|
+
"Automatic memory extraction needs a memleaf model route before it can run. "
|
|
318
|
+
"Set llm.provider/family/protocol/base_url/model/key in the Vault config.yaml, "
|
|
319
|
+
"or rerun `memleaf init` from an interactive terminal."
|
|
320
|
+
)
|
|
307
321
|
else:
|
|
308
322
|
_print_install_failure(output, host=args.host)
|
|
309
323
|
return 0 if output.get("status") in {"configured", "already_configured"} else 2
|
|
@@ -15,7 +15,7 @@ import subprocess
|
|
|
15
15
|
import sys
|
|
16
16
|
import sysconfig
|
|
17
17
|
import tempfile
|
|
18
|
-
from typing import Any
|
|
18
|
+
from typing import Any, Mapping
|
|
19
19
|
|
|
20
20
|
from . import __version__
|
|
21
21
|
from .adapters.base import (
|
|
@@ -754,10 +754,33 @@ def _failure_result(
|
|
|
754
754
|
return result
|
|
755
755
|
|
|
756
756
|
|
|
757
|
+
def _model_route_outcome(model: Any) -> tuple[bool, str, str | None]:
|
|
758
|
+
"""Decide how one host installation reports its model route.
|
|
759
|
+
|
|
760
|
+
A missing model route must never block installing the host integration.
|
|
761
|
+
The provider/MCP surface still serves capture and retrieval without one,
|
|
762
|
+
so installation continues and reports ``model_route_required`` until a
|
|
763
|
+
route is configured. This is the documented Codex policy, and applying it
|
|
764
|
+
to Hermes keeps the two hosts consistent instead of aborting the install
|
|
765
|
+
and leaving core and provider versions out of step.
|
|
766
|
+
"""
|
|
767
|
+
|
|
768
|
+
if isinstance(model, Mapping) and model.get("status") in {"configured", "already_configured"}:
|
|
769
|
+
return True, "ready", None
|
|
770
|
+
return (
|
|
771
|
+
False,
|
|
772
|
+
"model_route_required",
|
|
773
|
+
"Configure an independent memleaf Model Route for this Vault before relying on "
|
|
774
|
+
"automatic memory extraction. Host model/provider settings are intentionally "
|
|
775
|
+
"not used or modified.",
|
|
776
|
+
)
|
|
777
|
+
|
|
778
|
+
|
|
757
779
|
def install_hermes(
|
|
758
780
|
*,
|
|
759
781
|
vault_path: Path | None = None,
|
|
760
782
|
mcp_runtime: str = "auto",
|
|
783
|
+
skip_model_discovery: bool = False,
|
|
761
784
|
) -> dict[str, Any]:
|
|
762
785
|
"""Install memleaf for Hermes with runtime preflight and host rollback.
|
|
763
786
|
|
|
@@ -870,18 +893,14 @@ def install_hermes(
|
|
|
870
893
|
home=home,
|
|
871
894
|
dry_run=False,
|
|
872
895
|
non_interactive=not sys.stdin.isatty(),
|
|
873
|
-
skip_discovery=
|
|
896
|
+
skip_discovery=skip_model_discovery,
|
|
874
897
|
)
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
vault_source=vault_source,
|
|
882
|
-
model=model,
|
|
883
|
-
mcp_runtime=runtime_details,
|
|
884
|
-
)
|
|
898
|
+
# A missing route degrades the installation instead of aborting it: the
|
|
899
|
+
# Hermes provider and MCP surface do not need a model route, and stopping
|
|
900
|
+
# here used to leave core and provider versions out of step.
|
|
901
|
+
model_ready, processing_status, model_action = _model_route_outcome(model)
|
|
902
|
+
# ``model_ready`` is reported through ``processing_status`` below; the host
|
|
903
|
+
# integration itself is configured either way.
|
|
885
904
|
|
|
886
905
|
provider_target = hermes_home / "plugins" / "memleaf"
|
|
887
906
|
provider_config = hermes_home / "memleaf.json"
|
|
@@ -1079,6 +1098,9 @@ def install_hermes(
|
|
|
1079
1098
|
"model": model,
|
|
1080
1099
|
"native_sources": native_registration,
|
|
1081
1100
|
"capture": capture_policy_status(vault.config()),
|
|
1101
|
+
"processing_status": processing_status,
|
|
1102
|
+
"user_action_required": bool(model_action),
|
|
1103
|
+
"user_action": model_action,
|
|
1082
1104
|
}
|
|
1083
1105
|
|
|
1084
1106
|
|
|
@@ -36,13 +36,23 @@ _LEGACY_PROVIDER_PROTOCOL = {
|
|
|
36
36
|
"google": "gemini",
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
# Exact protocol identities, including the canonical ``api_mode`` literals a
|
|
40
|
+
# Hermes configuration actually stores (``chat_completions`` and
|
|
41
|
+
# ``anthropic_messages``). These are host-contract literals, not fuzzy
|
|
42
|
+
# guesses: substring and model-name matching stay removed so a custom alias can
|
|
43
|
+
# never authorize a protocol it does not name.
|
|
39
44
|
_PROTOCOL_ALIASES = {
|
|
40
45
|
"openai": "openai",
|
|
41
46
|
"openai-compatible": "openai",
|
|
42
47
|
"openai_compatible": "openai",
|
|
48
|
+
"chat_completions": "openai",
|
|
49
|
+
"chat": "openai",
|
|
43
50
|
"claude": "claude",
|
|
44
51
|
"anthropic": "claude",
|
|
52
|
+
"anthropic_messages": "claude",
|
|
45
53
|
"gemini": "gemini",
|
|
54
|
+
"google": "gemini",
|
|
55
|
+
"generate_content": "gemini",
|
|
46
56
|
}
|
|
47
57
|
|
|
48
58
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: memleaf
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.46
|
|
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.46。**
|
|
27
27
|
> 记忆只从用户与 Agent 的可见对话提炼。Agent 已在回复中整理的事实、项目进展和明确待办可作为来源;邮件、附件、网页和终端等工具原文不进入记忆提炼。模型负责保留原话中的不确定性,现有记忆仅用于比较、去重和更新。Markdown 仍是唯一事实源。
|
|
28
28
|
> **当前版本支持 Hermes 和 Codex。** Antigravity(反重力)不检测、不安装、不配置。
|
|
29
29
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|