0.10.0
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
appendImageandrespond.imageon the agent side.
read_widget_statesurfaces image entries as attachments,
rescaled to at most 1568 px on the longest edge (configurable
viamax_dimension). Anthropic receives nested image blocks
insidetool_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
ActionSpecso 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 (Bufferyes,
btoa/atobno,ArrayBuffer.wrapis GumJS not Node),
language bridges needinginstall_package+global_alias,
64-bit integer wrappers that JSON-stringify,NativeFunction
bools as0/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 inLumaAppStateand 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_filehang 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_modulesfrom a process that died
before auto-save, the document wins and the orphans are
wiped — both atensureReadytime 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. LumaCoreErrormessages reach the UI. Conforming to
LocalizedErrormeans the user sees
Package 'objc' not found in install resultinstead 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 andImage(platformImageData:)collapse the
scatteredNSImage/UIImagebranches in host loaders to a
single path. Also fixes an iOS build break in widgets.
Fixes
- Pending-action tracker no longer races:
seenPendingis now
a@MainActorclass so the observation closure captures a
reference rather than a mutable local. - Autosaver is rebuilt when
fileURLchanges.State(initialValue:)
only runs on first init, so saving an untitled document used
to leave the autosavernilfor the rest of the session.
Dependencies
- frida-core 17.9.10 → 17.9.11, with matching frida-swift.