You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
0.13.0 (2026-09-28)
Fix: the iOS SDK connects with the Expo development network inspector enabled. Appduct's
WebSocket connection no longer fails with NSURLErrorDomain -1005 when that inspector is on.
Breaking: the CLI commands are now noun-verb, with no aliases.ls is now sessions ls, revoke is sessions revoke, link is sessions link, tools is tools ls, tools <name>
is tools describe <name>, invoke is tools call, events is events tail, and events --since <cursor> is events since <cursor>; a removed command's error names its
replacement.
Breaking: appduct_events returns flat events. Each event is now { name, payload, ts, seq, sessionId, alias } instead of { kind, data }, and limit now
defaults to 50.
New: filter events by name.appduct_events accepts name, a glob such as "cart.*"
(* matches any run of characters), to return only events whose name matches.
Breaking: appduct_events truncates a payload over 4096 bytes by default. A truncated event
comes back as { name, payloadPreview, truncated: true, payloadBytes } instead of { name, payload }; pass payloadMaxBytes to raise or lower the cap.
New: appduct_events and app.events() report dropped and remaining.dropped counts
events evicted from the retention buffer before you asked, and remaining counts events still
waiting after the page you got back.
New: appduct events tail and appduct events since accept --name <glob> and --payload-max-bytes <n>. They filter events by name and cap payload size; payloads print
whole unless you pass --payload-max-bytes.
New: appduct events since's trailing cursor line reports dropped and remaining. dropped counts events evicted from the retention buffer before this pull, and remaining
counts matching events still waiting beyond this page.
New: app.events() accepts payloadMaxBytes to cap an event's payload size. Without it every
event keeps its full payload; with it, an oversized payload comes back as payloadPreview/ payloadBytes and you check truncated before reading payload.
Breaking: appduct/client's AppEvent and EventsResult types may now be truncated. Code
that annotates a variable or parameter with AppEvent/EventsResult and reads .payload
unconditionally should switch to FullAppEvent/FullEventsResult, which appduct/client now
exports alongside TruncatedAppEvent.
Breaking: appduct_wait_for_event's name is now a glob, and match is removed.name
matches the same whole-name glob appduct_events does (* waits for the next event of any
name); pass match and the call now fails with invalid_request.
Breaking: appduct_wait_for_event truncates a payload over 4096 bytes by default and reports dropped. Same shape as appduct_events: a truncated result comes back as { name, payloadPreview, truncated: true, payloadBytes, ... } instead of { name, payload, ... };
pass payloadMaxBytes to raise or lower the cap.
Breaking: app.waitForEvent()'s name is now a glob, WaitForEventOptions.match is removed,
and it now accepts payloadMaxBytes.app.waitForEvent("cart.*") waits for any name matching
the glob and match is gone; pass payloadMaxBytes to cap the resolved event's payload the same
way app.events() does, otherwise it comes back whole as before.
Docs: the shipped skill covers draining and waiting for app events.skills/appduct now
shows the appduct_events drain loop (name glob, cursor, remaining, dropped) and the appduct_wait_for_event background wait.