Skip to content

v0.11.0

Choose a tag to compare

@github-actions github-actions released this 18 May 20:26
fd7a308

0.11.0

Minor Changes

  • #692 a13905a Thanks @jalehman! - Add focus brief generation through /lossless focus <prompt>, active focus overlays, unfocus/refocus lifecycle handling, and TUI/status diagnostics for generated briefs.

Patch Changes

  • #688 d1bef05 Thanks @jetd1! - Preserve unpersisted OpenClaw inter-session live input when assembling context from LCM's durable DB frontier.

  • #685 a6640b6 Thanks @jetd1! - Seed a placeholder conversation_bootstrap_state row in the afterTurn slow-path stat-fail branch so the next turn can recover.

    [#649](https://github.com/Martian-Engineering/lossless-claw/issues/649) added a stat-fail fallback that returns hasOverlap:true to permit live afterTurn persistence even when stat(sessionFile) fails, expecting the subsequent refreshAfterTurnBootstrapState hook to refresh the checkpoint. That hook calls refreshBootstrapState, which independently calls stat(sessionFile) and throws on failure, so the catch block in the hook swallows the error and conversation_bootstrap_state stays NULL. Every subsequent afterTurn then re-enters the slow path with reason="checkpoint-missing", which is intentionally excluded from allowNoAnchorImport, and the conversation gets stuck: LCM degrades into a transparent passthrough where the assemble safe-fallback returns params.messages verbatim and compaction never runs.

    This restores the contract that "permissive return ⟹ checkpoint exists" without re-introducing the unconditional refresh [#649](https://github.com/Martian-Engineering/lossless-claw/issues/649) deliberately removed. The placeholder is written via summaryStore.upsertConversationBootstrapState directly so it does not depend on stat success. Subsequent turns recover from offset=0 once the transcript becomes statable, but route that placeholder recovery through the existing DB-anchor reconciliation path so already-persisted live afterTurn messages are not replayed as new rows.

  • #704 f806bb9 Thanks @jalehman! - Declare OpenClaw 2026.5.12 as the minimum supported host version for runtime LLM summarization.

  • #696 1869c6c Thanks @jalehman! - Mark OpenClaw as an optional peer dependency so standalone plugin installs do not pull a second OpenClaw runtime tree.

  • #573 5621e8f Thanks @100yenadmin! - Generalize the native-image-block externalizer to assistant, system, tool, and toolResult messages. PR #521 in v0.9.3 only ran on user-role messages, so:

    • Assistant or system messages carrying native {type:"image", data:...} blocks fell through to the generic raw-payload externalizer and were stored as raw-{role}-payload.json blobs with embedded base64 instead of dedupe-friendly image files.
    • Tool and toolResult messages (which skip raw-payload externalization entirely) had their image blocks persisted inline through the standard message_parts pipeline, embedding base64 directly in the DB row.

    In both cases the result was the same: no large*file row, no lcm_describe rendering, and no inter-conversation dedupe. The interceptor now runs for every persistable role, replacing native image blocks with [<Role> image: ... | LCM file: file*…] references and storing the image file once.

    interceptLargeRawPayload also no longer skips externalization based on a content substring match (isExternalizedReferenceContent); it now only skips when the message already carries the explicit rawPayloadExternalized: true flag, so a still-oversized message that merely embeds an image reference alongside other content is still externalized.

    Extension map: added image/heic, image/avif, and image/bmp so MIME-detection misses for those formats produce a sensible filename.

  • #706 f1e1806 Thanks @jalehman! - Block same-path-shrink no-anchor bootstrap imports when candidate raw event IDs already belong to another active conversation.

New Contributors

Full Changelog: v0.10.0...v0.11.0