Skip to content

feat!: mint file links at click time, and voice fixes for late interruptions - #39

Merged
MatthewHsu1 merged 3 commits into
mainfrom
feat/file-links-on-click
Oct 7, 2026
Merged

MatthewHsu1 merged 3 commits into
mainfrom
feat/file-links-on-click

Conversation

@MatthewHsu1

Copy link
Copy Markdown
Owner

Change

  • File links at click time. file.publish returns a stable sandbox:/ name, not a signed URL.
    • The file list and the stream's file frame carry facts only. They carry no link.
    • IConversations.LinkFileAsync mints a five-minute link for one kept file when the person asks for it.
    • BlobOwner.IsSafe is the one owner id rule. The S3 store and the link lookup share it.
  • Voice: an interruption after the last word cuts nothing. A reply whose every word was forwarded, and whose engine turn is over, now ends as a whole reply. Before, a late barge-in settled it as a cut reply and waited for a report that never came.
    • TextPlayback.Full now means every fragment reached the output, even when an interruption came after the last one.
    • SpeechScheduler.CurrentSpeech no longer returns a speech that is already done.
  • Voice: last words before a hang-up. The Telnyx relay pump reads on after the peer drops, up to the close timeout. Frames the peer sent just before it went now reach the conversation.
  • Lint. SonarQube cleanup, no behaviour change.

Public API

This breaks the API that v0.14.0 shipped:

  • FileLink is removed.
  • Conversations.LinkFilesAsync is removed. Use LinkFileAsync for one file.
  • The file frame's url field is removed.
  • StoredConversation.Files is now a list of BlobRef.

Tests

  • ConversationsTests, FilePublishToolDefinitionTests, FileWireTests, and TurnStreamFilesTests cover the click-time link.
  • ReplyHearingTests, TextForwardingTests, and TelnyxRelayLineSpokenTests cover the late interruption and the last words before a hang-up.
  • Local run: build 0 warnings, all tests pass. Postgres, Qdrant, and S3 tests were skipped locally.

file.publish returns a sandbox:/ name instead of a signed URL. Listing a
conversation's files and the stream's file frame carry facts only.
IConversations.LinkFileAsync mints a five-minute link for one kept file
when the person asks for it. BlobOwner.IsSafe is the one owner id rule,
shared by the S3 store and the link lookup.

Breaking: FileLink, Conversations.LinkFilesAsync, and the file frame's
url field are gone. StoredConversation.Files is now a list of BlobRef.
@MatthewHsu1
MatthewHsu1 merged commit 5e0c733 into main Oct 7, 2026
1 check passed
@MatthewHsu1
MatthewHsu1 deleted the feat/file-links-on-click branch October 7, 2026 16:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant