slipstream_agent 1.2.1
slipstream_agent: ^1.2.1 copied to clipboard
An in-process companion for the Flutter Slipstream agent tools.
1.2.1 #
- Fix
scroll_until_visiblefor lazy/virtual lists: the target finder is now re-evaluated after each scroll step so thatListView.builderitems are discovered as they enter the render tree. Previously the element was looked up once before scrolling began, causing the action to fail immediately for any item not yet built. - For the 'scroll: xx px' toast, display the scroll rounded to the nearest int.
1.2.0 #
ext.slipstream.perform_actionandext.slipstream.navigatenow wait for the widget tree to settle before returning, giving animations and navigation transitions time to complete before the next tool call.- Add a persistent error banner:
FlutterError.onErroris intercepted and surfaces errors as a red chip near the top of the screen showing a running count and a brief summary, e.g.flutter.error: Null check operator…. The banner is visible in agent screenshots and clears automatically on hot reload or via the newext.slipstream.clear_errorsextension. - Add
ext.slipstream.clear_errorsextension: dismisses the error banner (call afterget_outputor whenever the agent has acknowledged the errors). - Add
byTextContainingfinder: matches aTextwidget whose content contains the given value as a substring. Useful when displayed text is truncated (e.g."Lorem ipsum..."vs the full string). - Remove the
ext.slipstream.windowResizedtelemetry event. VM service events are not pushed into agent context, so agents would need to poll for them — making the event low value in practice.
1.1.1 #
- Fix ghost overlay not appearing in apps that use
MaterialApp.router(e.g. GoRouter withShellRoute). In current Flutter,OverlayEntry.mountedonly becomestrueafter the widget builds on the next frame, not immediately afteroverlay.insert(). The fix tracks the targetOverlayStateand skips re-insertion when the entry is pending its first build on the same overlay. - Addressed an intermittent error after a hot restart; "Multiple widgets used the same GlobalKey".
- Fix
bySemanticsLabelfinder missing widgets whose semantics label comes from an implicit source (e.g.ElevatedButtonmerging its child text,TextFieldmappingInputDecoration.labelText,Semantics.attributedLabel). The finder now falls back to the render-level semantics node — the same data source asext.slipstream.get_semantics— so the label an agent sees inget_semanticsoutput can always be used to target that widget.
1.1.0 #
- Add
ext.slipstream.logextension and ghost overlay command log. A translucent chip appears at the bottom of the app showing the most recent agent action (e.g. "tap: login_button", "navigate: /home"), then slides out after 3 seconds. In-process extensions log automatically; the MCP server callsext.slipstream.logfor out-of-process operations (reload, screenshot, evaluate, etc.). - Ghost overlay now installs on the first
ext.slipstream.ping(or any log call), permanently replacing the Flutter debug banner with a "slipstream" banner in the top-right corner.ext.slipstream.overlaysnow only toggles the ghost overlay visibility (banner + chips) and no longer saves/restoresWidgetsApp.debugAllowBannerOverride. ext.slipstream.logacceptskind,finder,finderValue, andvizparameters for richer visualizations.kindcontrols the icon shown in the chip ("read","interact","reload","screenshot").viztriggers an extra visual effect:"flash"(brief full-screen tint),"outline"(animated bounding-box highlight on the target widget),"semantics"(bounding-box outlines on all visible semantics nodes), or"layout"(falls back to"outline"for now).- Fix
ext.slipstream.get_semanticsreturning incorrect screen-space coordinates. The previous implementation accumulatedSemanticsNode.transformvalues, which are in physical pixels (scaled bydevicePixelRatio). The new implementation walks the render tree usingRenderBox.localToGlobal, which stays in logical pixels and matches the overlay coordinate system.visitChildrenForSemanticsis used instead ofvisitChildrenso that render objects excluded from semantics (e.g. inactiveIndexedStacktabs) are not collected.
1.0.0 #
- Add
ext.slipstream.overlaysextension. Calling withenabled=falsesaves the current overlay state and hides all managed overlays (currently the Flutter debug banner viaWidgetsApp.debugAllowBannerOverride); calling withenabled=truerestores the previously saved state. Designed for the screenshot use case: hide → capture → restore.
0.1.2 #
- Fix
GoRouterAdapterlistener registration: cast toListenable(fromflutter/foundation.dart) rather than a concrete type, restoring the zero-go_router-dependency design. - Fix
get_semanticsreturning an empty node list: revert semantics owner lookup topipelineOwner.semanticsOwner(rootPipelineOwnerwas returning null). - Debounce
ext.slipstream.windowResizedevents by 100 ms to avoid flooding clients during continuous window resize. - Switch
scrollElementfromanimateTotojumpTo— animation served no purpose for an AI agent caller.
0.1.1 #
- Update
GoRouterAdapterto reference the router via the [RouterConfig] parent type for additional type safety.
0.1.0 #
Initial release.
SlipstreamAgent.init()registers VM service extensions that the Flutter Slipstream MCP server uses for enhanced app interaction. All extensions are no-ops outsidekDebugModeand are tree-shaken from release builds.- Service extensions registered:
ext.slipstream.ping— session detection and version reportingext.slipstream.perform_action— tap, set_text, scroll, and scroll_until_visible via element-tree finders (byKey,byType,byText,bySemanticsLabel)ext.slipstream.enable_semantics— enables the Flutter semantics treeext.slipstream.get_semantics— returns visible semantics nodes as structured JSON with screen-space bounds (more accurate than the out-of-process evaluate-based implementation)ext.slipstream.navigate— navigates to a route path via the registeredRouterAdapterext.slipstream.get_route— returns the current route path via the registeredRouterAdapter
- Telemetry events posted to the VM service
Extensionstream:ext.slipstream.windowResized— fired on window/display metric changesext.slipstream.routeChanged— fired on route changes (requires aRouterAdapter)
GoRouterAdapterprovidesgo_routersupport (but without a transitive dependency onpackage:go_router).