Skip to content

Releases: ackstorm/ach-memory

v0.9.2

Choose a tag to compare

@github-actions github-actions released this 09 Oct 10:55

0.9.2

  • Setup lives in the skill. skills/ach-memory/SKILL.md gains a Setup
    section: install and update commands per host, the two connection modes
    (ACH login through the LiteLLM gateway with ACH_MEMORY_TOKEN_COMMAND, or a
    static key), how to verify, and what each UNAUTHORIZED means. 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 and docs/hosts.md now 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

Choose a tag to compare

@github-actions github-actions released this 09 Oct 10:42

0.9.1

  • The proxy recognises its tools behind a gateway that renames them.
    LiteLLM's MCP gateway lists the tools as ach-memory.retain and so on, so
    every check the proxy keys on a tool name missed: load_context went out
    without the project slug (standing context lost its project section), a
    successful retain never reset the idle reminder, and the no-project tool
    set kept rename_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

Choose a tag to compare

@github-actions github-actions released this 09 Oct 10:09

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 over ACH_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/discover with -32603; the handshake now falls back to initialize,
    so both the proxy and ach-memory context load work against
    https://api.ackstorm.ai/mcp/ach-memory.

No service change; the release is the proxy.

v0.8.0

Choose a tag to compare

@github-actions github-actions released this 07 Oct 07:19

0.8.0

  • No project, personal memory only. When the stdio proxy resolves no project
    slug (no MEMORY_PROJECT, no git origin), it now lists a reduced tool set:
    scope and project_slug leave every schema, rename_project is hidden, and
    calls are pinned to scope="user". The recall and load_context
    descriptions drop their project wording. With a slug, nothing changes.

No service change; the release is the proxy.

v0.7.4

Choose a tag to compare

@github-actions github-actions released this 21 Sep 20:01

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.txt bans 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

Choose a tag to compare

@github-actions github-actions released this 21 Sep 19:55

0.7.3

  • /plugin now sends cache-control: no-cache, so a release reaches hosts
    that already installed.
    The URL is constant and the response carried only
    last-modified and 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-cache means
    revalidate, not "do not store" — the etag still answers 304, 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

Choose a tag to compare

@github-actions github-actions released this 21 Sep 19:40

0.7.2

  • The idle nudge no longer kills the first prompt of an opencode session.
    chat.message pushed its nudge as {type, text, synthetic}, and opencode
    validates every part of the user message in SessionPrompt.createUserMessage
    before the request leaves the client: the missing id, sessionID and
    messageID raised a SchemaError, 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/messageID from the message it rides in and carries its own id.
    tests/test_plugins.py runs 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

Choose a tag to compare

@github-actions github-actions released this 21 Sep 08:28

0.7.1

  • The turn-finished retain nudge is gone. A Stop hook cannot reach the
    model except through decision: "block" or exit 2, and the host renders
    either as a hook error; Stop is 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-nudge subcommand, opencode's session.idle handler
    and pi's agent_settled handler, and both stop_hook_active emulations those
    two carried.
  • Breaking: ACH_MEMORY_NUDGE_INTERVAL no longer exists.
    ACH_MEMORY_IDLE_INTERVAL (seconds, default 1800) 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 /clear or 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.
  • retain no longer rejects a URL whose userinfo carries no password.
    scheme://user@host is 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_SANITIZER and 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

Choose a tag to compare

@github-actions github-actions released this 21 Sep 07:34

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 successful retain, 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: UserPromptSubmit on Claude Code and
    Codex, chat.message on opencode, before_agent_start on pi.
    ACH_MEMORY_IDLE_INTERVAL (seconds, default 1800) tunes it. The Stop
    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.json is generated from hooks/activation.txt;
    a test holds them together).

  • Codex: the new UserPromptSubmit hook needs trusting once (t in the
    hooks review), like every other plugin hook.

  • The service serves its own plugin bundle at /plugin. An npm 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; see docs/hosts.md.

Service change: a production roll is required for /plugin.

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 20 Sep 06:52

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. /clear has no hook that gives the agent a turn,
    and PreCompact never 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, default 900) 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_active ends it). opencode:
    session.idle plus client.session.promptAsync. pi: agent_settled plus
    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
    t in the hooks review. Until then Stop -- 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 exposes session_before_compact.

No service change; the release is the plugin.