multica-ai/multica · error

File exceeds 100 MB limit

Error message

File exceeds 100 MB limit

What it means

Wrap thrown by prepareHermesHome when detachHermesMemories fails. When NO memory store is configured (no agent to key on, or an unresolvable profile dir), the overlay must fall back to a fresh task-local memories/ dir — detach removes/neutralizes any inherited memories link so state does not leak between tasks. Failure to do that is fatal because it would break memory isolation.

Source

Thrown at packages/core/hooks/use-file-upload.ts:119

  // In-flight counter, NOT a single boolean. Callers fire multiple uploads
  // concurrently (drag-drop of N files, paste with multiple images) and the
  // boolean shape would flip false as soon as the FIRST upload's finally ran
  // — even though N-1 are still mid-request. Surfaces consuming `uploading`
  // (the quick-create submit gate, the editor's "Uploading…" button label)
  // would then unblock submit while uploads are still in flight, causing
  // `stripBlobUrls` to erase the still-pending images from the markdown and
  // their attachment ids never to be bound (MUL-3339).
  //
  // The exposed `uploading: boolean` keeps the existing call-site contract
  // (`{ uploading } = useFileUpload(api)` everywhere); only the internal
  // tracking shape changes.
  const [inFlight, setInFlight] = useState(0);
  const uploading = inFlight > 0;

  const upload = useCallback(
    async (file: File, ctx?: UploadContext): Promise<UploadResult | null> => {
      if (file.size > MAX_FILE_SIZE) {
        throw new Error("File exceeds 100 MB limit");
      }

      setInFlight((n) => n + 1);
      try {
        const att: Attachment = await api.uploadFile(file, {
          issueId: ctx?.issueId,
          commentId: ctx?.commentId,
          chatSessionId: ctx?.chatSessionId,
        });
        return toUploadResult(att);
      } finally {
        setInFlight((n) => n - 1);
      }
    },
    [api],
  );

  const uploadWithToast = useCallback(

View on GitHub (pinned to 2c0912b6ec)

Solutions

  1. Inspect <envRoot>/hermes-home/memories and remove/repair the stale entry manually so detach can proceed.
  2. Fix ownership of the hermes-home tree for the daemon user.
  3. Delete the whole per-task env-root to force a clean rebuild.
  4. If a memory store is actually intended for this agent, configure it so the mount path is taken instead of the detach fallback.
Defensive patterns

Strategy: try-catch

Validate before calling

// when no store is configured, ensure a clean slate for the fallback
if memoryStore == "" {
    if err := os.RemoveAll(filepath.Join(envRoot, "hermes-home", "memories")); err != nil {
        return err
    }
}

Try / catch

if err := prepareHermesHome(...); err != nil {
    if strings.Contains(err.Error(), "create task memories dir") {
        // remove the conflicting memories/ entry or wipe env-root, retry prepare
    }
}

Prevention

When it happens

Trigger: prepareHermesHome is called with an empty memoryStore and detachHermesMemories(hermesHome) errors — e.g. it cannot remove or replace an existing memories/ link/dir inside hermes-home due to permissions, an undeletable entry, or a full disk.

Common situations: Recycled env-root whose hermes-home still carries a memories/ link owned by another user; read-only overlay; daemon UID change.

Related errors


AI-assisted analysis of multica-ai/multica@2c0912b6ec (2026-08-15). Data as JSON: /api/errors/59b7cbee5fd7912b. Report an issue: GitHub.