Skip to content

v0.13.0

Latest

Choose a tag to compare

@V3RON V3RON released this 28 Sep 13:13
· 3 commits to main since this release
762bd4f

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.