0ef5fcb1c5
Security / Dependency audit (pip-audit) (push) Has been cancelled
Security / CodeQL (javascript-typescript) (push) Has been cancelled
Security / CodeQL (python) (push) Has been cancelled
Security / Secret scan (gitleaks) (push) Has been cancelled
rust / test (ubuntu) (push) Has been cancelled
rust / simulator e2e (macos-latest) (push) Has been cancelled
rust / simulator e2e (ubuntu-latest) (push) Has been cancelled
rust / simulator e2e (windows-latest) (push) Has been cancelled
rust / wheels (aarch64-apple-darwin) (push) Has been cancelled
rust / wheels (x86_64-unknown-linux-gnu) (push) Has been cancelled
rust / wheels (x86_64-apple-darwin) (push) Has been cancelled
rust / audit (push) Has been cancelled
rust / parity (nightly, allowed to fail during Phase 0) (push) Has been cancelled
CI / commitlint (push) Has been skipped
Dev Containers / validate (.devcontainer/devcontainer.json, default) (push) Failing after 0s
Dev Containers / validate (.devcontainer/memory-stack/devcontainer.json, memory-stack) (push) Failing after 0s
Dev Containers / validate-worktree (push) Failing after 0s
CI / changes (push) Failing after 4s
Deploy Documentation / validate (push) Has been skipped
Deploy Documentation / deploy (push) Failing after 1s
Init Native E2E / init-native (ubuntu-latest, claude) (push) Failing after 1s
Init Native E2E / init-native (ubuntu-latest, codex) (push) Failing after 1s
Install Native E2E / install-native (ubuntu-latest) (push) Failing after 1s
OpenCode Plugin / typecheck + build + test (push) Failing after 1s
Init Native E2E / init-native (ubuntu-latest, copilot) (push) Failing after 1s
Release Please / release-please (push) Failing after 1s
Wrap E2E / docker-wrap-e2e (push) Failing after 1s
Wrap Native E2E / wrap-native (ubuntu-latest) (push) Failing after 1s
Init E2E / docker-init-e2e (push) Failing after 4s
Merge Conflicts / merge-conflicts (push) Failing after 4s
CI / lint (push) Has been cancelled
CI / build-wheel (push) Has been cancelled
CI / build-wheel-windows (push) Has been cancelled
CI / prefetch-model (push) Has been cancelled
CI / test-dashboard-ui (push) Has been cancelled
CI / test (1) (push) Has been cancelled
CI / test (2) (push) Has been cancelled
CI / test (3) (push) Has been cancelled
CI / test (4) (push) Has been cancelled
CI / test-extras (push) Has been cancelled
CI / test-agno (push) Has been cancelled
CI / build (push) Has been cancelled
CI / workflow-validation (push) Has been cancelled
CI / docker-native-e2e (push) Has been cancelled
CI / windows-native-wrapper (push) Has been cancelled
CI / macos-native-wrapper (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code-nonroot name:code-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code-slim name:code-slim]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code-slim-nonroot name:code-slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-nonroot name:nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-slim name:slim]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-slim-nonroot name:slim-nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime name:]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code name:code]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code-nonroot name:code-nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code-slim name:code-slim]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code-slim-nonroot name:code-slim-nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-nonroot name:nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-slim name:slim]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-slim-nonroot name:slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime name:]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code name:code]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code-nonroot name:code-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code-slim name:code-slim]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code-slim-nonroot name:code-slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-nonroot name:nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-slim name:slim]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-slim-nonroot name:slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime name:]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code name:code]) (push) Has been cancelled
Docker / promote-latest (push) Has been cancelled
Init Native E2E / init-native (macos-latest, claude) (push) Has been cancelled
Init Native E2E / init-native (macos-latest, codex) (push) Has been cancelled
Init Native E2E / init-native (macos-latest, copilot) (push) Has been cancelled
Install Native E2E / install-native (macos-latest) (push) Has been cancelled
Wrap Native E2E / wrap-native (macos-latest) (push) Has been cancelled
98 lines
3.5 KiB
Python
98 lines
3.5 KiB
Python
"""``MemoryQuery``: multi-source, full-fidelity retrieval query.
|
|
|
|
Pre-this-PR, the retrieval query was "latest user message, truncated
|
|
to 500 chars" (memory_handler.py:807). The truncation was a real bug
|
|
— none of Letta / Mem0 / Cognee / Supermemory truncate the embedding
|
|
input. Tool outputs are often the strongest retrieval signal in
|
|
coding sessions, and they were ignored entirely.
|
|
|
|
This value type captures the query at full fidelity from three
|
|
sources:
|
|
|
|
* ``user_text`` — latest user message, untruncated
|
|
* ``recent_tool_outputs`` — last N tool results
|
|
* ``recent_assistant_turns`` — last K assistant turns for intent
|
|
|
|
The embedding model handles its own context window (MiniLM 512 tok;
|
|
BGE-small 8K tok). Long inputs that exceed the model window become
|
|
the model's problem to mean-pool or chunk — they don't get
|
|
truncated upstream.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from typing import Any
|
|
|
|
from .memory_query_policy import (
|
|
extract_memory_query_sources,
|
|
render_embedding_input,
|
|
)
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class MemoryQuery:
|
|
"""Frozen multi-source query for memory retrieval.
|
|
|
|
All fields preserve full input fidelity — no truncation, no
|
|
summarization. The caller assembles the sources; this type only
|
|
holds them. The retrieval backend decides how to embed
|
|
(mean-pool, chunk, model-side truncation, etc.) but cannot lose
|
|
information before it sees the data.
|
|
|
|
Tuples for the recent-* fields so the dataclass stays hashable
|
|
(frozen + value-equal).
|
|
"""
|
|
|
|
user_text: str
|
|
recent_tool_outputs: tuple[str, ...]
|
|
recent_assistant_turns: tuple[str, ...]
|
|
conversation_id: str | None
|
|
|
|
def to_embedding_input(self) -> str:
|
|
"""Concatenate sources into a delimited embedding input.
|
|
|
|
Order: prior assistant turns (oldest first) → tool outputs
|
|
(oldest first) → latest user text. User text last because the
|
|
embedder's positional weighting often emphasizes the tail of
|
|
the input.
|
|
"""
|
|
return render_embedding_input(
|
|
user_text=self.user_text,
|
|
recent_tool_outputs=self.recent_tool_outputs,
|
|
recent_assistant_turns=self.recent_assistant_turns,
|
|
)
|
|
|
|
@classmethod
|
|
def from_messages(
|
|
cls,
|
|
messages: list[dict[str, Any]] | None,
|
|
*,
|
|
lookback_assistant: int = 2,
|
|
lookback_tools: int = 3,
|
|
conversation_id: str | None = None,
|
|
) -> MemoryQuery:
|
|
"""Construct a MemoryQuery from a chat-style messages list.
|
|
|
|
Walks the message list once. Extracts:
|
|
* Latest ``role: user`` message → ``user_text``
|
|
* Up to ``lookback_assistant`` most recent assistant turns →
|
|
``recent_assistant_turns`` (chronological order)
|
|
* Up to ``lookback_tools`` most recent tool outputs →
|
|
``recent_tool_outputs`` (chronological order)
|
|
|
|
Handles both OpenAI shape (``role: tool``) and Anthropic shape
|
|
(``tool_result`` content block inside a ``role: user`` message).
|
|
"""
|
|
user_text, recent_tool_outputs, recent_assistant_turns = extract_memory_query_sources(
|
|
messages,
|
|
lookback_assistant=lookback_assistant,
|
|
lookback_tools=lookback_tools,
|
|
)
|
|
return cls(
|
|
user_text=user_text,
|
|
recent_tool_outputs=recent_tool_outputs,
|
|
recent_assistant_turns=recent_assistant_turns,
|
|
conversation_id=conversation_id,
|
|
)
|