3ngram 1.2.1
3ngram v1.2.1
Minor release: the MCP retrieval surface v2 (epic #42). Agents pulling context
no longer hit hard walls — every read tool is now bounded, tunable, and
pageable, and truncated results are always followable to full content.
(v1.2.0 was tagged but never published: its release image failed the
vulnerability-scan gate on a transitive dependency. v1.2.1 is the first
published version of this line and additionally forces ip-address to 10.3.1,
fixing CVE-2026-69192.)
Changes
- New MCP tool
get_memories— batched full-content read by id (up to 20
ids, per-itemmaxContentChars). Atruncated: truesearch or handoff hit
is no longer a dead end. Unknown and cross-tenant ids land innotFoundas
data, never an error. - Briefing/handoff bounds are caller-tunable —
sectionLimit(up to 100,
previously a fixed cap of 25),sectionsselection onbriefing(compute
only what you need),hasMore+ exactcountper briefing section, and
exactcounts+ per-sectiontruncatedflags onhandoff. - Search filters v2 —
memoryTypes[](multi-type OR) and
recordedAfter/recordedBeforerange filters, on MCPsearchand the REST
list endpoint alike. Filters narrow candidates before ranking fusion; the
ranking itself is unchanged. - Search pagination — an opaque
cursorwith frozen-pool ordering (no
duplicates or skips under concurrent writes) plus aprojection: 'compact'
mode that omits hit content for cheap broad scans; scan compact, then
get_memoriesthe interesting ids. scope_projectselector — scope AND project together, with an
includeUnscoped: trueopt-in that surfaces NULL-project memories in
project-filtered briefings and handoffs.- Per-user retrieval-scope policy —
configure_scopegains
set_retrieval_default: modedefaultfills unscoped reads with your
default scope and echoesappliedScope(never silent);requirerejects
unscoped reads with a typed error naming the registered scopes;off
preserves shipped behavior exactly. - Stale-candidate allowlist — briefing
staleCandidatesnow only proposes
reviewable types (decision,preference,blocker,fact) instead of
every aging memory. - Recorded-range hardening — both transports reject inverted ranges and
sub-millisecond precision at the schema boundary.
Upgrade notes
- New database migration
0030_user_retrieval_policy. Self-hosters: run
the migrations step (docker compose … run --rm migrations) before starting
the new server, as in the standard upgrade flow. - All shipped tool contracts are unchanged (byte-stable): new fields and
selector variants are additive and optional.
Release artifacts
@3ngram/server@1.2.1,@3ngram/sdk@1.2.1, and3ngram@1.2.1on npm@3ngram/db@0.7.0,@3ngram/core@0.7.0, and@3ngram/schema@0.6.0on npm@3ngram/config@0.2.3and@3ngram/llm@0.2.2on npmghcr.io/b3dmar/3ngram:1.2.1for Linux amd64 and arm64- BuildKit SBOM plus provenance and GitHub-signed SLSA attestations
The hosted 3ngram dashboard and cloud-operations code are proprietary and are
not included in this repository.
Immutable container reference
ghcr.io/b3dmar/3ngram@sha256:9b006cf0107fe5f04f6fecc1c723e83bfe041ce1ec7ecc39b0b81620c99a55ff