Skip to content

v0.6.6: landing improvements, styling consistency, mothership table renaming#3692

Merged
waleedlatif1 merged 5 commits intomainfrom
staging
Mar 20, 2026
Merged

v0.6.6: landing improvements, styling consistency, mothership table renaming#3692
waleedlatif1 merged 5 commits intomainfrom
staging

Conversation

@waleedlatif1
Copy link
Collaborator

waleedlatif1 and others added 5 commits March 19, 2026 20:22
* fix(landing): update broken links, change colors

* update integration pages

* update icons

* link to tag

* fix(landing): resolve build errors and address PR review comments

- Extract useEffect redirect into ExternalRedirect client component to fix
  fs/promises bundling error in privacy/terms server pages
- Fix InfisicalIcon fill='black' → fill='currentColor' for theme compatibility
- Add target="_blank" + rel="noopener noreferrer" to enterprise Typeform link
- Install @types/micromatch to fix missing type declarations build error

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(icons): fix InfisicalIcon fill='black' → fill='currentColor' in docs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* remove hardcoded ff

* fix(generate-docs): fix tool description extraction for two-step and name-mismatch patterns

Replace the fragile first-id/first-description heuristic with a per-id
window search: for each id: 'tool_id' match, scan the next 600 chars
(stopping before any params: block) for description: and name: fields.
This correctly handles the two-step pattern used by Intercom and others
where the ToolConfig export comes after a separate base object whose
params: would have cut off the old approach.

Add an exact-name fallback that checks tools.access for a tool whose
name matches the operation label — handles cases where block op IDs are
short aliases (e.g. Slack 'send') while the tool ID is more descriptive
('slack_message') but the tool name 'Slack Message' still differs.

Remove the word-overlap scoring fallback which was producing incorrect
descriptions (Intercom all saying 'Intercom API access token', Reddit
Save/Unsave inverted, etc.).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…d consistent design (#3688)

* improvement(toast): match notification styling with countdown ring and consistent design

* fix(toast): add success variant indicator dot
* fix(preview): show actual nested workflow name in log snapshots

* fix(preview): ensure metadata.name in non-deployed child workflow path

* style(preview): fix line formatting
* chore(templates): disable templates page and related UI

* chore(templates): remove unused imports from disabled template code

* fix(config): restore noNestedComponentDefinitions rule in biome config

* chore(templates): comment out remaining dead template code

Comment out handleTemplateFormSubmit, handleTemplateDelete,
TemplateStatusBadge component, and TemplateProfile dynamic import
that were left over after disabling the templates feature.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore(templates): clean up dead code from review feedback

- Remove unused usePathname/pathnameRef in use-workspace-management.ts
- Comment out stale 'template' from TabView union type
- Remove unused params from TemplateLayoutProps interface

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat(copilot): add rename operation to user_table tool

* fix(copilot): use newName instead of name for table rename operation
@vercel
Copy link

vercel bot commented Mar 20, 2026

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

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
docs Skipped Skipped Mar 20, 2026 10:23pm

Request Review

@cursor
Copy link

cursor bot commented Mar 20, 2026

PR Summary

Medium Risk
Medium risk due to disabling multiple templates routes/UI and introducing a new public API endpoint that sends email and enforces rate limiting; mistakes could affect navigation/SEO and public-request handling.

Overview
Improves landing and marketing UX by updating enterprise/pricing CTAs to an external demo form, hiding Templates links/URLs, and centralizing navbar blog post selection via cached getNavBlogPosts (plumbed through multiple layouts, including not-found).

Enhances integrations discovery pages: adds Azure AD and Infisical entries (plus icon mapping and icon viewBox tweaks), revises related-integration scoring and integration-page content/CTAs, and replaces the GitHub issue link with an in-app “Request an integration” modal backed by a new POST /api/help/integration-request email endpoint (with IP-based rate limiting).

Disables public and workspace templates pages/features (routes now notFound(), template deploy tab/UI removed, navigation/commands/storage redirects stripped) and updates misc UX details (toast redesign with countdown ring, nested workflow preview names via propagated workflow metadata, workspace switch always routes to /home, plus docs generator operation-description enrichment and minor doc formatting fixes).

Written by Cursor Bugbot for commit 8d84c30. Configure here.

Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

@greptile-apps
Copy link
Contributor

greptile-apps bot commented Mar 20, 2026

Greptile Summary

This PR bundles five focused changes across the Sim app: landing page link/colour fixes, a redesigned toast notification component, a fix for showing the correct nested workflow name in log snapshots, a temporary disable of the templates feature, and a new rename operation for the copilot user_table tool. The changes are well-scoped and the core logic is sound.

Key changes:

  • Landing improvements: Broken /contact links replaced with the Typeform URL, Book a demo CTA updated in enterprise and pricing components, and blog post selection extracted into a React.cache()-wrapped getNavBlogPosts helper.
  • Toast redesign: Removes variant-specific colour classes in favour of a unified design using CSS variables, drops the description field, and adds a CountdownRing SVG countdown animation.
  • Nested workflow name fix: workflow-handler.ts now populates workflowState.metadata.name for both live and deployed execution paths; preview.tsx reads from it with a graceful fallback chain.
  • Templates disabled: Both the public /templates and workspace-scoped templates pages now return notFound(). Related navigation items, commands, and sidebar entries are commented out pending re-enablement. Dead code is retained as comments rather than deleted, which adds noise.
  • Copilot table rename: A new rename operation is added to userTableServerTool with proper ownership verification and use of renameTable from the table service. A new checkRateLimitDirect method on RateLimiter supports the new integration-request API route.
  • Integration request modal: Replaces a GitHub Issues link with an in-app modal that posts to a new rate-limited /api/help/integration-request endpoint.

Confidence Score: 4/5

  • Safe to merge — no critical bugs found; one logic concern around integration icon version resolution and a minor stale-closure risk in the modal.
  • The PR is well-structured across five distinct sub-features. The copilot rename implementation is correct, the rate-limiting and email route follow established patterns, and the preview name fix is straightforward. The main concerns are: (1) the integration template card icon resolution only falls back to _v2 and could silently mis-label newer versioned blocks, and (2) a bare setTimeout in the modal success handler has no cleanup path. Both are low-severity. The large volume of commented-out template code is technical debt but doesn't affect runtime behaviour.
  • apps/sim/app/(landing)/integrations/[slug]/page.tsx (version suffix fallback), apps/sim/app/(landing)/integrations/components/request-integration-modal.tsx (setTimeout cleanup)

Important Files Changed

Filename Overview
apps/sim/lib/copilot/tools/server/table/user-table.ts Adds rename operation for user tables. Logic is correct (ownership check, renameTable call, proper error returns), but newName is accessed via an unnecessary double-cast when it's already typed in the Zod schema.
apps/sim/executor/handlers/workflow/workflow-handler.ts Propagates workflow name into workflowState.metadata for both live and deployed execution paths, enabling the preview component to surface the correct nested workflow name.
apps/sim/components/emcn/components/toast/toast.tsx Redesigns the toast notification component with a consistent styling approach: drops variant-specific colour classes, adds a CountdownRing SVG animation, removes the description field, and tightens dimensions to 240px.
apps/sim/app/(landing)/integrations/components/request-integration-modal.tsx New client-side modal for integration requests. Form validation, error handling, and rate-limited API route are all present. Minor: bare setTimeout on success could fire after unmount.
apps/sim/app/api/help/integration-request/route.ts New POST route with input validation (Zod), IP-based rate limiting via checkRateLimitDirect, email dispatch, and structured error handling. Implementation is clean and well-structured.
apps/sim/lib/core/rate-limiter/rate-limiter.ts Adds checkRateLimitDirect for ad-hoc per-key rate limiting without a named route config. Fail-open on storage error is consistent with the existing pattern in the class.
apps/sim/app/templates/page.tsx Templates page disabled via notFound(). The original implementation is retained as commented-out code for future re-enablement.
apps/sim/app/(landing)/integrations/[slug]/page.tsx Significant refactor of the integration detail page: removes popular-workflows section, improves related-integrations scoring, updates FAQ copy, and redesigns the sidebar CTA. Version suffix fallback for template icon resolution only covers _v2.

Sequence Diagram

sequenceDiagram
    participant U as User (Browser)
    participant M as RequestIntegrationModal
    participant R as /api/help/integration-request
    participant RL as RateLimiter
    participant E as Email Service

    U->>M: Click "Request an integration"
    M->>M: Open modal
    U->>M: Fill form & submit
    M->>R: POST {integrationName, email, useCase}
    R->>RL: checkRateLimitDirect(ip-key, config)
    alt Rate limit exceeded
        RL-->>R: {allowed: false}
        R-->>M: 429 Too Many Requests
        M->>M: setStatus('error')
    else Allowed
        RL-->>R: {allowed: true}
        R->>R: Validate with Zod schema
        R->>E: sendEmail(to: help@domain)
        E-->>R: {success: true}
        R-->>M: 200 {success: true}
        M->>M: setStatus('success')
        M->>M: setTimeout → setOpen(false) after 1500ms
    end
Loading

Last reviewed commit: "feat(copilot): add r..."

Comment on lines +887 to +888
if (!newName) {
return { success: false, message: 'newName is required for renaming a table' }
Copy link
Contributor

Choose a reason for hiding this comment

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

P2 Unnecessary type cast for newName

newName is already declared as z.string().optional() in UserTableArgsSchema.args (schemas.ts line 159), so args is already typed to include it. The double-cast through Record<string, unknown> is redundant and drops type safety for no gain.

Suggested change
if (!newName) {
return { success: false, message: 'newName is required for renaming a table' }
const newName = args.newName

Comment on lines +501 to +517
? bt
: byType.get(`${bt}_v2`)
? `${bt}_v2`
: bt
const int = byType.get(resolvedBt)
const intName = int?.name ?? bt
return (
<IntegrationIcon
key={bt}
bgColor={int?.bgColor ?? '#6B7280'}
name={intName}
Icon={blockTypeToIconMap[bt]}
className='h-6 w-6 rounded-[5px]'
iconClassName='h-3.5 w-3.5'
fallbackClassName='text-[9px]'
title={intName}
aria-label={intName}
/>
<span key={bt} className='inline-flex items-center gap-1.5'>
{idx > 0 && (
<span className='text-[#555]' aria-hidden='true'>
</span>
)}
<span className='inline-flex items-center gap-1 rounded-[3px] bg-[#2A2A2A] px-1.5 py-0.5 font-[500] text-[#ECECEC]'>
<IntegrationIcon
bgColor={int?.bgColor ?? '#6B7280'}
name={intName}
Copy link
Contributor

Choose a reason for hiding this comment

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

P1 Version suffix fallback only covers _v2

The integration type resolution falls back to ${bt}_v2 but stops there. If any template uses a block type with a _v3 (or later) suffix that exists in the icon map but whose unversioned key is absent, both the bt and ${bt}_v2 lookups will return undefined, silently rendering a gray placeholder icon and the raw block-type string as the label instead of the integration's display name.

A more robust pattern would scan all keys for a common prefix, or derive versioned keys from the allIntegrations list:

// build a prefix → canonical type map once at module level
const byTypePrefix = new Map(
  allIntegrations.map((i) => [i.type.replace(/_v\d+$/, ''), i.type])
)
// then resolve:
const resolvedBt = byType.get(bt) ? bt : (byTypePrefix.get(bt) ?? bt)

Comment on lines +132 to +133
onChange={(e) => setEmail(e.target.value)}
autoComplete='email'
Copy link
Contributor

Choose a reason for hiding this comment

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

P2 setTimeout without cleanup can update unmounted component state

If the user closes or navigates away within the 1 500 ms success window, the setTimeout callback will still fire and call setOpen(false) on the already-unmounted component tree. React 18 won't throw, but it is still a benign stale closure. Return a cleanup function from useEffect (or switch to a ref-guarded approach) instead of a bare setTimeout.

Suggested change
onChange={(e) => setEmail(e.target.value)}
autoComplete='email'
setStatus('success')
const t = setTimeout(() => setOpen(false), 1500)
return () => clearTimeout(t)

(This requires lifting the setTimeout into a useEffect that watches status === 'success'.)

@waleedlatif1 waleedlatif1 merged commit 1731a4d into main Mar 20, 2026
27 checks passed
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