Skip to content

Releases: memorylake-ai/memorylake-cli

v20260828

Choose a tag to compare

@github-actions github-actions released this 28 Aug 09:17
a071b2f

The CLI can now say which actor your API key is.

memorylake actor me
memorylake actor me | jq -r .id
{
  "id": "actor-fd25f63e…",
  "custom_id": "user::e7f4fbd1…",
  "actor_type": "HUMAN",
  "display_name": "",
  "tags": [],
  "created_by": "user::e7f4fbd1…"
}

Until now a script that needed the caller's actor had to list actors and guess,
usually by preferring the first HUMAN. That is wrong the moment an account has
more than one person in it — which is the normal case for a shared workspace.
The server answers directly now, and the CLI passes the answer through.

The output is the same record shape actor get returns, so anything already
parsing that needs no change.

It is not necessarily bound to a workspace

Worth knowing before you build on it: a result does not mean that actor can
write in any particular workspace.
The actor comes with the account; joining a
workspace is a separate, explicit act, and in a freshly set-up account the two
have often not met.

memorylake actor me                        # who the key is
memorylake actor list --workspace <ws-id>  # who can write there
memorylake actor bind --actor <id>         # put one in the other

So a flow that offers "pick an actor for this workspace" cannot assume the answer
from actor me appears in that list — it may need to offer binding it first.

Failure behaviour

Every API key has an actor, so there is no "you have no actor" outcome to handle.
That makes a 404 unambiguous: it can only mean the server predates this endpoint.
The CLI says exactly that rather than surfacing a bare NOT_FOUND, which would
read as "you have no actor" — the opposite of the truth. The server's own message
is kept underneath so a real failure stays diagnosable.

Authentication and network failures take the paths they always did.

Why me and not default

default is already a concrete name in this CLI — it is the default profile,
which auth status prints — so memorylake --profile work actor default would
read two ways. It would also sit beside memorylake actor get default, a legal
command with an entirely different meaning, since custom_id is caller-defined
and an actor may genuinely be called default. And default here has always
meant something you chose and can change; this is neither.

Also

Actor output now includes created_by, which the API has been sending and the
CLI was dropping on the floor.

Upgrading

Re-run your install command. Nothing else changed.


What's Changed

Full Changelog: v20260827.1...v20260828

v20260827.1

Choose a tag to compare

@github-actions github-actions released this 27 Aug 11:18
f3356d9

What's Changed

  • feat: List the team's roles by @mrsxl in #28

Full Changelog: v20260827...v20260827.1

v20260827

Choose a tag to compare

@github-actions github-actions released this 27 Aug 09:22
96dd815

What's Changed

  • feat: Manage the team from the CLI by @mrsxl in #27

New Contributors

  • @mrsxl made their first contribution in #27

Full Changelog: v20260819.1...v20260827

v20260819.1

Choose a tag to compare

@github-actions github-actions released this 19 Aug 09:54
79e1efe

Actors can carry tags.

memorylake actor create --custom-id u-1 --display-name "Alice Chen" --tags vip,cn

memorylake actor list --tags vip           # actors tagged vip
memorylake actor list --tags vip,cn        # tagged BOTH, not either

memorylake actor update act-1 --tags gold  # replaces the whole list
memorylake actor update act-1 --clear-tags # removes every tag

Up to 20 tags per actor, each 1-64 characters, no commas. Matching is exact and
case-sensitive: VIP and vip are two different tags. Prefer tags over
--metadata for anything you want to filter on later, because metadata is not
filterable.

The two update flags

--tags replaces the list rather than adding to it, the same way
--metadata already did: list every tag you want to keep. An update that does
not mention tags leaves them alone.

That is why --clear-tags exists as its own flag. Omitting tags is what tells
the server not to touch them, so "remove them all" cannot be expressed by passing
nothing -- it needs an explicit empty list. --tags "" is rejected rather than
quietly repurposed for this: an empty value is far more likely a shell mishap
than an intent to clear.

Two fields that were being dropped

Actor output now shows tags, and workspace-binding output shows tags and
status. The CLI prints the record it decoded, so a field it did not know about
never reached you -- status in particular has been sent by the API all along.
It distinguishes a live member from a tombstone: a deleted actor keeps its
workspace binding.

{
  "actor_id": "act-...",
  "display_name": "Alice Chen",
  "tags": ["vip", "cn"],
  "status": "ACTIVE"
}

Behaviour worth knowing

Measured against the live API rather than read off a spec:

  • The server normalizes what you send: --tags "vip, cn , vip" stores
    ["vip","cn"] -- trimmed, de-duplicated, first-seen order kept.
  • An actor with no tags reports "tags": [], never an absent field.
  • Several tags are ANDed. One tag the actor does not carry excludes it.
  • Length and count limits are enforced server-side and reported precisely
    (tags[0] A tag must be 1 to 64 characters long).

Upgrading

Re-run your install command. Nothing changed for existing commands; every actor
that predates this has no tags and behaves exactly as before.


What's Changed

Full Changelog: v20260819...v20260819.1

v20260819

Choose a tag to compare

@github-actions github-actions released this 19 Aug 08:21
8edc743

Documents come back out, a binary can say which release it is, and the Windows installer works on the PowerShell that Windows actually ships.

Downloading a document

memorylake proj doc list --project <id>              # find the document id
memorylake proj doc download --project <id> <doc-id> # to the current directory
memorylake proj doc download --project <id> <doc-id> -o ~/Downloads/
memorylake proj doc download --project <id> <doc-id> -o - | head

The file lands under the name the server reports. -o takes a file path or a
directory; -o - streams to stdout for piping, with the summary on stderr so it
stays out of the pipe. An existing file is never replaced without --force, and
the write goes to a temporary file first, so an interrupted download cannot leave
a half-written file where a whole one used to be.

The bytes are streamed rather than buffered — the size of a document is the
server's business, not this process's memory. The endpoint answers with a
short-lived pre-signed storage URL rather than the bytes; that redirect is
followed automatically, your API key is not carried across to storage, and the
URL is never logged in full, because its query string is itself a credential.

Which release is this

memorylake version    # v20260819

Every build before this one reported 0.1.0 — the crate version, unchanged since
the first release — so an upgraded install and a stale one looked identical.
Release builds now carry their tag. A build that did not come from the release
workflow says 0.1.0 (dev build) instead of claiming a release it is not.

This is the first release that reports its own tag. v20260818.1 and earlier
still say 0.1.0, which is precisely the problem being fixed: if version prints
0.1.0 on a machine you just upgraded, the upgrade did not take.

Installing without prompts

The installers accept the credentials, so a link handed out by a console can
install and configure in one step with nothing to type — and CI, where there is
nobody to prompt, gets the same path:

curl -fsSL https://raw.githubusercontent.com/memorylake-ai/memorylake-cli/main/scripts/install.sh \
  | sh -s -- --api-key sk-… --workspace ws-… [--base-url URL]
# `irm | iex` cannot pass parameters, so Windows uses the environment
$env:MEMORYLAKE_API_KEY='sk-…'; $env:MEMORYLAKE_WORKSPACE='ws-…'
irm https://raw.githubusercontent.com/memorylake-ai/memorylake-cli/main/scripts/install.ps1 | iex

Every flag has an environment variable (MEMORYLAKE_API_KEY,
MEMORYLAKE_WORKSPACE, MEMORYLAKE_BASE_URL); a flag wins over its variable.
Supplied credentials replace whatever is already stored, which is the point
when a console hands out a key — but nothing is written unvalidated, so a key that
will not work leaves your existing configuration intact rather than overwriting
working credentials with broken ones.

A key on a command line is recorded in your shell's history. Prefer a short-lived
key where that matters.

Windows PowerShell 5.1

The installer that shipped in v20260818.1 failed on stock Windows PowerShell
5.1 — the default on Windows 10 and 11 — for three unrelated reasons:
RuntimeInformation does not exist on .NET Framework, response headers are typed
differently there, and 5.1 reads a .ps1 with no BOM as ANSI, which turned this
file's em dashes into stray quote characters and broke parsing several lines away
from anything that looked wrong.

All three are fixed. CI now parses the script under 5.1 as well as PowerShell 7 —
the two parsers disagree, so validating under 7 alone proved nothing — and rejects
any non-ASCII byte in it.

If a Windows install failed on v20260818.1, re-run the same one-liner.

Also

  • The README is written for people using the CLI rather than developing it;
    CONTRIBUTING.md now holds the build, test and release details.
  • The live test suite runs once per CI run instead of twice concurrently against
    the same account, which was producing failures that looked like permission and
    connectivity problems and needed a rerun to clear.

Upgrading

Re-run your install command. No flags or commands changed; --workspace and
everything else behave as before.


What's Changed

Full Changelog: v20260818.1...v20260819

v20260818.1

Choose a tag to compare

@github-actions github-actions released this 18 Aug 08:38
010deef

Installing is now one line, and the CLI remembers which workspace you work in. This is also the first release with Windows builds.

Install

# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/memorylake-ai/memorylake-cli/main/scripts/install.sh | sh
# Windows
irm https://raw.githubusercontent.com/memorylake-ai/memorylake-cli/main/scripts/install.ps1 | iex

Both resolve the latest release, verify the download against its published SHA-256, refuse to install on a mismatch, and upgrade in place when re-run.

On a first install they walk you through what the CLI needs, and every step is a choice from a list:

  • which deployment — Global (app.memorylake.ai) or China (app.memorylake.cn). These are separate deployments, not mirrors, so an account on one does not exist on the other.
  • your API key, validated against the API before anything is written.
  • which workspace — picked from your own workspaces. You never have to know a workspace id.

An upgrade that is already logged in is left alone. Without an interactive terminal (CI, a Dockerfile) the setup is skipped and the commands printed instead, so an install never blocks on a prompt nobody can answer. MEMORYLAKE_NO_SETUP=1 skips it outright.

A default workspace

Every workspace-scoped command used to need --workspace on every call. Now:

memorylake ws use            # pick one from a list
memorylake ws use ws-1234    # or name it
memorylake ws current        # which one is in effect, and where it came from
memorylake ws use --clear

After that, project, document, fact, agent, search and conversation commands can omit the flag. Resolution is --workspace → the remembered workspace → MEMORYLAKE_WORKSPACE; an explicit flag always wins. ws use <id> checks the id exists before storing it, so a typo is caught once instead of on every later command.

There is no built-in default: with none remembered and none passed, a command that needs one fails and says how to supply one.

Windows

The release now builds x86_64-pc-windows-msvc and aarch64-pc-windows-msvc, shipped as .zip (Unix keeps .tar.gz). CI builds and tests on Windows too, so this stays working.

Also

  • MEMORYLAKE_CONFIG_DIR moves CLI state somewhere other than ~/.memorylake — useful in containers and CI.
  • conversation message append --wait polls until the conversation's memory is built, and no longer needs an explicit --workspace if one is remembered.
  • Interactive login no longer offers OAuth, which was not implemented and failed if chosen.
  • ws current and ws use --clear work without logging in; they only touch local config.

Upgrading

Nothing breaks. --workspace still works exactly as before wherever it was accepted.


What's Changed

Full Changelog: v20260818...v20260818.1

v20260818

Choose a tag to compare

@github-actions github-actions released this 18 Aug 03:39
d19f8c4

Adds memorylake conversation — the full conversation and message surface, and the first release to cover MemoryLake's conversational memory.

Conversations

memorylake conversation create --workspace ws-… --custom-id session-42 \
  --project proj-… --actors actor-… [--name "Q3 Planning"] [--kind DIRECT|GROUP] [--metadata k=v ...]

memorylake conversation list        --workspace ws-… [--page-size N] [--continuation-token TOKEN]
memorylake conversation get         --workspace ws-… <ID> [--by-custom-id]
memorylake conversation cook-status --workspace ws-… <ID> [--by-custom-id]
memorylake conversation delete      --workspace ws-… <ID>

memorylake conversation message append <CONVERSATION_ID> --actor actor-… --custom-id msg-42 \
  (--text "hello" ... | --content-json '<blocks>' | --content-file blocks.json) \
  [--parent <MESSAGE_ID>] [--timestamp ISO8601] [--metadata k=v ...] \
  [--wait --workspace ws-… [--timeout 600]]

memorylake conversation message list <CONVERSATION_ID> [--page-size N] [--continuation-token TOKEN]

conv is an alias for conversation, msg for message.

Things worth knowing

The message subcommands take no --workspace. Conversations are addressed under their workspace, their messages by conversation id alone — the CLI mirrors that split rather than smoothing it over. The one exception is --wait, which needs a workspace because the status it polls is workspace scoped.

Message content is a list of typed blocks. Each --text becomes one TEXT block; --content-json / --content-file carry the other five types (FILE, IMAGE, THINKING, TOOL_USE, TOOL_RESULT). Blocks are forwarded verbatim, so a block type this build predates still works.

--wait polls until the conversation's memory is built, backing off from 1s to 15s and giving up after --timeout seconds (default 600). Giving up undoes nothing: the message prints before the wait starts and processing carries on server-side. In practice one message finishes in ~9s and three in ~19s.

Appends are idempotent by --custom-id. Appends to one conversation are serialized server-side, so two at once leave one caller with a 409. Retrying with the same --custom-id returns the message created the first time instead of duplicating it.

conversation create requires --actors, ahead of a server-side change that will reject conversations created without participants. Today's server still accepts them, so this CLI is deliberately stricter than the API it talks to for now. Note that a conversation with no participants never produces any facts, so nothing useful is lost.

message append does not echo everything it stored. Its response leaves metadata, timestamp and actor_type null even when the request set them; the values are stored and message list reports them. Confirm a write by reading the listing, not the append output.

Which scope an extracted fact lands in is the server's decision. --project bounds what the conversation may read and write; it does not route facts. After a wait returns, look under both fact list --actors and fact list --projects.

Compatibility

No breaking changes for users of v20260810 — everything here is new surface. Existing auth, workspace, actor, project, library, agent, fact, and search commands are unchanged.

Install

Download the tarball for your platform below, verify it against its .sha256, and put memorylake on your PATH:

tar -xzf memorylake-v20260818-<target>.tar.gz
shasum -a 256 -c memorylake-v20260818-<target>.tar.gz.sha256

Targets: aarch64-apple-darwin, x86_64-apple-darwin, x86_64-unknown-linux-gnu, aarch64-unknown-linux-gnu.


What's Changed

Full Changelog: v20260810...v20260818

v20260810

Choose a tag to compare

@github-actions github-actions released this 10 Aug 08:21
505be52

What's Changed

  • feat: Add auth profiles and workspace CLI commands by @WenbinHou in #1
  • feat: Improve auth login UX and profile-first credentials by @WenbinHou in #3
  • feat: Add workspace get, fix list name_fuzzy filter, and trace HTTP by @WenbinHou in #4
  • feat: Add actor commands and workspace bindings by @WenbinHou in #6
  • feat: Add project commands and Projects API bindings by @WenbinHou in #7
  • feat: Add library commands and chunked upload by @WenbinHou in #5
  • feat: Add Agents API support to the CLI by @WenbinHou in #8
  • feat: Add search command and Search API bindings by @WenbinHou in #9
  • feat: Add project document commands and Documents API bindings by @WenbinHou in #10
  • feat: Add fact commands and Facts API bindings by @a1594834522-coder in #11
  • chore: Add release workflow for prebuilt binaries by @a1594834522-coder in #12

New Contributors

Full Changelog: https://github.com/memorylake-ai/memorylake-cli/commits/v20260810