v3.2.0 — multi-profile reasoning mining; embeddings stop inheriting a stranger's endpoint
Added
- Reasoning mining can read more than one Claude-Code profile. New
[reasoning_training] extra_transcript_dirs(alsoSURREAL_MEMORY_REASONING_EXTRA_DIRS, comma-separated) lists additional profile roots to scan alongside the implicit~/.claude— each entry is the directory that holdsprojects/, e.g.~/.claude-ZAI. Running a second profile for a different vendor's models is the normal way to do that on one machine, and until now every trace from that profile was invisible to mining no matter howmining_modelswas set. Roots are de-duplicated, missing ones are skipped rather than fatal, and each file's project attribution resolves against its own root. (#156) - The injection map's target field is now a combobox. It offers every detected model while staying free-text, because targets are matched with
fnmatch— a glob (glm-*) and a model that has not appeared in any transcript yet both have to remain typable. Targets are deliberately not filtered byhas_thinking_text: that gate applies to sources, and a target is the recipient. (#156)
Fixed
- Embedding requests silently inherited an ambient
OPENAI_BASE_URL. With no surreal-memory endpoint configured, the OpenAI SDK fell back to that environment variable — the ecosystem-standard knob for pointing some other tool at a proxy — so a brain's memory text was sent to a host the operator never configured for embeddings, failing later as a confusing error from a vendor that had never heard of the configured model.OpenAIEmbeddingnow always passes an explicitbase_url, defaulting tohttps://api.openai.com/v1, and logs a warning when it ignores a setOPENAI_BASE_URL. (#156) - The Stop hook's loopback privacy gate was defeated. It resolved the endpoint from config-or-env, checked it was loopback, and then built the provider without passing it — so the constructor re-resolved from the environment alone and an endpoint configured in
config.tomlcleared the gate while the client pointed elsewhere. The checked endpoint is now handed to the provider. The dashboard's "test embedding connection" endpoint had the same omission with no gate at all, and is fixed the same way. (#156) smem reindexhid the reason it failed and exited 0 anyway. It printed one identicalbatch N-M failed (skipped)line per batch, swallowing the actual exception, kept grinding through every remaining neuron repeating the same failure, and reported success to its caller. It now reports the real error once, aborts after a few consecutive failures when nothing has been embedded, and exits non-zero when a run embeds nothing. (#156)
Changed
- Breaking for one setup: if you relied on
OPENAI_BASE_URLalone to point surreal-memory at a LiteLLM/vLLM/Azure/self-hosted OpenAI-compatible server, withprovider = "openai"and no endpoint in eitherconfig.tomlorSURREAL_MEMORY_EMBEDDING_ENDPOINT, embeddings will now go toapi.openai.cominstead. Set[embedding] endpoint(orSURREAL_MEMORY_EMBEDDING_ENDPOINT) to restore the old routing — the same one-key change the new warning names. This is why this is a MINOR release rather than a patch.
Full diff: v3.1.0...v3.2.0