Skip to content

v0.7.63: chat pins, ui improvements, bump deps, file improvements - #6382

Merged
waleedlatif1 merged 8 commits into
mainfrom
staging
Aug 7, 2026
Merged

v0.7.63: chat pins, ui improvements, bump deps, file improvements#6382
waleedlatif1 merged 8 commits into
mainfrom
staging

Conversation

@waleedlatif1

Copy link
Copy Markdown
Collaborator

icecrasher321and others added 8 commits August 6, 2026 22:07
…ce, Self-Hostable Teams (#6369)
Co-authored-by: Sim Pi Agent <pi@sim.ai>
* improvement(tables): show a tooltip on truncated column headers
* chore(tables): use absolute import for HeaderLabel
The pin glyph carried a stale `!isCurrentRoute` guard copy-pasted from the
status dot back when the dot was also hidden on the current route. #4354 later
relaxed the dot's guard but left the pin's untouched, so opening a pinned chat
made its pin vanish.
Derive `showStatusDot` once and express the pin as its negation so the two
conditions can no longer drift apart. Also align the collapsed rail, which
never forwarded `isCurrentRoute` and so showed an unread dot on the chat you
were already reading, and hide the pin by the same opacity mechanism the dot
uses instead of a display toggle plus a mount guard.
…a failure (#6378)
* fix(uploads): treat a missing storage object as absent metadata, not a failure
A workspace file is rewritten under a new key on every content update and the
superseded object is deleted, so any reader holding the previous key finds
nothing. getFileMetadata's provider lookups let that not-found propagate, so
authorization's catch-all logged it at ERROR and never reached the branch
already written for it. Return the function's established empty value instead,
and collapse the three divergent per-provider not-found predicates onto one.
* fix(uploads): read the not-found label from code as well as name
Azure raises a RestError whose name carries the class and whose code carries the
reason, so testing name first and falling back to code only when name was absent
missed BlobNotFound outright — narrower than the per-provider check it replaced.
* fix(uploads): keep a missing bucket or container out of the not-found path
NoSuchBucket and ContainerNotFound also answer 404, so the status-only match read
a total storage misconfiguration as an absent object — every file read would fail
closed with nothing left to alert on.
* fix(uploads): require an object-level label before treating a lookup as absent
GCS answers a missing object and a missing bucket identically, so a bare 404
cannot be attributed to the object by a dispatcher that does not know what was
requested. getFileMetadata now takes the labelled check and leaves an unlabelled
404 propagating as before; the provider clients keep the lenient form, which is
what each already used.
* refactor(uploads): let getFileMetadata delegate to the provider head helpers
getFileMetadata re-implemented the S3 and Blob HEAD calls inline, so it had to
inspect provider errors itself and needed a second, stricter predicate to do it
safely. headS3Object and headBlobObject already perform exactly those calls and
already report absence as null, so delegating removes the duplication, the error
inspection, and the extra predicate at once. GCS keeps raising, as before.
Covers the real provider path in the S3 client's own suite, where mocking the
seam had been hiding whether the two layers agree.
* fix(files): log a missing file at info rather than error when serving
Each serve handler rethrows into the outer one, so a superseded key produced two
ERROR lines for what is an ordinary 404 — two thirds of this module's error
volume. Route all five catch sites through one helper that reserves error for
failures that are actually the server's fault, matching how DocCompileUserError
is already handled a few lines above.
* test(uploads): cover the Blob not-found paths the shared predicate now governs
S3 and GCS already asserted absence and non-404 rethrow; Blob asserted neither,
so the container-level exclusion went unverified on the one provider whose error
puts the reason in code rather than name.
…views (#6379)
* fix(files): render the file-viewer placeholder through the live node views
The collaborative markdown viewer painted a static generateHTML placeholder while
the Yjs doc seeded, then swapped to the live editor. generateHTML runs only schema
renderHTML — never the React node views or the ProseMirror decoration plugins — so
every node whose live appearance comes from a node view or a decoration rendered
differently in the placeholder and visibly repainted on the swap: syntax highlighting
popped in, mention-chip icons shifted their labels, mermaid blocks jumped from source
to diagram, and media embeds appeared out of nowhere.
Render the placeholder through a read-only editor that shares the live editor's
extension set instead. It uses the same node views and decoration plugins, so the
placeholder is pixel-identical to the live editor and the swap neither repaints nor
reflows — highlighting, mention icons, images, mermaid (via its existing SVG cache),
and embeds (which already reserve their aspect-ratio box) all render up front. The
placeholder editor carries no Collaboration extension, Y.Doc, or awareness, so it
structurally cannot write to the shared document, preserving the seed-only-on-server
invariant; editable={false} disables every editing affordance.
* fix(files): address review on the placeholder editor
- Give ReadOnlyPlaceholder a named props interface (repo component convention).
- Render the placeholder synchronously (immediatelyRender: true) so it paints
instantly like the static HTML it replaced instead of blanking for a frame
while the editor mounts — safe because this surface is client-only, never SSR'd.
- Hoist the editor reading-column classes into a shared EDITOR_SURFACE_CLASS so
the placeholder and live editor stay geometrically identical (drop the now
redundant placeholderContent term from the live editor's hidden class).
…t searchable (#6381)
* improvement(forking): widen the fork mapping target picker and make it searchable
* fix(forking): stop the truncated-candidates hint promising a search that cannot reach past the cap
* fix(chat): re-measure the prompt editor when its width changes
The chat input's textarea grows to its full content height under a mirror
overlay, but it only re-measured on text change. A width change after typing
(window resize, sidebar toggle, resource panel opening) left the textarea at a
stale inline height while the overlay rewrapped taller. The spilled lines still
painted and scrolled but had no textarea beneath them, so clicks landed on the
scroller and never placed a caret.
Re-measure on width change only — the measure writes the textarea's height, so
reacting to height would feed itself.
* fix(chat): measure the observer's first delivery like any other
The width can change between the mount-time measure and observe(), so
treating the first notification as confirmation of the mount width dropped
that change and left the stale height in place.
* chore(chat): trim duplicated comments on the prompt editor autosize
The failure mode was documented in four places. Keeps one canonical
explanation next to the guard and leaves only the per-test whys the test
names do not already carry.
@waleedlatif1
waleedlatif1 requested a review from a team as a code ownerAugust 7, 2026 18:40
@vercel

vercelBot commented Aug 7, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
docsSkippedSkippedAug 7, 2026 6:41pm

Request Review

@cursor

cursorBot commented Aug 7, 2026

Copy link
Copy Markdown

PR Summary

Medium Risk
Upload and file-serve changes affect how missing objects and 404s are logged and resolved across S3/Azure/GCS; behavior is well-tested but touches production file paths. Remaining changes are mostly UI and dependency bumps.

Overview
This release tightens observability and storage behavior around missing files, plus several UI fixes in chat, tables, files, and fork mapping.

Files & uploads: The file serve route logs routine FileNotFoundError (e.g. superseded workspace keys) at info via logServeFailure, while real failures still use error. Cloud metadata/head paths now treat a missing object as absent (null / empty metadata) through shared isObjectNotFoundError, without conflating missing bucket/container 404s with missing objects—covered by new provider and storage-client tests.

Editors: Collaborative file viewing swaps static HTML for a read-only TipTap placeholder that shares extensions and layout with the live editor. The chat prompt editorre-autosizes when the scroller width changes (ResizeObserver), with jsdom tests.

UI: Table column headers use HeaderLabel (ellipsis + tooltip only when clipped). Sidebar chat rows prioritize active/unread dots over pin icons; collapsed chat flyout hides unread when you're already on that chat. Fork mapping target picker is wider (320px), searchable, with clearer truncation messaging.

Other: New library MDX best AI agent builder 2026; mermaid 11.16.1 and js-yaml 4.3.1 (Dependabot/security); bunfig age-gate excludes updated for those bumps.

Reviewed by Cursor Bugbot for commit d2964af. Configure here.

@greptile-apps

Copy link
Copy Markdown
Contributor

Greptile Summary

This release combines file-storage and file-viewer fixes with prompt-editor resizing, table-header tooltips, sidebar pin visibility, searchable fork mappings, dependency updates, and new library content.

  • Treats missing S3 and Azure objects as absent metadata while preserving genuine storage failures.
  • Renders collaborative-file placeholders through the same TipTap node views as the live editor.
  • Re-measures prompt textareas after width changes and adds focused regression coverage.
  • Improves table headers, chat sidebar status indicators, and fork target selection.
  • Updates Mermaid and js-yaml and adds a comparison article with its cover asset.

Confidence Score: 5/5

The PR appears safe to merge, with no concrete changed-code failure identified.

The storage changes retain fail-closed authorization and propagate genuine provider failures, while the UI changes preserve existing state and lifecycle boundaries with targeted regression coverage.

Important Files Changed

FilenameOverview
apps/sim/lib/uploads/core/errors.tsIntroduces shared object-not-found classification while preserving explicit bucket and container failures.
apps/sim/lib/uploads/core/storage-client.tsRoutes metadata lookups through provider HEAD helpers and safely maps absent objects to empty metadata.
apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/rich-markdown-editor/rich-markdown-editor.tsxReplaces static placeholder HTML with a temporary read-only TipTap view using the live editor’s node views.
apps/sim/app/workspace/[workspaceId]/home/components/user-input/components/prompt-editor/prompt-editor.tsxObserves editor width and re-runs textarea autosizing without reacting recursively to height changes.
apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/table-grid/headers/header-label.tsxAdds a reusable truncated-header label that displays a tooltip only when text is clipped.
apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsxKeeps a current chat’s pin visible whenever no active or unread status dot takes precedence.
apps/sim/ee/workspace-forking/components/fork-sync/fork-sync-view.tsxWidens target selectors and enables searching within the available mapping candidates.
apps/sim/package.jsonUpdates js-yaml and Mermaid to patched versions with corresponding lockfile changes.

Reviews (1): Last reviewed commit: "fix(chat): re-measure the prompt editor ..." | Re-trigger Greptile

@waleedlatif1
waleedlatif1 merged commit 16e0a2b into mainAug 7, 2026
52 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@waleedlatif1@icecrasher321@TheodoreSpeaks