paperclipai/paperclip · error
No selection to anchor to.
Error message
No selection to anchor to.
What it means
UI annotation mutation precondition: createThread was invoked with no active text selection to anchor a new comment thread to. The guard fails fast in the mutationFn before any API call; the fix is UI-side — require a selection before enabling the annotate action.
Source
Thrown at ui/src/hooks/useDocumentAnnotationMutations.ts:46
id: session?.user?.id ?? null,
name: session?.user?.name?.trim() || session?.user?.email?.trim() || "You",
image: session?.user?.image ?? null,
}), [session]);
const queryKey = useMemo(() => options.target.kind === "routine"
? queryKeys.routines.documentAnnotations(options.target.routineId, options.target.documentKey, "all")
: options.target.kind === "case"
? queryKeys.cases.documentAnnotations(options.target.caseId, options.target.documentKey, "all")
: queryKeys.issues.documentAnnotations(options.target.issueId, options.target.documentKey, "all"), [options.target]);
const invalidateAll = useCallback(() => queryClient.invalidateQueries({
predicate: (query) => Array.isArray(query.queryKey)
&& query.queryKey[1] === "document-annotations"
&& query.queryKey[2] === (options.target.kind === "issue" ? options.target.issueId : options.target.kind === "case" ? options.target.caseId : options.target.routineId)
&& query.queryKey[3] === options.target.documentKey,
}), [options.target, queryClient]);
const createThread = useMutation({
mutationFn: async (body: string) => {
if (!options.pendingAnchor) throw new Error("No selection to anchor to.");
if (!options.baseRevisionId) throw new Error("Document has no revision yet.");
return documentAnnotationsApi.createForTarget(options.target, {
baseRevisionId: options.baseRevisionId,
baseRevisionNumber: options.baseRevisionNumber,
selector: options.pendingAnchor.selector,
body,
});
},
onMutate: async (body) => {
if (!options.pendingAnchor || !options.baseRevisionId) return undefined;
setMutationError(null);
await queryClient.cancelQueries({ queryKey });
const previous = queryClient.getQueryData<DocumentAnnotationThreadWithComments[]>(queryKey);
const optimistic = buildOptimisticThread(body, options, currentUser);
queryClient.setQueryData<DocumentAnnotationThreadWithComments[]>(queryKey, (current) => [...(current ?? []), optimistic]);
options.onFocusThread(optimistic.id);
return { previous, optimisticId: optimistic.id };
},View on GitHub (pinned to 120ae5428f)
Solutions
- Select the text or region in the document before creating the annotation.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at ui/src/hooks/useDocumentAnnotationMutations.ts:46 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of paperclipai/paperclip@120ae5428f (2026-08-18).
Data as JSON: /api/errors/e561ca65bbddce7f.
Report an issue: GitHub.