diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e774c9..727eaec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,43 @@ Pre-v1.0.0 tags followed the pi npm version (`v{pi_version}[letter]`). --- +## v1.2.2 — 2026-06-24 + +Patch release: pick up **pi `0.80.2`** (npm `latest`) and **mempalace `3.5.0`**, +and drop the now-obsolete `diary_write` schema workaround — the upstream fix +shipped. + +### Changed + +- **mempalace pin `3.4.0` → `3.5.0`.** mempalace 3.5.0 carries the upstream + fix for the top-level-`anyOf` `diary_write` schema + ([issue #1728](https://github.com/MemPalace/mempalace/issues/1728) / + [PR #1717](https://github.com/MemPalace/mempalace/pull/1717), merged + 2026-06-14). The advertised schema is now `"required": ["agent_name"]` with + `entry`/`content` enforced at dispatch instead of via a root-level `anyOf`, + which Anthropic's tools API accepts. Verified against the published 3.5.0 + wheel's `mcp_server.py` before removing the workaround. +- **pi `0.79.10` → `0.80.2`**, auto-resolved from npm `latest` at build time + (no pin in the repo; CI's `resolve-versions` job fetches it). + +### Removed + +- **The `diary_write` top-level-`anyOf` workaround in `Dockerfile.base`.** The + `perl` patch that rewrote the installed `mcp_server.py` (needed while + mempalace 3.3.x/3.4.0 advertised a top-level `anyOf` that Anthropic rejects, + failing tool registration at session start) is gone, since 3.5.0 fixes it at + the source. Keep `MEMPALACE_VERSION` in lockstep with opencode-devbox. + +### Notes + +- Unrelated to this release: a *stalled* `mempalace-mcp` (e.g. a slow virtiofs + cold-open of `chroma.sqlite3`) surfaces as `mempalace-mcp not available` + because the `mempalace.ts` extension's per-request timeout kills the child + and flips `available=false` until pi is restarted — this is the 2026-06-13 + stall-protection behaving as designed, not the `anyOf` bug. + +--- + ## v1.2.1 — 2026-06-22 Patch release: close the fork/recall + mempalace **under-utilisation gap** in diff --git a/Dockerfile.base b/Dockerfile.base index 52bb4d5..63614c5 100644 --- a/Dockerfile.base +++ b/Dockerfile.base @@ -301,9 +301,16 @@ RUN ARCH=$(case "${TARGETARCH}" in amd64) echo "x86_64" ;; arm64) echo "aarch64" ARG INSTALL_MEMPALACE=true # Pin to a known-good version. Bump deliberately, not implicitly: an # unpinned install silently swept in mempalace 3.3.x/3.4.0 with a broken -# diary_write schema (see workaround RUN below + issue #1728). Pinning -# makes mempalace upgrades a reviewable diff rather than a surprise. -ARG MEMPALACE_VERSION=3.4.0 +# diary_write schema. Pinning makes mempalace upgrades a reviewable diff +# rather than a surprise. +# +# 3.5.0 (2026-06) ships the upstream fix for the top-level-anyOf diary_write +# schema (issue #1728 / PR #1717, merged 2026-06-14): the advertised schema +# is now `"required": ["agent_name"]` with entry/content enforced at dispatch, +# which Anthropic's tools API accepts — so the old mcp_server.py perl +# workaround that used to live below is gone. Keep in lockstep with +# opencode-devbox when bumping. +ARG MEMPALACE_VERSION=3.5.0 ENV UV_TOOL_DIR=/opt/uv-tools ENV UV_TOOL_BIN_DIR=/usr/local/bin RUN if [ "${INSTALL_MEMPALACE}" = "true" ]; then \ @@ -312,41 +319,9 @@ RUN if [ "${INSTALL_MEMPALACE}" = "true" ]; then \ /opt/uv-tools/mempalace/bin/python -c "import mempalace; print('mempalace', mempalace.__version__ if hasattr(mempalace, '__version__') else 'installed')" ; \ fi -# ── workaround: strip top-level anyOf from mempalace_diary_write schema ── -# Mempalace 3.3.x/3.4.0 advertise diary_write's input_schema with a -# top-level `anyOf: [{required:[entry]}, {required:[content]}]` to express -# "either entry or content must be supplied". Anthropic's tools API rejects -# top-level anyOf/oneOf/allOf, so pi/Claude fail at session start with -# `tools..custom.input_schema: input_schema does not support oneOf, -# allOf, or anyOf at the top level`. -# -# Patch the advertised schema to require ["agent_name", "entry"] and remove -# the anyOf block. The handler keeps accepting `content` server-side as a -# kwarg alias so existing callers still work. -# -# Idempotent and self-deactivating: once upstream releases the fix the -# regex no longer matches (and the WARN below fires) — that's the signal -# to delete this RUN. -# Upstream status (last checked 2026-06-14): -# issue #1728 — STILL OPEN (root-level anyOf rejected by Anthropic/Codex) -# PR #1735 — CLOSED UNMERGED 2026-06-11; do NOT watch it (dead) -# PR #1717 — open; the current live fix candidate to watch -# mempalace PyPI latest = 3.4.0 (== our pin) → no release contains the fix yet -# https://github.com/MemPalace/mempalace/issues/1728 -# https://github.com/MemPalace/mempalace/pull/1717 -# TODO: remove this RUN once a mempalace release > 3.4.0 that actually strips -# the root-level anyOf ships on PyPI and is installed by the line above. -# Keep MEMPALACE_VERSION in lockstep with opencode-devbox when bumping. -RUN if [ "${INSTALL_MEMPALACE}" = "true" ]; then \ - MP_FILE="$(find /opt/uv-tools/mempalace -path '*/mempalace/mcp_server.py' | head -n1)" && \ - if [ -z "$MP_FILE" ]; then echo "mempalace mcp_server.py not found" >&2; exit 1; fi && \ - perl -0777 -i -pe 's/(?:[ \t]*\#[^\n]*\n)*[ \t]*"required":\s*\[\s*"agent_name"\s*\]\s*,\s*\n[ \t]*"anyOf":\s*\[\s*\n[ \t]*\{\s*"required":\s*\[\s*"entry"\s*\]\s*\}\s*,\s*\n[ \t]*\{\s*"required":\s*\[\s*"content"\s*\]\s*\}\s*,?\s*\n[ \t]*\]\s*,\s*\n/ "required": ["agent_name", "entry"],\n/s' "$MP_FILE" && \ - if grep -q '"required": \["agent_name", "entry"\]' "$MP_FILE"; then \ - echo "mempalace diary_write anyOf workaround: applied (or already clean)"; \ - else \ - echo "WARN: mempalace diary_write anyOf workaround did not match expected schema — upstream may have changed shape" >&2; \ - fi ; \ - fi +# (The mempalace diary_write top-level-anyOf workaround that patched +# mcp_server.py here was removed in v1.2.2 — fixed upstream in mempalace +# 3.5.0 via issue #1728 / PR #1717 (merged 2026-06-14). See CHANGELOG.md.) # ── mempalace-toolkit — bash wrappers for session/docs mining ──────── ARG INSTALL_MEMPALACE_TOOLKIT=true