Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
2fb39ac
fix(server): agent messages no longer cancel Claude tools
Alb11747 Oct 18, 2026
f0b61a6
test(server): verify queued agent send results
Alb11747 Oct 18, 2026
d048ff6
Merge commit '952921f39acd7793187e2b14650f1cbc447f483d' into takeover…
juliusmarminge Oct 18, 2026
ccd3c59
fix(server): agent messages no longer cancel Claude tools
Alb11747 Oct 18, 2026
0ced527
fix(server): agent messages no longer cancel Claude tools
Alb11747 Oct 18, 2026
5d42ba6
test(server): agent updates queue behind tool-interrupting turns
juliusmarminge Oct 19, 2026
30d8c6b
Merge contributor rewrite ccd3c59866 into takeover/21158
juliusmarminge Oct 19, 2026
ca933b2
Merge origin/main 325a7e2ae4 into takeover/21158
juliusmarminge Oct 19, 2026
ca5ee82
fix(server): agent updates after Stop are rejected, not queued
juliusmarminge Oct 19, 2026
f5c718f
Merge contributor rewrite 0ced5275ec into takeover/21158 (ancestry on…
juliusmarminge Oct 19, 2026
78ad2e5
fix(server): agent messages no longer cancel Claude tools
Alb11747 Oct 18, 2026
4e1a46f
Merge contributor update preserving reviewed next-turn delivery
juliusmarminge Oct 19, 2026
2418c1c
fix(server): Claude takes agent updates at tool boundaries
Alb11747 Oct 20, 2026
ed47e6f
fix(server): keep send tracking when a tool boundary takes an update
Alb11747 Oct 20, 2026
d4ac7c1
fix(server): stop boundary claims on hook abort and read only queued …
Alb11747 Oct 20, 2026
e3d8245
chore: merge main into Claude agent steering PR
Alb11747 Oct 22, 2026
3accb79
test(server): agent updates with attachments queue and aborted bounda…
juliusmarminge Oct 24, 2026
64ea3fa
fix(server): agent updates to tool-cancelling turns always wait for t…
juliusmarminge Oct 24, 2026
9acbcd0
test(server): a parent's queued update to a running Claude child beco…
juliusmarminge Oct 24, 2026
b02602b
chore: merge upstream main into Claude steering PR
Alb11747 Nov 8, 2026
2b33b7c
fix(server): deliver Claude updates at native tool boundaries
Alb11747 Nov 8, 2026
ef7aeae
fix(server): keep delivery guidance within the context budget
Alb11747 Nov 8, 2026
7d36097
test(server): align Claude replay coverage with native boundaries
Alb11747 Nov 8, 2026
7152cd9
test(server): isolate native-subagent replay checkpoints
Alb11747 Nov 8, 2026
07750aa
fix(server): preserve goal and completion receipt transitions
Alb11747 Nov 8, 2026
3e5cea9
merge: integrate upstream main into Claude boundary delivery
Alb11747 Nov 12, 2026
bdcf05a
perf(server): read Claude boundary receipts from the handoff offset
Alb11747 Nov 12, 2026
328e241
fix(server): confirm Claude messages at the tool boundary
Alb11747 Nov 12, 2026
9a33e8d
fix(server): deliver parent follow-ups at Claude tool boundaries
Alb11747 Nov 12, 2026
bda1e7d
fix(server): bound Claude receipt re-reads and recheck rewritten tran…
Alb11747 Nov 12, 2026
146c394
fix(server): retire Claude receipt batches when transcript reads fail
Alb11747 Nov 12, 2026
c9aed41
fix(server): keep tool-boundary delivery to providers that deliver there
Alb11747 Nov 12, 2026
3e0e70b
merge: integrate upstream main into Claude boundary delivery
Alb11747 Nov 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 18 additions & 5 deletions apps/mobile/src/features/threads/ThreadQueueControl.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
queuedRunEditBlockedReason,
} from "@t3tools/client-runtime/queued-run-edit";
import { scopeThreadRef } from "@t3tools/client-runtime/environment";
import { UNCONFIRMED_DELIVERY_HINT } from "@t3tools/client-runtime/state/thread-workflows";
import { resolveUserMessagePresentation } from "@t3tools/client-runtime/user-message";
import type { ChatAttachment, EnvironmentId, RunId, ThreadId } from "@t3tools/contracts";
import { Atom } from "effect/reactivity";
Expand Down Expand Up @@ -151,9 +152,9 @@ export function ThreadQueueSheet({ route }: StaticScreenProps<QueueTarget>) {
if (busyRef.current) return;
const index = queuedRuns.findIndex(({ run }) => run.id === runId);
if (index < 0) return;
const entry = queuedRuns[index]!;
if (action === "edit") {
if (editBlockedReason !== null) return;
const entry = queuedRuns[index]!;
if (editBlockedReason !== null || entry.editBlockedReason !== null) return;
void Haptics.selectionAsync();
beginQueuedRunEdit(
threadKey,
Expand All @@ -177,6 +178,7 @@ export function ThreadQueueSheet({ route }: StaticScreenProps<QueueTarget>) {
return;
}
if (action !== "steer" && action !== "remove") return;
if (action === "steer" && entry.automatic && workflow?.canSendNow !== true) return;
busyRef.current = true;
setBusyRunId(runId);
void Haptics.selectionAsync();
Expand Down Expand Up @@ -227,20 +229,26 @@ export function ThreadQueueSheet({ route }: StaticScreenProps<QueueTarget>) {
{editBlockedReason !== null && queuedRuns.length > 0 ? (
<Text className="py-3 text-sm text-foreground-muted">{editBlockedReason}</Text>
) : null}
{queuedRuns.some((entry) => entry.delivery === "unconfirmed") ? (
<Text className="py-3 text-sm text-foreground-muted">{UNCONFIRMED_DELIVERY_HINT}</Text>
) : null}
{queuedRuns.length === 0 ? (
<Text className="pt-6 text-center text-sm text-foreground-muted">
No messages waiting in this queue.
</Text>
) : null}
{queuedRuns.map(({ run, text, attachments, context, message }, index) => {
{queuedRuns.map((entry, index) => {
const { run, text, attachments, context, message } = entry;
const rowEditBlockedReason = editBlockedReason ?? entry.editBlockedReason;
const controls = resolveThreadQueueRowControls({
busy: busyRunId !== null,
// A fresh message starts its own turn: it may skip compaction, but not steer into a turn.
canPromoteToSteer:
!entry.automatic &&
(workflow?.canPromoteToSteer ?? false) &&
(run.freshContext !== true || workflow?.promoteSkipsCompaction === true),
canSendNow: workflow?.canSendNow ?? false,
editBlocked: editBlockedReason !== null,
editBlocked: rowEditBlockedReason !== null,
isEditing: editing?.runId === run.id,
isGuestMessage: context?.guest !== undefined,
text,
Expand Down Expand Up @@ -292,7 +300,7 @@ export function ThreadQueueSheet({ route }: StaticScreenProps<QueueTarget>) {
accessibilityHint={
controls.canEdit
? "Opens this message in the composer for editing"
: (editBlockedReason ?? undefined)
: (rowEditBlockedReason ?? undefined)
}
disabled={!controls.canEdit}
onPress={() => void act(run.id, "edit")}
Expand Down Expand Up @@ -321,6 +329,11 @@ export function ThreadQueueSheet({ route }: StaticScreenProps<QueueTarget>) {
)}
{title}
</Text>
{entry.delivery !== "queued" ? (
<Text className="text-2xs text-foreground-muted">
{entry.deliveryLabel}
</Text>
) : null}
</View>
{controls.isEditing ? (
<Text className="shrink-0 text-2xs uppercase tracking-wide text-primary">
Expand Down
Loading
Loading