Watch: what changed on Recent cards and the thread screen, search in All threads, a switching complication with Allow and Deny in the Smart Stack, and question options on notifications

This commit is contained in:
gib committed 2026-11-02 13:56:10 -05:00
1 parent f8241e42bb
commit bfcbb69550
29 files changed
+1100 -137

No files matched your search

+42 -6
View File
@@ -1,5 +1,6 @@
// One thread: the agent's latest message large, older messages one scroll up with Load earlier above
// them, the pending approval or question with its options, the thread's subagents, Reply by
// them, the pending approval or question with its options, the thread's subagents, the files its
// latest run changed with their line counts, Reply by
// dictation or Scribble, Settle once it finished or failed, an Ask before acting switch, and Stop
// while a run is active. A subagent's request shows first, labeled with the subagent. Message text
// renders as markdown.
@@ -143,11 +144,7 @@ struct ThreadView: View {
}
if !detail.subagents.isEmpty {
Text("Subagents")
.font(.system(size: 11, weight: .semibold))
.foregroundStyle(Theme.secondaryText)
.padding(.horizontal, 6)
.padding(.top, 4)
sectionLabel("Subagents")
ForEach(detail.subagents) { row in
ThreadLine(row: row) {
Text(row.statusWord)
@@ -156,6 +153,13 @@ struct ThreadView: View {
}
}
if !detail.changedFiles.isEmpty {
sectionLabel("Changed")
ForEach(detail.changedFiles) { file in
ChangedFileRow(file: file)
}
}
if item.phase == .completed && item.request == nil {
QuickReplies { send($0) }
.disabled(sending)
@@ -196,6 +200,15 @@ struct ThreadView: View {
}
}
/// A small grey title over a list, such as Subagents or Changed.
private func sectionLabel(_ title: String) -> some View {
Text(title)
.font(.system(size: 11, weight: .semibold))
.foregroundStyle(Theme.secondaryText)
.padding(.horizontal, 6)
.padding(.top, 4)
}
@ViewBuilder
private func requestCards(_ request: PendingRequest, from via: FeedItem.Via?) -> some View {
if request.isQuestion {
@@ -517,6 +530,29 @@ private struct MessageRow: View {
}
}
/// A file the latest run changed: its name in monospace, and its line counts on the right. Read only.
private struct ChangedFileRow: View {
var file: ChangedFile
var body: some View {
Card(edge: Theme.card) {
HStack(spacing: 6) {
Text(code: file.name)
.foregroundStyle(.white)
.lineLimit(1)
.truncationMode(.middle)
Spacer(minLength: 4)
Text(changes: ChangeTotals(files: 1, additions: file.additions, deletions: file.deletions), files: false)
.lineLimit(1)
.layoutPriority(1)
}
.font(.system(size: 12))
}
.accessibilityElement(children: .ignore)
.accessibilityLabel("\(file.name), \(file.additions) added, \(file.deletions) removed")
}
}
/// One-tap replies for a finished turn, like mock B's chips.
private struct QuickReplies: View {
var send: (String) -> Void