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

  1. 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.