leonard_flutter 0.4.5-dev.1
leonard_flutter: ^0.4.5-dev.1 copied to clipboard
Host WidgetsBinding for Leonard.
Changelog #
0.4.5-dev.1 #
- Fix: the default
action-relativestability policy no longer returns mid-transition (lenny-r1k2x). It ended on the first route or semantics change, which a push produces on its first frame while the page still animates; on an iPad the observation after a sign-in held two empty containers. A change now starts a settle that ends afterquietFrameNquiet frames. A route change's settle is capped byactionRelativeSettleBudgetMs(default 1500 ms, a new request field), a semantics-only change's by the 800 ms action budget.terminated_bystill names the change. - Cost: an app that never stops animating used to return within a frame of a
change; it now waits up to 800 ms after a semantics change, or 1.5 s after a
route change, and reports
settled: false. - Add
settledto the stability block: true when the app was quiet at the end, false when a budget ran out first. - Fix: an observation no longer waits past its budget while frames are off (the app hidden or paused, as when an action opens an external URL or a native sheet): each frame wait is raced with the budget. Decision: action-relative-stability-settles-after-a-change.
0.4.4 #
Stable promotion of 0.4.4-dev.1 on Nico's promotion call (2026-10-22). No changes on top; the prerelease entry below carries the details. Live-checked on 2026-10-22 against the sample app on a Pixel 7a (claude and qwen-mlx tiers) and an iPad mini (claude): typed login and the modal-trap scenario passed on both devices, and an open dialog reads as one route layer where routeStack was empty.
0.4.4-dev.1 #
- Add
route_layersto the core observation (lenny-kyfdc): the routes on screen, top-most last, each{node, name}. A layer is a semantics node the framework flagsscopesRoute(page routes, dialogs, popup menus, sheets, drawers, dropdowns, search);nameis the label a screen reader announces for it (the firstnamesRoutelabel in the scope), or null. One layer per route:showDialog's route and theAlertDialoginside it fold into one layer, "Alert". Layers are what the user can reach, not the route stack: a modal barrier hides the routes beneath it, so an open dialog is the only layer (whererouteswent empty), and a navigator in a hidden tab is absent. Location, path and history belong to an extension such asleonard_router. - Add
SemanticsCapture.captureSnapshotAsyncandSemanticsSnapshot: the node records and route layers from one walk.captureAsyncreturns its nodes. - When the core budget trims semantics, each route layer's node record is kept.
- Deprecate
routes: it stays unchanged on the wire until leonard_flutter 0.9.0. Decision: core-reports-route-layers-from-semantics.
0.4.3 #
Stable promotion of 0.4.3-dev.2 on Nico's promotion call (2026-10-21). No changes on top; the two prerelease entries below carry the details. Together they make core.enter_text type only into a text field that is on screen: it no longer fails on a covered route that was never laid out (PR 208, contributed by @OleksandrKriatovResideo), and no longer writes into a field under a pushed route, on an unselected IndexedStack tab, or beneath a non-opaque route.
0.4.3-dev.2 #
- Fix:
core.enter_textno longer types into a field that is not on screen. It picks theEditableTextwhose rect overlaps the target node most, and the 0.4.3-dev.1 fix skipped only fields that were never laid out. A route that was laid out and then covered keeps its geometry, and so does an unselectedIndexedStackchild, so a sign-in field under a pushed profile screen, or a search field on another tab, stayed a candidate and could win on overlap: the tool wrote into the hidden field and returnedok: true. The search now walks only on-stage elements (the walk flutter_test'sskipOffstageuses), and a tie goes to the field later in the walk, which paints on top, as with a field on a non-opaque route over another. (lenny-5bw3t)
0.4.3-dev.1 #
- Fix:
core.enter_textno longer fails when a covered route holds a text field that was never laid out.resolveEditableTextread the geometry of every attachedEditableText, and the Overlay keeps covered routes attached without laying them out, so a page stack built with a text-field route already covered (a sign-in screen under a complete-your-profile barrier, for one) made the tool returnok: falsewith'hasSize': RenderBox was not laid outbefore it typed. Text fields without a size are now skipped: they are not on screen to be typed into.
0.4.2 #
Stable promotion of 0.4.2-dev.1 on Nico's promotion call (2026-10-21), after the live check on the macOS sample app and the publish workflow's live macOS gate passed. The prerelease entry below carries the details. One change on top:
- The bundled DevTools panel is rebuilt from current
leonard_devtools. The copy shipped since 0.4.0 was built on 2026-09-02, before the panel learned theacpprovider, so apps on publishedleonard_flutterhad no way to pick a Copilot or Codex harness (lenny-g7ie4). The panel now offers it; see theleonard_acpREADME for the bridge it needs.
0.4.2-dev.1 #
- Fix:
core.system_backis a back press, never an app exit (lenny-ssviv). It calledSystemNavigator.pop— the platform's "exit the app" call — so a back at the root quit the app and ended the run (seen live on the macOS sample app at its Home route). It now dispatches the press the way the engine does, throughWidgetsBinding.handlePopRouteand the app's registered observers (the rootNavigator, aRouter's back button dispatcher,PopScope, an open drawer). When nothing handles it, the tool absorbs the press instead of falling back toSystemNavigator.pop, so the app stays up. The result is stillokand now reports{handled, popped}—popped: falsemeans no route left the stack — and is carried into the next model turn.
0.4.1 #
Stable promotion of 0.4.1-dev.1: the same content, published on the stable rung on Nico's promotion call (2026-10-15), after the Android (Pixel 7a), iOS 26.5 simulator and macOS live suites passed. The prerelease entries below carry the full list.
0.4.1-dev.1 #
- Adopt canonical Genesis
ComponentandElementvocabulary throughout the binding and core perception path. FlutterWidget,Element, andBuildContextremain explicitly distinct from Genesis tree types. - Rename
buildCorePerceptionSeedtobuildCorePerceptionComponentand useTreeNode.componentTypein source while preserving diagnostics contract 1 and its literalseedTypeJSON key. - Require
genesis_perception ^0.4.0andleonard_contract ^0.3.0-dev.1.
0.4.0 #
Promotes 0.4.0-rc.2 to stable. The candidates' full change lists are under
those entries below; the break is restated here because this is the version a
consumer on 0.3.x upgrades to.
- Breaking:
captureScreenshotno longer takes aRendererBinding. Migration: drop the argument —captureScreenshot(binding)becomescaptureScreenshot(). - Fix:
core.handshakecarriestoolDescriptors— each registered tool's description and raw input schema — beside the baretoolsnames, so a driver can reject a malformed call before it reaches the device (lenny#123). - Add: the
core.rememberandcore.recalltools — a trim-proof scratchpad whose entries survive conversation trimming. Shipped in the 0.4.0-rc.2 archive and undocumented there (lenny#116). - Raise the
leonard_contractfloor to^0.2.5, the version that introducesExtensionRegistry.handshakeManifest.
0.4.0-rc.2 #
- Fix live
ext.leonard.core.screenshotcapture by calling Flutter's stockWidgetInspectorService.screenshotimplementation in process. This removes the app's VM-service self-connection and the package's runtimevm_servicedependency. Screenshot failures now expose six distinct unavailable reasons while preserving the four-key success envelope and JSON-RPC error code 1. - Floors
leonard_contractto^0.2.4(the binding passescarryForward, introduced there).
0.4.0-rc.1 #
- Breaking:
captureScreenshotno longer takes aRendererBinding. The exported top-level function is nowcaptureScreenshot(), capturing through the stock Flutter inspector screenshot protocol behind one bounded capture path instead of protectedRenderViewlayer capture. Migration: drop the argument —captureScreenshot(binding)becomescaptureScreenshot(). Leonard's response and failure envelopes are unchanged, and the extension now registers through the catalog seam.ScreenshotConfiggains the inspector capture timeout, object group, and argument builder. - Add
core.tap_at: a strict fractional tap that resolves logical coordinates inside an observed semantics node's rect and drives them through the existing hit-test path. The strictcore.tapcontract is unchanged. - Raise the
leonard_contractfloor to^0.2.2; the declared^0.2.0floor was unsatisfiable against this package's owngenesis_perceptionrange.
0.3.1 #
- Fix:
core.enter_textnow enters text throughEditableTextState.userUpdateTextEditingValue(the same path a physical keystroke uses) instead of assigningcontroller.valuedirectly.onChangedwas never fired before, leaving app state that depends on it — button enablement,Formvalidation — stale afterenter_text. Submission callbacks are unaffected:onSubmitted/onFieldSubmittedfire fromperformAction, not from an edit, soenter_textstill does not submit. No API changes.
0.3.0 #
- Breaking: test helpers no longer ship from
leonard_flutter. Addleonard_flutter_test: ^0.1.0todev_dependenciesand import its barrel instead. Imports of the deletedpackage:leonard_flutter/test_support/perception_serializer.dartmust usepackage:genesis_perception/genesis_perception.dartdirectly.
0.2.2 #
- feat: on-demand
ext.leonard.core.get_diagnostics_treediagnostics extension. Projects the core + registered perception extensions to Genesis diagnostics contract 1 only when requested (e.g. while the DevTools Diagnostics panel is open) —get_stable_observation's hot path is unchanged and still carries no diagnostics tree. A plainleonard_flutterdependency automatically discovers the bundled Leonard DevTools extension with Conversation and Diagnostics modes; no adopter dependency onleonard_devtoolsorgenesis_foundationis required. - Fix: move the test-only
leonard_agentdependency todev_dependencies, so applications can installleonard_flutteralongside packages that usesse_channel ^0.1.1(includingsignalr_netcore) without a version-solving conflict. No public API or runtime behavior changes.
0.2.1 #
- Bump
genesis_perceptionto^0.2.0(the genesis builder wave). No API changes in this package; the perception wire contract is unchanged.
0.2.0 #
- Breaking: VM-service methods now use
ext.leonard.*. Construct names withkLeonardExtensionPrefixfromleonard_contract. - The binding emits
kLeonardProtocolVersionin its handshake.
0.1.8 #
- Republish so the pub.dev archive actually carries
LeonardBinding.extensionsReady(aFuture<void>that completes once the leonard service extensions are registered). The getter landed in the repo while the version stayed 0.1.7, so the hosted 0.1.7 archive predates it and consumers pinning^0.1.7from pub.dev could not compile against it (butane_flutter-s2w).
0.1.7 #
- The core semantics fragment now emits
identifier(fromSemanticsData.identifier, set viaSemantics(identifier:)) alongsidelabelandvalue— a stable, locale-independent key for addressing a node. Emitted present-only, so apps that set no identifiers are unaffected.
0.1.6 #
- The core semantics fragment now emits a
valuefield (fromSemanticsData.value) alongsidelabel, so the harness sees a node's current value (e.g. a text field's contents) uniformly with the native channel's record shape. - Stability: the settle loop no longer wedges when a framework callback stays
registered across frames — the persistent-callback baseline is dropped from
isAnyBusy, so a quiet frame is correctly reported as idle.
0.1.5 #
core.handshakenow advertises acapabilitieslist alongside the extension manifest.screenshot(the rawcore.screenshotVM extension) is reachable but is not a namespaced tool, so it never appeared in the manifest — a driver listing tools would wrongly conclude "no screenshot". It is now reported as a capability, gated on the same debug/profile condition as the extension itself (absent in release).
0.1.4 #
- Extension contract extracted to the new
leonard_contractpackage (Flutter-free):LeonardExtension,LeonardTool,PerceptionExtension,ExtensionRegistry, and the dispatch helpers now live there and are re-exported viacontract.dart, so consumers are unaffected. Adds aleonard_contractdependency. The unused frame-callback and error-handler hooks were dropped, removing theSchedulerBinding/FlutterErrorDetailscoupling from the contract; the binding's error-ring-buffer capture is unchanged.
0.1.3 #
- Perception serialization de-duplicated:
serializePerceptionFragmentnow lives ingenesis_perceptionand is re-exported here. Bumps thegenesis_perceptionfloor to^0.1.2(the version that introduced it). - Observation: expose scroll extent (
pos/min/max) on scrollable nodes, so the agent can see scroll position and bounds instead of guessing.
0.1.2 #
- Fix: a new agent handshake resets the session-terminated latch set by
core.done. Previously, reusing one running app across multiple agent drives left the binding permanently terminated after the first drive'score.done, so every subsequent action returnedsession_terminatedand the agent appeared stuck (model-agnostic).core.handshakenow clears the latch — a handshake marks the start of a new session.
0.1.1 #
- Fix: ship the compiled DevTools extension bundle in the published package.
0.1.0 omitted
extension/devtools/build/because the repo-rootbuild/.gitignorerule excluded it (pub publishhonors.gitignore), so the "Leonard" DevTools tab was missing for consumers. The bundle is now un-ignored and shipped.
0.1.0 #
- Host
WidgetsBinding(LeonardBinding) with a single-path perception observation pipeline (PerceptionOwner-backed serialization). LeonardExtensionauthoring contract; core fragment is perception-native.- Ships the DevTools extension (the "Leonard" tab) via
extension/devtools/. - VM-service surface
ext.leonard.*(protocol-stable).