Revert name to OptMem
This commit is contained in:
parent
15130b9cad
commit
bd2a799500
8 changed files with 31 additions and 31 deletions
32
README.md
32
README.md
|
|
@ -1,4 +1,4 @@
|
|||
# AmalgaMem
|
||||
# OptMem
|
||||
|
||||
How do you make an AI agent remember its whole life?
|
||||
|
||||
|
|
@ -9,9 +9,9 @@ How do you make an AI agent remember its whole life?
|
|||
grow with age; a memory that scrolls past it might as well not exist.
|
||||
|
||||
Most agent memories pick one: keep everything (and drown), or keep a small
|
||||
curated file (and forget). AmalgaMem does both. *At once.*
|
||||
curated file (and forget). OptMem does both. *At once.*
|
||||
|
||||
[](anim/amalgamem.mp4)
|
||||
[](anim/optmem.mp4)
|
||||
|
||||
*↑ click to watch: 3 minutes, the whole idea.*
|
||||
|
||||
|
|
@ -93,8 +93,8 @@ a memory.
|
|||
## Setup
|
||||
|
||||
```sh
|
||||
git clone https://github.com/VictorTaelin/AmalgaMem ~/AmalgaMem
|
||||
~/AmalgaMem/memo init
|
||||
git clone https://github.com/VictorTaelin/OptMem ~/OptMem
|
||||
~/OptMem/memo init
|
||||
```
|
||||
|
||||
`memo init` creates `~/memory` — this machine's identity — and prints a
|
||||
|
|
@ -105,31 +105,31 @@ everything else on its own. The block:
|
|||
```markdown
|
||||
## Memory
|
||||
|
||||
Your memory is AmalgaMem: the tool is `~/AmalgaMem/memo`, the data is `~/memory`.
|
||||
Your memory is OptMem: the tool is `~/OptMem/memo`, the data is `~/memory`.
|
||||
It survives every new session, every compaction and every change of
|
||||
model or vendor. Without it you do not know who you are, or what was
|
||||
already decided and tried.
|
||||
|
||||
Run `~/AmalgaMem/memo wake` before any other tool call, in every session. It prints
|
||||
Run `~/OptMem/memo wake` before any other tool call, in every session. It prints
|
||||
in numbered parts, each ordering the next; run every one until a part
|
||||
says `You are awake.` Do not stop early: part 1 is your distant past,
|
||||
the last part is this week. If wake refuses because compressions are
|
||||
pending, do them and run `~/AmalgaMem/memo wake` again.
|
||||
pending, do them and run `~/OptMem/memo wake` again.
|
||||
|
||||
While you work:
|
||||
|
||||
- `~/AmalgaMem/memo note "<one line, max 280 chars>"` the moment something happens,
|
||||
- `~/OptMem/memo note "<one line, max 280 chars>"` the moment something happens,
|
||||
you learn something, or something changes -- if and only if it is new
|
||||
to you, important, and lasting in effect. That covers a task worth
|
||||
real effort, a fact or insight your user teaches you, anything you
|
||||
learn about their life (even indirectly), and work of yours that
|
||||
lands. Never write what you already know: no redundant memories, ever.
|
||||
- If `~/AmalgaMem/memo note` returns a compression, do it before your next action.
|
||||
- `~/AmalgaMem/memo recall <regex>` when a memory is too vague.
|
||||
- Before your context ends, run `~/AmalgaMem/memo sleep` and answer each prompt
|
||||
- If `~/OptMem/memo note` returns a compression, do it before your next action.
|
||||
- `~/OptMem/memo recall <regex>` when a memory is too vague.
|
||||
- Before your context ends, run `~/OptMem/memo sleep` and answer each prompt
|
||||
until it prints `Nothing left to compress.`
|
||||
- Never create, edit or delete anything under `~/memory`. Only the tool
|
||||
writes there.
|
||||
- Never create, edit or delete anything under `~/memory`:
|
||||
only the tool writes there.
|
||||
|
||||
Parallel sessions on this machine are all you, and may all write
|
||||
memories. A subagent is not: it must never run `memo`, because it cannot
|
||||
|
|
@ -139,7 +139,7 @@ subagent. Do not run memo.` If your own first message is a task brief
|
|||
from another agent, you are that subagent: skip this section.
|
||||
```
|
||||
|
||||
That is the whole integration. AmalgaMem is just prompts and scripts: no
|
||||
That is the whole integration. OptMem is just prompts and scripts: no
|
||||
daemon, no database, no embeddings, no API. It works the same under Claude
|
||||
Code, Codex, pi, or a human at a shell.
|
||||
|
||||
|
|
@ -227,7 +227,7 @@ ever rewritten.
|
|||
|
||||
## Limitations
|
||||
|
||||
AmalgaMem is honest about what it is. Recency is the only axis: an important
|
||||
OptMem is honest about what it is. Recency is the only axis: an important
|
||||
old fact fades into its block like everything else, and the defence is
|
||||
rehearsal — noting it again refreshes it. `recall` is regex over plain text,
|
||||
not semantic search; the memory context is what tells you what to search
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>AmalgaMem — how it works</title>
|
||||
<title>OptMem — how it works</title>
|
||||
<style>
|
||||
body { margin:0; background:#f2f4f6; display:flex; flex-direction:column;
|
||||
align-items:center; font-family:Menlo,ui-monospace,monospace; color:#5b6672; }
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -1,5 +1,5 @@
|
|||
"use strict";
|
||||
// AmalgaMem explainer.
|
||||
// OptMem explainer.
|
||||
// Rules: a screen is EITHER one sentence OR one picture, never both.
|
||||
// One new thing per beat, held long enough to read it out loud twice.
|
||||
// Pacing lives here: [kind, seconds, ...]; "co" = continue, no cut to white.
|
||||
|
|
@ -33,7 +33,7 @@ const BEATS = [
|
|||
"(Hermes caps it at 2,200 characters)"],
|
||||
["prune", 5.2],
|
||||
["say", "_PROBLEM:_", "you cannot tell *today*", "what will matter in a *year*"],
|
||||
["say", "+OUR ANSWER:+", "AmalgaMem +deletes nothing+"],
|
||||
["say", "+OUR ANSWER:+", "OptMem +deletes nothing+"],
|
||||
["say", "two memories +merge+ into one", punch],
|
||||
["merge", 6.8],
|
||||
["say", "the result is a memory too", "it just holds *less detail*"],
|
||||
|
|
@ -50,7 +50,7 @@ const BEATS = [
|
|||
["say", "the *memory context* +never grows+", "and *you* choose its size"],
|
||||
["say", "nothing is ever deleted", "the originals are all +still there+"],
|
||||
["recall", 6.8],
|
||||
["say", "nothing to run, nothing to host", "AmalgaMem is just some prompts and scripts",
|
||||
["say", "nothing to run, nothing to host", "OptMem is just some prompts and scripts",
|
||||
"it works in any harness, any environment", "just point your *AGENTS.md* to it, and done"],
|
||||
["end", 6.5],
|
||||
];
|
||||
|
|
@ -648,13 +648,13 @@ S.recall = (u, dur) => {
|
|||
};
|
||||
|
||||
S.end = (u, dur) => {
|
||||
T("AmalgaMem", W/2, 284, 58, INK, "center", true);
|
||||
T("OptMem", W/2, 284, 58, INK, "center", true);
|
||||
cx.globalAlpha = ease((u - 0.6)/0.5);
|
||||
T("an append-only log + a binary merge tree", W/2, 356, 23, GREEN, "center");
|
||||
T("detail fades with age \u00b7 nothing is deleted", W/2, 396, 23, DIM, "center");
|
||||
cx.globalAlpha = ease((u - 1.6)/0.5);
|
||||
T("~600 lines of Python \u00b7 no database \u00b7 no embeddings", W/2, 462, 19, FAINT, "center");
|
||||
T("github.com/VictorTaelin/AmalgaMem", W/2, 508, 21, "#1a5fd0", "center");
|
||||
T("github.com/VictorTaelin/OptMem", W/2, 508, 21, "#1a5fd0", "center");
|
||||
cx.globalAlpha = 1;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// Renders the AmalgaMem animation to PNG frames. Usage:
|
||||
// Renders the OptMem animation to PNG frames. Usage:
|
||||
// node video.js all frames at 30fps into frames/
|
||||
// node video.js 3 9 26 40 single stills at those seconds into shots/
|
||||
const { createCanvas } = require("canvas");
|
||||
|
|
@ -24,5 +24,5 @@ if (args.length) {
|
|||
fs.writeFileSync(`frames/${String(f).padStart(5, "0")}.png`, cv.toBuffer("image/png"));
|
||||
if (f % 300 === 0) console.log(`${f}/${N}`);
|
||||
}
|
||||
console.log("done. now: ffmpeg -framerate 30 -i frames/%05d.png -c:v libx264 -pix_fmt yuv420p -crf 18 amalgamem.mp4");
|
||||
console.log("done. now: ffmpeg -framerate 30 -i frames/%05d.png -c:v libx264 -pix_fmt yuv420p -crf 18 optmem.mp4");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
"""Block math for AmalgaMem.
|
||||
"""Block math for OptMem.
|
||||
|
||||
A BLOCK is an aligned power-of-two range of memories, [lo, hi), written as one
|
||||
line of at most ENTRY_CHARS characters. Blocks form a binary merge tree over
|
||||
|
|
|
|||
10
memo
10
memo
|
|
@ -1,5 +1,5 @@
|
|||
#!/usr/bin/env python3
|
||||
"""AmalgaMem: a permanent, append-only memory for AI agents.
|
||||
"""OptMem: a permanent, append-only memory for AI agents.
|
||||
|
||||
memo init create this machine's memory, print the setup block.
|
||||
memo wake [part [T]] read your memory. Run first, every session.
|
||||
|
|
@ -319,7 +319,7 @@ def next_nap(d, T):
|
|||
# ---------------------------------------------------------------- commands
|
||||
|
||||
CONFIG = """\
|
||||
# AmalgaMem sizes for this memory. Uncomment a line to override it; an
|
||||
# OptMem sizes for this memory. Uncomment a line to override it; an
|
||||
# absent line tracks the tool's default.
|
||||
#
|
||||
# WAKE_LINES=208 # the memory context: how many lines wake prints (~16k tokens)
|
||||
|
|
@ -331,7 +331,7 @@ CONFIG = """\
|
|||
TEMPLATE = """\
|
||||
## Memory
|
||||
|
||||
Your memory is AmalgaMem: the tool is `{tool}`, the data is `{data}`.
|
||||
Your memory is OptMem: the tool is `{tool}`, the data is `{data}`.
|
||||
It survives every new session, every compaction and every change of
|
||||
model or vendor. Without it you do not know who you are, or what was
|
||||
already decided and tried.
|
||||
|
|
@ -354,8 +354,8 @@ While you work:
|
|||
- `{memo} recall <regex>` when a memory is too vague.
|
||||
- Before your context ends, run `{memo} sleep` and answer each prompt
|
||||
until it prints `Nothing left to compress.`
|
||||
- Never create, edit or delete anything under `{data}`. Only the tool
|
||||
writes there.
|
||||
- Never create, edit or delete anything under `{data}`:
|
||||
only the tool writes there.
|
||||
|
||||
Parallel sessions on this machine are all you, and may all write
|
||||
memories. A subagent is not: it must never run `memo`, because it cannot
|
||||
|
|
|
|||
2
test.py
2
test.py
|
|
@ -1,5 +1,5 @@
|
|||
#!/usr/bin/env python3
|
||||
"""AmalgaMem invariants, checked against a synthetic life of 5000 memories.
|
||||
"""OptMem invariants, checked against a synthetic life of 5000 memories.
|
||||
|
||||
Uses a fake compressor (join + truncate) so the run is deterministic and free.
|
||||
"""
|
||||
|
|
|
|||
Loading…
Reference in a new issue