* feat: fail open with 3s network cap on all hooks; async capture; token count in recall banner
- All hook API calls hard-capped at 3s (was 15s default, 4s recall);
every failure path continues the session with a visible error
- Stop/capture hook runs with "async": true — fire-and-forget save, so
the user gets their prompt back immediately. Injection hooks stay
sync (async hooks' output is discarded, which would kill recall
injection and auto-approval); tightened their backstop timeouts
- Network failures now say "Supermemory unreachable" instead of raw
fetch errors, and session-start no longer claims "no previous
memories" when the fetch failed — only a 404 means empty
- Recall banner shows the injected context cost: "recalled 5 memories (32 tok)"
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PfsBZgW6vDm8GEcy9ML3dT
* feat: statusline tally counts recalled memories in context, not recall events
Search state accumulates a cumulative memories counter (fresh injections
only); the resting tally shows "9 recalled" instead of "6 recalls".
Sessions with only MCP-tool searches (nothing hook-injected) keep the
event-count fallback.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PfsBZgW6vDm8GEcy9ML3dT
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
The one-shot tip was structurally invisible (single systemMessage, sentinel
prevented repeats). SessionStart now writes the statusLine entry itself:
never overwrites a foreign statusLine, never re-installs after the user
deletes the entry (statusline-installed sentinel), surfaces parse errors
instead of swallowing them, writes atomically.
Claude-Session: https://claude.ai/code/session_011Z6UdMd9aUZUFdqBDEuVTB
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
A stored key proves nothing — the command now curls /v4/profile and
reports the HTTP status, distinguishing working key (200), revoked or
invalid key (401/403), and unreachable API. Ports the idea from #87
(@ayushsingh82).
Fixes#95
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Search hits carrying a title render as "Title — text"; ports the idea
from #88 (@ayushsingh82) onto the hook-driven recall.
Fixes#94
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
formatNewEntries/formatSignalEntries advanced the tracker before
capture.js called the API, so a failed save silently skipped that
delta forever. The formatters now return { formatted, lastUuid } and
capture.js advances the cursor after addMemory succeeds — a failure
leaves the cursor put and the next Stop recaptures. Found via #96,
originally spotted against the old architecture by @catShaark in #84.
Fixes#96
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Extraction was memorizing transient working-tree snapshots
("uncommitted changes to X, ready to be committed to PR #N") — state
git already tracks and no teammate would remember. The entity context
now leads with "try to remember things that a human would remember"
and explicitly skips uncommitted file lists, branch position, and
in-flight commit/push status.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
#3B35F3 measured 2.4:1 against a dark background — below the 3:1
legibility floor. rgb(124,120,250) measures 4.7:1 on dark and 3.5:1 on
light; shimmer tiers re-derived from the new base.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Injected memories are hashed into a per-session recalled.json (pruned
with statusline state, capped at 500) so a memory already in context is
never re-injected — the banner reports only fresh hits, with repeats as
a gray '… already in context' tail. Banners share lib/colors.js: brand
blue for the ◪ mark, red for recall failures.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Fixes#25: on Windows the stdin 'end' event never fires for hook
subprocesses, hanging every hook for its full timeout. readStdin now
parses incrementally and resolves as soon as the payload is complete
JSON, with a 3s fallback timer — the same pattern the statusline
renderer already used. Also drops dead formatRelativeTime code.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Search results are memory-shaped (.memory) or document/chunk-shaped
(.chunk/.content/.text with a filepath); recall now injects both,
annotating chunks with their filepath.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The recall directive was advisory — the model had to choose to spend a
tool call, so mid-session recall almost never happened. The
UserPromptSubmit hook now searches supermemory with the prompt itself
(4s timeout, skips short prompts and /, !, # inputs) and injects the
top matches directly, with a visible '◪ recalled N memories' notice
and statusline search state. A configured recallDirective restores
advisory mode.
Also fixes recall-approve missing the claude.ai connector namespace
(mcp__claude_ai_supermemory__*), which silently dropped the recall
notice and statusline count when the model did search.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
latest.json (update-check) and package.json were stuck at 0.0.16 while
plugin.json moved on. The one-time statusline tip now gives the full
settings snippet including refreshInterval, without which the animation
freezes between renders while idle.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The resting line cycles every 4s between the tally, "saved Ns ago",
and "recalled Nm ago" — the ages tick upward each render, so the
words change, not only the shimmer.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Frames are pure functions of (state, now), rendered by Claude Code's
statusLine.refreshInterval timer (1s idle floor; ~300ms during
activity) — no persistent process. A shimmer crest sweeps the brand
word (3-letter stride), saving gets a braille spinner (3-step stride),
and the tally rotates emphasis every 2s. Strides are coprime with
their cycle lengths so every pose is visited, and no frame repeats
within a 10s window (tested). Render cost is ~0.5µs per frame.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The tools frontmatter pinned mcp__supermemory__* only, so the agent
spawned with zero tools (and was refused) whenever the server surfaced
under the plugin-scoped or claude.ai connector namespace. List all
three variants; unresolved names are ignored at spawn.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
All hook surfaces now use ◪ and the recall directive asks for natural
sentences ("◪ last week you told me about X") instead of the
"◆ from memory:" label. Source is always named "supermemory", never
"memory".
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Resting label is now a session tally (N loaded · N captured · N recalls)
that ticks on every turn and every recall, instead of a static count with
decaying flashes. First session shows a one-time notice teaching that ◆
marks anything sourced from supermemory.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Statusline, systemMessages, injected memory lines, and the attribution rule
all carry ◆. The mark ships on the injected data itself, so the model
propagates it naturally when citing memories: if you see ◆, it came from
supermemory.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Bump all update surfaces so existing installs get the auto-update
notice after merge: latest.json, PLUGIN_VERSION, plugin manifest,
package versions, and rebuilt hooks.
Co-authored-by: Dhravya Shah <dhravya@supermemory.com>
Resolve generated script conflicts by rebuilding hooks so statusline
state updates keep the search-result parsing and status/session fixes
from main.
Co-authored-by: Dhravya Shah <dhravya@supermemory.com>
latest.json on main already advertised 0.0.10 while the installed
manifest and baked PLUGIN_VERSION were still 0.0.9, so the update
check nagged every session for a release that was never published.
Bump manifest, package.json, plugin-version.js and rebuild hooks so
the announced and installed versions match.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Bump plugin-version.js, plugin.json, package.json to 0.0.10
- Make ⚡ bright blue and "supermemory" bold white so the brand
pops on dark terminal backgrounds
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds a dynamic statusline script that shows Supermemory activity in
Claude Code's statusline bar. Three categories rotate per render:
- Things Added: "surfaced 9 intents", "vibing on 9 intents", etc.
- Things Learnt (📘): "picked up 5 insights", "5 memories crystallized"
- Things Recalled (🔁): "resurfaced 4 facts", "4 memories re-entered the chat"
- Syncing states: "encoding to memory", "saving the vibes"
Each render randomly picks one message from the available pools, with
creative varied phrasing so the statusline feels alive. Uses Supermemory
brand blue (#3B35F3) true-color ANSI. Syncing auto-expires after 15s to
prevent stale states.
Includes /supermemory:statusline setup command and first-time onboarding
tip shown at SessionStart.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
main has the recall source + hooks.json wiring (from #65) but never got
the built bundles, so UserPromptSubmit -> recall-hook.cjs errored with
MODULE_NOT_FOUND on every turn. This commits the build output:
- recall-hook.cjs, recall-approve.cjs (new) — the two missing bundles
hooks.json already references
- context-hook/summary-hook/add-memory/save-project-memory/search-memory/
status .cjs (refreshed) — were stale on main (built pre-#65), so they
reported version 0.0.7 while the source is 0.0.8; rebuilding aligns them
(also clears the false "update available" notice loop)
No package/version files changed — source is already at 0.0.8; this only
ships the bundles that build.js produces.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Re-introduces the reasoned recall feature (previously reverted in #64),
source files only — generated plugin/scripts/*.cjs are intentionally not
included and must be produced by the build step.
- recall-hook (UserPromptSubmit): injects a per-turn directive so Claude
decides whether recalling saved memory helps the current message.
- recall-approve (PreToolUse): auto-approves only the supermemory-search
tool call (narrow allow-list, rejects shell-laced commands).
- settings: recallDirective override + getRecallConfig.
- build/hooks wiring and version bump to 0.0.8.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>