Studio: fix stuck composer prompt on first send and unreachable --secure Cloudflare links (#7340)

* Studio: clear composer draft on send

* Studio: verify the Cloudflare link is reachable before printing it

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Studio: wait for tunnel DNS propagation before verifying the public URL

* Studio: bound tunnel DNS wait and health probe by one deadline

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Studio: keep composer draft when overlay send validation fails

* Studio: retry transient DoH failures while waiting for tunnel DNS

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
Nilay 2026-07-23 13:09:14 +05:30 committed by GitHub
commit bfb6b9600c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 327 additions and 6 deletions

View file

@ -1570,6 +1570,18 @@ const Composer: FC<{
const t = setTimeout(() => writeComposerDraft(draftKey, composerText), 300);
return () => clearTimeout(t);
}, [composerText, draftKey]);
// Without this the restore effect above puts the sent text back when the
// runtime rebinds on the first message.
const draftKeyRef = useRef(draftKey);
useEffect(() => {
draftKeyRef.current = draftKey;
}, [draftKey]);
const clearStoredDraft = useCallback(() => {
const key = draftKeyRef.current;
if (key) {
writeComposerDraft(key, "");
}
}, []);
// react-textarea-autosize re-measures only on value change or window resize,
// not on the width swap from expanding, so it keeps the taller height and
// leaves a stray blank row. Nudge a resize whenever input width changes.
@ -1720,9 +1732,10 @@ const Composer: FC<{
setPendingSend(false);
dismissWaitToast();
if (text.trim().length > 0 || attachments.length > 0) {
clearStoredDraft();
aui.composer().send();
}
}, [pendingSend, indexingActive, aui, dismissWaitToast]);
}, [pendingSend, indexingActive, aui, clearStoredDraft, dismissWaitToast]);
// Drop any queued send + toast on unmount (e.g. thread switch).
useEffect(
@ -1765,6 +1778,7 @@ const Composer: FC<{
flushResourcesSync(() => {
aui.composer().setText("");
});
clearStoredDraft();
startPromptQueue(
[queuedPrompt],
createPromptQueueTarget(),
@ -1798,6 +1812,7 @@ const Composer: FC<{
closeOverlay();
return;
}
clearStoredDraft();
setImageToolsEnabled(true);
setPendingImageEditReference({
threadId: overlay.threadId ?? referenceThreadId,
@ -1815,11 +1830,15 @@ const Composer: FC<{
);
});
closeOverlay();
return;
}
clearStoredDraft();
},
[
aui,
canQueueCurrentPrompt,
clearStoredDraft,
closeOverlay,
composerText,
createPromptQueueTarget,
@ -1921,6 +1940,7 @@ const Composer: FC<{
flushResourcesSync(() => {
aui.composer().setText("");
});
clearStoredDraft();
startPromptQueue([queuedPrompt], createPromptQueueTarget(), true);
}}
onSendClick={interceptSend}