Skip to content

0.10.0

Choose a tag to compare

@github-actions github-actions released this 23 May 16:01
· 510 commits to main since this release

Luma 0.10.0

A focused follow-up to 0.9.0: agentic flows get image
attachments, oversized payloads are clamped before they reach
the LLM or the UI, and the custom-instrument write path no
longer wedges on a stuck reload.

Agent ↔ LLM

  • Image attachments end-to-end. Console widgets gain
    appendImage and respond.image on the agent side.
    read_widget_state surfaces image entries as attachments,
    rescaled to at most 1568 px on the longest edge (configurable
    via max_dimension). Anthropic receives nested image blocks
    inside tool_result; OpenAI gets a synthetic follow-up user
    message carrying the image. Host-side scaling uses CoreImage
    on macOS and GdkPixbuf on GTK.
  • Oversized strings are clamped. Tool-result payloads are
    walked before serialization and any string over 2 KiB is
    head-truncated with a marker noting the original size — one
    rogue 5 MiB base64 blob no longer eats the context budget.
  • Numbered lines in agentic file reads so the LLM can refer
    to ranges unambiguously.
  • Code-preview metadata moved onto ActionSpec so the
    Action Queue can't drift out of sync with the tool catalog;
    fixes a stale field name, two phantom tool names, and the
    edit_* family that had gone missing from the preview.
  • System prompt sharpened for Frida / GumJS. New gotchas
    section covers the polyfilled surface (Buffer yes,
    btoa/atob no, ArrayBuffer.wrap is GumJS not Node),
    language bridges needing install_package + global_alias,
    64-bit integer wrappers that JSON-stringify, NativeFunction
    bools as 0/1, and struct args as flat arrays. Custom
    instrument entrypoint is pinned to the top of the file per
    newspaper order.
  • Custom-instrument API guidance defers to the typings tool
    rather than duplicating signatures in prose.

Mission approvals

  • Trust client approvals. A new toggle on each external MCP
    server config lets write-mode tool calls from that server
    bypass Luma's approval gate (still recorded in history) when
    the upstream client — e.g. Claude Code — already prompts per
    tool. Off by default; persisted in LumaAppState and applied
    live to a running server.
  • Desktop notifications for pending approvals. When Luma
    isn't frontmost, LocalNotifier (macOS) and
    DesktopNotifier (GTK) fire on
    observeAllPendingMissionActions. Multiple arrivals in one
    tick are coalesced into a single notification with a
    (+N more pending) suffix.

Custom instruments

  • Writes decoupled from agent reload. A wedged custom
    instrument used to block dispose RPC, which made every
    write_custom_instrument_file hang waiting on the live
    reload — exactly when you most need to edit the source. The
    store write now returns as soon as on-disk state is updated;
    the reload bounce runs in a detached task.
  • Reloads coalesce per def. Concurrent writes (or a
    collaboration snapshot landing mid-write) used to spawn
    overlapping reload tasks that raced on dispose/load. A single
    drain loop per def now handles bursts: if a reload is
    in-flight, the def is marked dirty and the current loop
    re-runs when it finishes.
  • Package state reconciled with disk. If the document has
    no manifests but the workspace still carries
    package.json / node_modules from a process that died
    before auto-save, the document wins and the orphans are
    wiped — both at ensureReady time and at install time. The
    install-side check is what unblocks the "Frida sees the dep
    as already satisfied, returns empty install result" failure
    mode.
  • LumaCoreError messages reach the UI. Conforming to
    LocalizedError means the user sees
    Package 'objc' not found in install result instead of
    LumaCore.LumaCoreError error 1.

UI / UX

  • REPL and console clamp huge strings. A 5 MiB string from
    a REPL eval or a console entry no longer drags SwiftUI / GTK
    layout to a crawl; trimmed head-first at 2 KiB with a marker
    showing the original size.
  • Unified platform image handling. A PlatformImage
    typealias and Image(platformImageData:) collapse the
    scattered NSImage / UIImage branches in host loaders to a
    single path. Also fixes an iOS build break in widgets.

Fixes

  • Pending-action tracker no longer races: seenPending is now
    a @MainActor class so the observation closure captures a
    reference rather than a mutable local.
  • Autosaver is rebuilt when fileURL changes. State(initialValue:)
    only runs on first init, so saving an untitled document used
    to leave the autosaver nil for the rest of the session.

Dependencies

  • frida-core 17.9.10 → 17.9.11, with matching frida-swift.