SASE integration
sase-listen never imports sase: the only sase_* entry point is
sase_commands (which mounts the sase listen command plugin), and
SASE-side integration lives in the sibling plugin repos. sase-listen only
shells out to sase artifact read at runtime to resolve kind:path refs.
Two installs, one codebase:
sase plugin install listengivessase listen— the first-class command plugin for people who use sase.uv tool install sase-listengives the standalone binary for people who don't use sase.
Both run the same code; help text and "run this next" hints name whichever binary was invoked.
#research/audio xprompt (sase-research-artifacts)
Narrate any research report from inside a SASE session:
- The xprompt resolves the report: an explicit
@research:ref selects exactly that file; swarm audio narrates the lead's<name>__final.md(the file the lead wrote, even if<name>.mdhas since appeared). - It runs
sase-listen guide --edition <edition>(brief by default;fullandbriefare the supported guide-backed authoring choices) and writes<stem>_narration.mdnext to the report (__finalstripped from the stem), withsource,source_blob,date,kind: research,editionmatching the selected edition, andcoverwhen a<stem>_infographic.pngexists. - It lints with
sase-listen lint <script> --source <report>until clean, renders withsase-listen render <script> --json, registers the MP3 withsase artifact create -k file -l "audio:<episode_id>", and setssase var set audiofrom the render JSON. A failed render setsaudio.ok=false, registers no artifact, and completes normally.
The narration companion (<stem>_narration.md) is excluded from the
@research inventory and Highlights hook by glob, like the image companion.
research_swarm audio stage (sase-research-artifacts)
Pass audio=true (optionally audio_model="@audio",
audio_edition="brief" or "full") to add an opt-in stage after the lead
researcher — and after the image agent when image=true, so the infographic
can be the cover. audio=true implies the linker: the linker waits on audio
and publishes a listen card plus audio: frontmatter on the canonical
<name>.md. bob later binds the library MP3 for the Highlights PDF. The
stage agent runs the same write → lint → render → register flow as
#research/audio (brief by default), sets sase var set audio, and reports
duration, chapters, approximate cost, and feed publication. A failed TTS
render completes the audio agent so the linker can still publish, without a
card. Edition selection affects newly authored narration, not whether audio
is enabled.
Telegram delivery (sase-telegram)
.mp3/.m4a attachments route to sendAudio in the outbound loop, so
episodes arrive in Telegram's music player instead of as generic documents:
- Title, performer, and duration are read from the ID3 tags sase-listen writes; any read failure falls back to sending without metadata.
- Files over the 50 MB bot-audio limit fall back to a document send.
- At 64 kb/s mono, a 15-minute episode is about 7 MB — well under the limit.