Elyra
Elyra The coding agent eTerm The terminal that knows where each command ends Huskarl AI colleagues on your own Mac Starf An activity monitor for Apple silicon that never invents a number etrans An SSH and SFTP client for macOS Elyra VM Virtual machines for macOS, Linux and Windows on your Mac Litr A small, native web browser for macOS Notr A notebook for macOS e The native code editor Elyra Grove Native local development environment Askr The real server for Laravel & PHP Elyra Framework Rust + Svelte 5 framework for desktop apps Elyra Conductor Local project conductor Refr Local-first PDF workspace for macOS Elyra Workspace A desktop workspace for coding agents Elyra SQL Server MySQL-compatible SQL server in Rust Elyra Félagi Agents as teammates on one board Elyra SQL Client Native desktop SQL workbench Elyra SQL Anywhere Replication-ready SQL engine Elyra Sjá SEO & GEO workspace for macOS Elyra DataGrid Server-driven data grid for Laravel
Release notes
Changelog
Elyra

Memory

A bot remembers short facts between runs: that you prefer meetings in the morning, that invoices from a supplier go to a particular account. The memory is put into the bot's instructions every time the agent starts, under "What you remember", with the id of each memory.

Who writes it

The bot, with four tools:

Tool Class What
memory_list Read what it remembers, with ids
memory_remember Draft remember one short thing
memory_update Draft correct something it remembers
memory_forget Change internally forget something that is no longer true

The thread gets a line each time: "🧠 Remembering: «…»" or "🧠 Forgot: «…»".

You, in the bot's settings under Memory: write in the field ("Something the bot should remember, e.g. «Invoices go to accounts@company.com»") and press Add. Or from the terminal:

huskarld remember <bot> "Invoices go to accounts@company.com"

What you write yourself is always used.

When the memory changes, an agent that is not in the middle of a turn is restarted, so it gets the new instructions.

Learned from your edits

When you edit a bot's mail before approving it, what you changed says what you prefer. After each edited approval, Huskarl sets your last 20 edits side by side, without a model, and looks for three that agree:

  • an opening line you changed every time ("Hei," to "Hei Kari,"),
  • a line you removed, or lines that go together such as a signature ("Med vennlig hilsen" above the bot's own name),
  • a line you added ("Hilsen Knut").

Then a card comes in the thread, Remember this?, with why ("You removed «Med vennlig hilsen» in 3 of your last edits.") and the memory it would be, in English like everything the agent reads: "Leave the line «Med vennlig hilsen» out of mail you write: the user removes it." Remember it saves it as your memory; No does not. Each suggestion is made once, taken or not.

This needs what the bot first wrote, which Huskarl keeps beside what was sent (see Approvals and rules).

Held back after outside text

A memory the bot writes after reading outside text in the same run is held back. It is shown in the thread and in the settings, but does not go into the instructions until you have accepted it. An instruction injected into an email then cannot make itself permanent by becoming a memory.

Outside text is:

  • what a tool read from an email, an inbox or a web page, including a screenshot
  • the answer from another bot in a run_finished routine, and the body from a webhook
  • a task from a Chief, and the answer Chief gets back
  • an issue from Félagi.

The thread says: "🧠 Remembering: «…» – written after the bot read outside text, so it is not used until you accept it (Settings → Memory)". The agent is told that the memory is saved, but held back.

Accepting and deleting

Under Settings → Memory, a memory that is held back has the note "Written after outside text – not used until you accept it" and the button Accept. Accepting is the same as saving the memory yourself, with the same text. Delete removes a memory for good.

All memories held back for one bot are accepted with:

huskarld accept-memories <bot>

Look at them first. These are exactly the ones an attacker would try to plant.

Changing its own instructions

Memory is for facts. When you ask for a lasting change in how a bot works ("put the case number in the subject from now on"), or correct the same thing more than once, the bot can instead propose a change to its instructions, with instructions_propose: the whole new text, and why.

It becomes an approval card, Change my instructions, with the reason under the title and the change line by line: what goes in red and struck through (−), what comes in green (+), the lines around it, and long unchanged stretches folded. Nothing changes until you approve; then the bot's agent starts again with them, now or after the run it is in.

It is stricter than other proposals:

  • It always waits for you. No rule, mandate or setting for the class lets it through, and approving it never earns the bot a rule: a bot rewriting its own instructions unasked could undo every limit you gave it.
  • It is refused in a run that has read outside text (mail, pages, files, a webhook): an instruction hidden there must not become the bot's own by way of a card approved without reading. The bot says what it would change, and you can ask for it in a new message.
  • It cannot overwrite what you changed meanwhile. The card carries the instructions it was made from; if you edited them in the settings since, approving it changes nothing, and the bot is told to propose again.

Test on the last runs on the card tries the change first. The bot's last three runs that you or a routine started (not the one that proposed the change) are replayed with the new instructions, one after the other, newest first: each reads what it read then, in rehearsal, so nothing is carried out and nothing new is read. Each is set beside the run it replays in the thread, as a replay is, and then a summary: The new instructions, against the last 3 runs: 2 did the same as before, 1 did otherwise (above). The card waits meanwhile; testing decides nothing. See Replay.

Not yet

  • Changing the text of a memory in the app. You can add, accept and delete. The bot can correct with memory_update.