Visitar URL original
v0.9.38: favicon service, docs improvements by waleedlatif1 · Pull Request #9500 · simstudioai/sim · GitHub
Skip to content

v0.9.38: favicon service, docs improvements - #9500

Merged
waleedlatif1 merged 6 commits into
mainfrom
staging
Oct 31, 2026
Merged

waleedlatif1 merged 6 commits into
mainfrom
staging

Conversation

@waleedlatif1

@waleedlatif1 waleedlatif1 commented Oct 31, 2026 •

Copy link
Copy Markdown
Collaborator

…ain fallback (#9494)

* feat(favicons): resolve every site icon through one server route with parent-domain fallback

Icons were requested straight from Google in the browser, which shows Google's
placeholder globe for any host it can't see (a 404 with an image body that an
<img> treats as success), so private tenants and internal hosts rendered a
generic placeholder. GET /api/favicon asks Google and DuckDuckGo server-side,
where the 404 is visible, walks up to the parent domain so a tenant shows its
platform's icon, never sends internal hosts or the destination itself anything,
and caches results in Redis. Every surface now uses the shared <Favicon> or
faviconSrc, and binary internal routes accept a user rate limit.

* fix(favicons): 204 for no icon, only 404 is a provider miss, reject empty labels and non-DNS hostnames

A miss is an ordinary answer, so it returns 204 (which an img still reports as
failed) instead of an error status; binary internal routes may now declare
several success statuses and present a no-content response, sharing the JSON
builder's status validation. Providers are asked one at a time so a second only
learns a host the first had no icon for, a non-200 body is never read, and
anything but 404/410 counts as unavailable rather than a cached miss.

* fix(favicons): keep the presenter's 204 literal and read only a 200 body before one classification

* fix(favicons): annotate the presenter so each branch is checked against its own descriptor
- Imported documents took their token total from the embedding tokenizer's
  per-chunk counts, which estimate differently from the chunker that produced
  the source total, so totals read about 15% high. The prepared index now
  carries the manifest's total, matching the source document.
- Bound manifest token and character counts to the integer columns they are
  written to, so an out-of-range bundle is refused before any work instead of
  failing each document at its final write.
- Log "indexing with bundled vectors" instead of "generating embeddings" when
  a document's vectors come from the bundle.
…tifacts (#9496)

* improvement(docs): inspect workflows on canvas and retire migration artifacts

* improvement(docs): simplify expanded workflows to an interactive canvas

* fix(docs): remove unused preview block export

* chore(docs): drop retired export from unused baseline
…retry timeout-derived icons, no miss flash (#9497)

* improvement(favicons): resolve platform tenants no provider can see, and retry icons chosen after a timeout

A tenant on a platform whose domain has no icon at either provider, even at the
parent (AWS sign-in portals, Coupa, GitLab Dedicated, Databricks apps, Salesforce,
Okta preview, UKG, Jama), and a self-hosted gitlab./jira./testrail. host, now end
their candidate walk at the platform's own site, after their own host and parents
so a tenant's custom icon still wins. A parent's icon reached only because a more
specific lookup timed out is cached for a day instead of thirty, since the host's
own icon may exist.

* improvement(favicons): correct the platform table from vendor docs and keep misses from flashing

GitLab Dedicated instances live on gitlab-dedicated.com (and .systems pre-production);
.site is their Pages domain, kept to match gitlab.io. Adds coupacloud.com, databricks.us,
databricksapps.us, and testrail.io, each a suffix both providers miss at every level;
drops entries the parent walk already resolves and the self-hosted sentry label, whose
name collides with other products. A host with no icon is remembered client-side for the
route's miss lifetime, so a remounted icon shows its fallback without an empty frame, and
the cache key moves to v3 so stale misses for newly mapped platforms clear on deploy.

* fix(favicons): keep provisional icons provisional through reuse, walk past cached parent misses, skip hosting suffixes

A cached hit now records whether it was definite or provisional, so a host reusing a
parent's timeout-derived icon inherits the one-day lifetime instead of a month. A cached
miss at a parent skips only the candidates that parent's own walk covered, so a product
fallback derived from the original host is still tried. The self-hosted product label
no longer applies on a Public Suffix List private (hosting) suffix. Adds the Databricks
military suffix the repo already recognizes, and the client remembers a failed icon only
as long as the route retries an outage.

* chore(favicons): import resolver test mocks from their own files
@waleedlatif1
waleedlatif1 requested a review from a team as a code owner October 31, 2026 05:15
@vercel

vercel Bot commented Oct 31, 2026 •

Copy link
Copy Markdown

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

Project Deployment Actions Updated
docs Ready Ready Preview Oct 31, 2026 6:41am UTC

Request Review

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 128 files

Reply with feedback, questions, or to request a fix.

Turn on auto-fix | Re-trigger cubic

Comment thread apps/sim/components/favicon.tsx Resolved
@greptile-apps

greptile-apps Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 4/5

[Medium impact] The changes affect icon loading across Sim, knowledge bundle imports, and the docs authoring workflow.

The required favicon import structure must be fixed before merging; the stale docs benchmark is a separate non-blocking cleanup.

Findings

  1. P2 Benchmark skips the removed inspector ▶
  2. P2 Required barrel exports are missing ▶

Summary

This PR adds a shared favicon service, preserves document token totals during bundle imports, and simplifies docs workflow previews.

  • Site icons come from Sim’s shared server route.
  • Knowledge bundle imports keep each document’s token total.
  • Workflow previews open an interactive canvas in a shared lightbox.
  • Docs checks use a compatibility report and a frozen content baseline.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[Site icon] --> B[Session-protected favicon route]
  B --> C[Validate hostname]
  C --> D{Cached result?}
  D -->|Yes| H[Return icon or empty response]
  D -->|No| E[Try public icon providers]
  E --> F{Icon found?}
  F -->|No| G[Try parent domains and product fallback]
  F -->|Yes| I[Cache result]
  G --> I
  I --> H
Loading

Reviews (1) · Last reviewed commit: "improvement(favicons): resolve platform ..." · Reviewed by Greptile

Comment thread apps/sim/lib/favicon/resolve.server.ts Resolved
)

A failed load set per-instance state that pinned the icon to its fallback until it
unmounted, so the five-minute miss window never reached an icon already on screen. The
module-level miss cache is now the only failure record; a reducer only re-renders on
error, so the next render after the entry expires asks again (a confirmed miss is still
answered from the HTTP cache).
…#9502)

* test(docs): exercise canvas interactions and container expansion

* fix(docs): restore inline container expansion

* test(search): verify navigation after streamed denial hydration
@waleedlatif1
waleedlatif1 merged commit 86e45c9 into main Oct 31, 2026
146 checks passed

This branch was successfully deployed

1 active deployment
Preview — b3f92986 Deployed Oct 31, 2026 by vercel[bot]
Sign up for free to 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.

1 participant