Skip to main content

Files: Timeline and Folders

Files at /uploads keeps one server-owned identity for each upload and presents it in two ways.
  • Timeline is newest-first storage history across uploads.
  • Folders shows server-owned folder placement and keeps truly unfiled uploads visible at the root.
The current GreatBook Files Timeline refusing a missing demo response instead of showing an empty inventory

The credential-free demo omits the Timeline response. The current UI names that failure and refuses to call the inventory empty.

The drop zone stores the file first. PDF, JPEG, PNG, WebP, and JSON are accepted attachment types for the Clerk’s document-reading path; other business files remain stored evidence rather than being silently parsed as something else. The current web source does not preserve the upload-authority token required for the Clerk to adopt this already-persisted Files row, so that browser hop is not claimed end to end. Upload to posted journal entry traces the working source contracts and names this boundary explicitly. The current backend implements publication and reconciliation for a governed Google Drive mirror; this is a code boundary, not a claim that OAuth or an external connector is activated. GreatBook owns the canonical upload identity and Drive placement metadata; the Drive view is a mirror, not a second source of truth.

What this surface refuses

Files does not call an upload classified before the classifier answered, hide unfiled uploads from the Folders root, equate storage with ingestion, or accept Drive state as authoritative over the GreatBook upload record. The Drive publisher refuses unsafe role layouts, unexpected parents, hash disagreement, and ambiguous or missing mirror identity rather than overwriting around them.

When the answer is unknown

Missing classification is shown as not classified. Missing placement is shown as unfiled. Mirror reconciliation reports one of matched, local_only, remote_only, content_mismatch, moved, ambiguous, or unreadable; an unscanned mirror remains not_scanned. If either view cannot be read, the page shows an unavailable state instead of an empty inventory. Both views use server-derived totals, deterministic ordering, has_more, and next_offset; the browser does not synthesize a continuation from the number of rows it received.

Verified at source

  • langgraph_chat/devcenter/uploads_api.py defines Timeline, Folders, root placement, pagination, and server-derived upload identity.
  • langgraph_chat/uploads/drive_mirror.py, gdrive_client.py, and drive_types.py define the governed Drive publish/reconcile boundary shipped in backend PR #96.
  • The GreatBook web repository’s src/lib/uploads.ts and src/app/uploads/page.tsx preserve unreadable and unreported fields instead of coercing them to empty values.
  • src/lib/multimodal-utils.ts is the current browser attachment boundary; it preserves the Files id and storage path but not the backend’s upload-authority token.