Repository navigation
Releases: ackstorm/ach-memory
Release list
v0.9.2
0.9.2
- Setup lives in the skill.
skills/ach-memory/SKILL.mdgains a Setup
section: install and update commands per host, the two connection modes
(ACH login through the LiteLLM gateway withACH_MEMORY_TOKEN_COMMAND, or a
static key), how to verify, and what eachUNAUTHORIZEDmeans. Its
description now also matches install/configure requests and missing or
unauthorized tools. - The update path is documented correctly. Re-running the install command
does not update Claude Code or Codex; README anddocs/hosts.mdnow give the
marketplace refresh + update commands. The README install section is
rewritten as connection, install, update and verify.
No service or proxy change; the release is documentation and the skill.
v0.9.1
0.9.1
- The proxy recognises its tools behind a gateway that renames them.
LiteLLM's MCP gateway lists the tools asach-memory.retainand so on, so
every check the proxy keys on a tool name missed:load_contextwent out
without the project slug (standing context lost its project section), a
successfulretainnever reset the idle reminder, and the no-project tool
set keptrename_project. The proxy ships with the server, so it now matches
listed names against this release's own tool set instead of parsing a
gateway-specific prefix. The host sees the canonical names; calls go out
under the name the remote listed.
No service change; the release is the proxy.
v0.9.0
0.9.0
- Short-lived credentials through a token helper.
ACH_MEMORY_TOKEN_COMMAND
names a command (e.g.ach-cli token) whose stdout is the credential. The
proxy runs it on every request to the remote, so the ACH Hub's 60-minute JWT
works for a session of any length. It wins overACH_MEMORY_API_KEY; with
it unset, the static key behaves exactly as before. A failing helper sends
no credential rather than a stale one. - The proxy starts through the LiteLLM MCP gateway. The gateway answers
server/discoverwith -32603; the handshake now falls back toinitialize,
so both the proxy andach-memory context loadwork against
https://api.ackstorm.ai/mcp/ach-memory.
No service change; the release is the proxy.
v0.8.0
0.8.0
- No project, personal memory only. When the stdio proxy resolves no project
slug (noMEMORY_PROJECT, no gitorigin), it now lists a reduced tool set:
scopeandproject_slugleave every schema,rename_projectis hidden, and
calls are pinned toscope="user". Therecallandload_context
descriptions drop their project wording. With a slug, nothing changes.
No service change; the release is the proxy.
v0.7.4
0.7.4
- The idle and pre-compact nudges no longer leak into the reply. Both
arrive as ordinary prompt context, so the model read them as something to
report and answered a bare "Hi" with "Nothing new has landed to retain in
memory."activation.txtbans retrieval narration, but that line covers
recall, not the hook text that prompts it — and it lands at session start,
turns away from the nudge it has to suppress. Each nudge now carries its own
"Internal nudge: act on it, say nothing about it.", in the CLI strings and in
the shell fallbacks that duplicate them.
No service change; the release is the hook text.
v0.7.3
0.7.3
/pluginnow sendscache-control: no-cache, so a release reaches hosts
that already installed. The URL is constant and the response carried only
last-modifiedand an etag, so npm's request cache (~/.npm/_cacache) held
the tarball fresh under heuristic freshness and answered reinstalls without
asking the service. 0.7.2 shipped the opencode fix and stayed invisible:
deleting opencode's package directory reinstalled 0.7.1 from the client cache,
with the endpoint itself serving 0.7.2 the whole time.no-cachemeans
revalidate, not "do not store" — the etag still answers304, so an unchanged
bundle costs one conditional request.- Anyone still on a cached 0.7.1/0.7.2 needs one manual clear, since the old
cached response is what decides whether the new one is fetched:
npm cache clean --force, then delete the host's package directory
(opencode:~/.cache/opencode/packages/https:/<host>/ach-memory/plugin) and
restart it. From 0.7.3 on, a restart is enough.
No service change beyond the header; the release is the plugin.
v0.7.2
0.7.2
- The idle nudge no longer kills the first prompt of an opencode session.
chat.messagepushed its nudge as{type, text, synthetic}, and opencode
validates every part of the user message inSessionPrompt.createUserMessage
before the request leaves the client: the missingid,sessionIDand
messageIDraised aSchemaError, then
EventV2.InvalidDurableEvent: Expected string aggregate field sessionID. The
host rendered that as "unexpected server error" — reproducible on the first
prompt of a session, the only one the idle clock lets the nudge through, and
invisible to the gateway, which never saw a request. The part now copies
sessionID/messageIDfrom the message it rides in and carries its own id.
tests/test_plugins.pyruns the hook under node and asserts the three ids. - Claude Code, Codex and pi were never affected: they take the nudge as hook
stdout or as a host message, not as a message part.
No service change; the release is the plugin.
v0.7.1
0.7.1
- The turn-finished retain nudge is gone. A
Stophook cannot reach the
model except throughdecision: "block"or exit 2, and the host renders
either as a hook error;Stopis deliberately excluded from the four events
whose stdout becomes context, so there was no other path. Rather than rework
it, the nudge is removed: 0.7.0's idle nudge already does the job on every
host through a supported path (UserPromptSubmit,chat.message,
before_agent_start) and rides into a turn the user already started, where
the turn-finished version cost an extra turn on all four hosts. Gone with it:
hooks/scripts/stop.sh,hooks/scripts/retain-nudge.sh, the
ach-memory hook retain-nudgesubcommand, opencode'ssession.idlehandler
and pi'sagent_settledhandler, and bothstop_hook_activeemulations those
two carried. - Breaking:
ACH_MEMORY_NUDGE_INTERVALno longer exists.
ACH_MEMORY_IDLE_INTERVAL(seconds, default1800) is now the only nudge
clock. Nothing is wired to the host's "turn finished" event. - What this gives up: nothing nudges when the user stops prompting altogether,
before a/clearor walking away. The idle stamp is keyed on the checkout
rather than the session, so the next prompt still nudges, even in a fresh
session; what is lost is retaining a claim whose context died with the
/clear. retainno longer rejects a URL whose userinfo carries no password.
scheme://user@hostis the shape of an ordinary ssh git remote, and naming a
repository's clone URL in a claim was refused as a secret with
CONTENT_REJECTED_BY_SANITIZERand no indication of which span offended. The
password form still rejects, and a token used as the username still trips the
token patterns.
No service change; the release is the plugin.
v0.7.0
0.7.0
-
Idle retain nudge. When nothing has been retained for a checkout in 30
minutes, the user's next prompt carries one reminder to retain whatever
durable claim has landed -- and then nothing for another 30 minutes in that
session. The stdio proxy stamps every successfulretain, so an agent that
saves as it goes never sees the reminder. It rides into the turn the user
just started, costing no extra turn:UserPromptSubmiton Claude Code and
Codex,chat.messageon opencode,before_agent_starton pi.
ACH_MEMORY_IDLE_INTERVAL(seconds, default1800) tunes it. TheStop
nudge from 0.6.0 is unchanged and independent; a retain it triggers resets
the idle clock. -
Session start says what this memory is. The activation text now opens
with "This memory replaces your own": ach-memory is the system of record,
host memory directories and built-in memory features are superseded and not
to be written to while the server is reachable, and a claim is retained the
moment it lands. Same text on all four hosts and for subagents
(hooks/activation.subagent.jsonis generated fromhooks/activation.txt;
a test holds them together). -
Codex: the new
UserPromptSubmithook needs trusting once (tin the
hooks review), like every other plugin hook. -
The service serves its own plugin bundle at
/plugin. Annpm pack
tarball of this tree, packed outside the image (make plugin-tarball) and
copied in as one artifact, so a host can install over plain HTTPS with no
git and no registry, and the bundle can never disagree with the service it
is configured against. The documented service prefix moves to
/ach-memory; seedocs/hosts.md.
Service change: a production roll is required for /plugin.
v0.6.0
0.6.0
- Periodic retain nudge. Every host now asks the agent, at most once every
15 minutes per session, to retain whatever durable claim it has not stored
yet -- a decision with its rationale, a constraint, a convention, a verified
gotcha, a fact not cheaply rediscoverable, or a dated landmark -- and to
store nothing otherwise./clearhas no hook that gives the agent a turn,
andPreCompactnever fires on it, so a long session used to lose what it
had learned the moment the context went. The nudge is the same text on
every host (ach-memory hook retain-nudge) and the throttle lives in one
place (hooks/scripts/retain-nudge.sh).ACH_MEMORY_NUDGE_INTERVAL
(seconds, default900) tunes it. - Wired as the host's "turn finished" event, never on prompt submission.
Claude Code and Codex:Stop, whose stdout never reaches the model, so the
nudge travels as{"decision": "block", "reason"}and costs one extra turn
(hooks/scripts/stop.sh;stop_hook_activeends it). opencode:
session.idleplusclient.session.promptAsync. pi:agent_settledplus
pi.sendMessage(..., {triggerTurn: true}). Both emulations carry their own
loop guard, so a short interval nudges once per turn at worst, never forever. - Codex trusts hooks per definition: after updating, open Codex once and press
tin the hooks review. Until thenStop-- and any other untrusted plugin
hook -- stays inactive. docs/hosts.md: the matrix row, and pi's compaction event is "not wired",
not "does not exist" -- pi exposessession_before_compact.
No service change; the release is the plugin.