Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
3109104
improvement(platform): workspace UI/UX overhaul + integrations catalog
emir-karabeg May 28, 2026
df5ad7d
refactor(platform): remove forms, templates, and creators features
emir-karabeg May 29, 2026
6a1af16
Merge origin/staging into improvement/platform
emir-karabeg May 29, 2026
85265a6
test(workflows): update archiveWorkflow update count after forms removal
emir-karabeg May 30, 2026
6a7e734
upgrade
emir-karabeg Jun 1, 2026
6c05948
improvement(knowledge): polish tag filter dropdowns (#4816)
andresdjasso Jun 1, 2026
c23cb7e
merge(staging): merge origin/staging and add LinqBlockMeta
waleedlatif1 Jun 1, 2026
74a0be9
feat(blocks): add BlockMeta to Quiver and Linq; fix invalid block con…
waleedlatif1 Jun 1, 2026
f51b476
fix(integrations): fix category dropdown by defining missing LANDING_…
waleedlatif1 Jun 1, 2026
645a1d6
fix(sidebar): restore resize handle on all pages
waleedlatif1 Jun 1, 2026
23759bc
fix(sidebar): match staging onKeyDown and tabIndex on resize handle
waleedlatif1 Jun 1, 2026
a320dc7
feat(integrations): show connected credentials on integration detail …
waleedlatif1 Jun 1, 2026
a1b6124
fix(integrations): rename Add in chat to Add to Sim
waleedlatif1 Jun 1, 2026
0447e4a
fix(skills): rename Add button to Add to Sim
waleedlatif1 Jun 1, 2026
cca5054
fix(platform): restore M1/M2/M3 regressions and LazyMotion on landing…
waleedlatif1 Jun 1, 2026
86da193
fix(integrations): revert connected list to credential detail; remove…
waleedlatif1 Jun 1, 2026
90b92bb
feat(sidebar): restore workspace switcher search with updated styling
waleedlatif1 Jun 1, 2026
133959d
fix(sidebar): clean up workspace search — layout, memo, and effect guard
waleedlatif1 Jun 1, 2026
3d6aeb5
fix(sidebar): align workspace rename input selection style with workf…
waleedlatif1 Jun 1, 2026
639294f
perf(sidebar): eliminate React re-renders during sidebar drag resize
waleedlatif1 Jun 1, 2026
1bf4d52
perf(sidebar): add requestAnimationFrame throttle to resize mousemove…
waleedlatif1 Jun 1, 2026
ab6d1cc
fix(sidebar): fix drag-right lag caused by WorkspaceChrome overflow-h…
waleedlatif1 Jun 1, 2026
ea149b2
fix(icons): redesign Download icon to match Upload style; fix Upload/…
waleedlatif1 Jun 1, 2026
977d5de
fix(icons): replace Upload with Download on all remaining export/down…
waleedlatif1 Jun 1, 2026
e641dbb
fix(icons): fix remaining Upload→Download on download actions in file…
waleedlatif1 Jun 1, 2026
04e271a
updated block skills, settings pages, modals, buttons -> chips, block…
waleedlatif1 Jun 2, 2026
590250b
updated skill modal
waleedlatif1 Jun 2, 2026
9c4a5e1
Merge branch 'staging' into improvement/platform
icecrasher321 Jun 2, 2026
621d424
improvement(resource-header): refine breadcrumb truncation ux
andresdjasso Jun 2, 2026
8d0e9dc
improvement(resource): add floating overflow text tooltips
andresdjasso Jun 2, 2026
92da21e
wire up credits counter
icecrasher321 Jun 2, 2026
8c165bb
improvement(resource-header): mute path dropdown title
andresdjasso Jun 2, 2026
8da7e34
refactor(resource-header): share floating-tooltip engine, prune dead …
waleedlatif1 Jun 2, 2026
74705a7
refactor(emcn,resource-header): address PR #4844 review feedback
waleedlatif1 Jun 2, 2026
c190d2c
Merge branch 'improvement/platform' of github.com:simstudioai/sim int…
icecrasher321 Jun 2, 2026
f94052c
upgrade table and styling upgrade
emir-karabeg Jun 2, 2026
8a8d77f
Merge branch 'improvement/platform' of github.com:simstudioai/sim int…
icecrasher321 Jun 2, 2026
72fd5e0
Merge branch 'staging' into improvement/platform
icecrasher321 Jun 2, 2026
2555137
fix schema to include integration
icecrasher321 Jun 2, 2026
350c5be
fix(files): align delete icon with tables view (Trash → Trash2)
waleedlatif1 Jun 2, 2026
21ecc58
fix(mothership): preserve blockType for integration contexts in sent …
waleedlatif1 Jun 2, 2026
13f2cc7
fix(mothership): allow 'integration' resource type in chat resources API
waleedlatif1 Jun 2, 2026
79907b1
fix(ui): Add "File" title next to file resource header
TheodoreSpeaks Jun 3, 2026
a0587a7
fix(ui): fix resource header columns being bolded
TheodoreSpeaks Jun 3, 2026
0f9ea0a
fix(resource): keep the floating tooltip from jumping on click
andresdjasso Jun 3, 2026
59197ad
perf(sidebar): eliminate unnecessary re-renders in workspace switcher…
waleedlatif1 Jun 3, 2026
ad6ced8
feat(search): context-aware cmd-k results on the integrations page
waleedlatif1 Jun 3, 2026
9c96fff
refactor(emcn): make the floating tooltip the one canonical Tooltip
andresdjasso Jun 3, 2026
7a30999
style(emcn): put tooltip text on the design scale (text-caption)
andresdjasso Jun 3, 2026
2df6d39
feat(sidebar): add empty task state and inline task creation
waleedlatif1 Jun 3, 2026
b448f77
invite, billing, home
emir-karabeg Jun 3, 2026
7b32a85
improvement(seats): auto purchase seats on invitations into workspace…
icecrasher321 Jun 3, 2026
eaefa56
feat(knowledge): align connector UI with integrations page styling
waleedlatif1 Jun 3, 2026
b06f757
fix(icons): trim Folder SVG viewBox to remove right-side whitespace
waleedlatif1 Jun 3, 2026
3ad3710
fix(user-input): restore draft text synchronously to preserve context…
waleedlatif1 Jun 3, 2026
9c71774
fix(queue): render context chips in queued messages
waleedlatif1 Jun 3, 2026
c2c2738
fix(mothership): remove integrations from add-resource dropdown
waleedlatif1 Jun 3, 2026
f24ea25
fix(mothership): comment out integrations from add-resource dropdown
waleedlatif1 Jun 3, 2026
598692b
chore(db): drop form, templates, template_creators, template_stars ta…
waleedlatif1 Jun 3, 2026
1a509c0
chore(db): add migration metadata for 0224 drop tables
waleedlatif1 Jun 3, 2026
b102d4f
block icons, sidebar, toolbar
emir-karabeg Jun 3, 2026
8f6a048
chore: remove remaining dead code for template-profile feature
waleedlatif1 Jun 3, 2026
e495979
fix(multi-select): preserve anchor on range selection for tasks and f…
waleedlatif1 Jun 3, 2026
b9cc9bc
feat(emcn): add SearchInput component and unify search bars platform-…
waleedlatif1 Jun 3, 2026
254af5c
fix(files,tables): restore new-file editor autofocus and CSV import e…
waleedlatif1 Jun 3, 2026
107a98e
feat(home): score suggested actions by workspace signals
waleedlatif1 Jun 3, 2026
91bfc08
billing, teammates
emir-karabeg Jun 3, 2026
314dcb0
improvement(credentials): credentials invites, secrets tab wiring up …
icecrasher321 Jun 4, 2026
c501c53
refactor(ui): migrate settings & workspace UI to chip design system
waleedlatif1 Jun 4, 2026
52739a3
fix(mothership): restore integrations to useAvailableResources for @ …
waleedlatif1 Jun 4, 2026
c3189a7
refactor(settings): chip design-system consistency pass across all tabs
waleedlatif1 Jun 4, 2026
f6c1d3c
feat(settings): unify filter dropdowns on ChipSelect (integrations st…
waleedlatif1 Jun 4, 2026
a79b3f4
fix(mentions): require explicit @ for integration mentions; decorate …
waleedlatif1 Jun 4, 2026
b3b86c8
refactor(settings): section the API keys page like secrets
waleedlatif1 Jun 4, 2026
243d2a3
fix(settings): ChipSelect renders above modals + full-width form mode
waleedlatif1 Jun 4, 2026
fe770ee
fix(emcn): ChipSelect uses the emcn flat chevron, not lucide's square…
waleedlatif1 Jun 4, 2026
e5bf7ba
fix(emcn): ChipSelect trigger hugs its content (w-fit)
waleedlatif1 Jun 4, 2026
0dffb7d
fix(emcn): ChipSelect uses a square lucide chevron
waleedlatif1 Jun 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
68 changes: 65 additions & 3 deletions .agents/skills/add-block/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -627,19 +627,78 @@ export const ServiceV2Block: BlockConfig = {
}
```

## Block Metadata (BlockMeta)

Every integration block **must** export a `{Service}BlockMeta` object at the bottom of the block file. This metadata drives the integration catalog, tag filters, and workflow template suggestions shown to users.

### Structure

```typescript
import type { BlockConfig, BlockMeta } from '@/blocks/types'

// ... block definition above ...

export const {Service}BlockMeta = {
tags: ['messaging', 'automation'], // Same tags as the block's tags field
templates: [ // Optional but strongly encouraged
{
icon: {Service}Icon,
title: '{Service} use-case title',
prompt: 'Build a workflow that ...',
modules: ['agent', 'workflows'], // Modules the template uses
category: 'productivity', // Template category
tags: ['automation'], // Template-level tags
alsoIntegrations: ['slack'], // Other blocks referenced in the prompt (optional)
},
],
} as const satisfies BlockMeta
```

### Rules

- **Import `BlockMeta`** from `@/blocks/types` alongside `BlockConfig`
- **`tags`** must match the `tags` array on the block config exactly
- **Templates are optional** but should be added for any integration that has a recognizable use case — aim for 2–4 templates per block
- **Template `prompt`** should start with "Build a workflow that..." or "Create a workflow that..." and be concrete enough to generate a real workflow in Mothership
- **Template `modules`** lists the Sim modules the template relies on: `'knowledge-base' | 'tables' | 'files' | 'workflows' | 'scheduled' | 'agent'`
- **Template `category`** is one of: `'popular' | 'sales' | 'support' | 'engineering' | 'marketing' | 'productivity' | 'operations'`
- **`alsoIntegrations`** names other block types (e.g. `'slack'`, `'linear'`) referenced in the template prompt — helps the catalog surface this template when those blocks are selected
- Place the export **after** the main `{Service}Block` export, at the very bottom of the file

### Register in the blocksMeta object

After adding `{Service}BlockMeta` to the block file, register it in `apps/sim/blocks/registry.ts`:

```typescript
// Add import (alongside the block import, alphabetically)
import { ServiceBlock, ServiceBlockMeta } from '@/blocks/blocks/service'

// Add to blocksMeta object (alphabetically)
export const blocksMeta = {
// ... existing entries ...
service: ServiceBlockMeta,
}
```

## Registering Blocks

After creating the block, remind the user to:
1. Import in `apps/sim/blocks/registry.ts`
1. Import `{Service}Block` and `{Service}BlockMeta` in `apps/sim/blocks/registry.ts`
2. Add to the `registry` object (alphabetically):
3. Add to the `blocksMeta` object (alphabetically):

```typescript
import { ServiceBlock } from '@/blocks/blocks/service'
import { ServiceBlock, ServiceBlockMeta } from '@/blocks/blocks/service'

export const registry: Record<string, BlockConfig> = {
// ... existing blocks ...
service: ServiceBlock,
}

export const blocksMeta = {
// ... existing entries ...
service: ServiceBlockMeta,
}
```

## Complete Example
Expand Down Expand Up @@ -827,7 +886,10 @@ All tool IDs referenced in `tools.access` and returned by `tools.config.tool` MU
- [ ] Tools.access lists all tool IDs (snake_case)
- [ ] Tools.config.tool returns correct tool ID (snake_case)
- [ ] Outputs match tool outputs
- [ ] Block registered in registry.ts
- [ ] Block registered in `registry.ts` blocks object (alphabetically)
- [ ] `{Service}BlockMeta` exported at bottom of block file with `tags` and `templates`
- [ ] `BlockMeta` imported from `@/blocks/types` alongside `BlockConfig`
- [ ] Block meta registered in `registry.ts` blocksMeta object (alphabetically)
- [ ] If icon missing: asked user to provide SVG
- [ ] If triggers exist: `triggers` config set, trigger subBlocks spread
- [ ] Optional/rarely-used fields set to `mode: 'advanced'`
Expand Down
45 changes: 40 additions & 5 deletions .agents/skills/add-integration/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ export const {service}{Action}Tool: ToolConfig<Params, Response> = {
### Block Structure
```typescript
import { {Service}Icon } from '@/components/icons'
import type { BlockConfig } from '@/blocks/types'
import type { BlockConfig, BlockMeta } from '@/blocks/types'
import { AuthMode } from '@/blocks/types'
import { getScopesForService } from '@/lib/oauth/utils'

Expand Down Expand Up @@ -177,8 +177,32 @@ export const {Service}Block: BlockConfig = {

outputs: { /* ... */ },
}

export const {Service}BlockMeta = {
tags: ['tag1', 'tag2'], // IntegrationTag values matching the service's capabilities
templates: [
{
icon: {Service}Icon,
title: '{Service} use-case title',
prompt: 'Build a workflow that ...',
modules: ['agent', 'workflows'],
category: 'productivity',
tags: ['automation'],
alsoIntegrations: ['slack'], // Optional: other blocks referenced in the prompt
},
],
} as const satisfies BlockMeta
```

### BlockMeta rules

- **Tags**: Use `IntegrationTag` values from `@/blocks/types`. Do NOT add a `tags` field to the `BlockConfig` object — tags belong only in `BlockMeta`.
- **`integrationType`**: Must be a valid `IntegrationType` enum value (AI, Analytics, Commerce, Communication, Databases, DevOps, Documents, Email, HR, Marketing, Observability, Productivity, Sales, Search, Security, Support). Never invent a value that doesn't exist in the enum.
- **Templates**: Aim for 2–4 templates per integration. Prompts should be concrete enough to generate a real workflow in Mothership. Start with "Build a workflow that..." or "Create a workflow that...".
- **`alsoIntegrations`**: List other block type IDs referenced in the template prompt (e.g. `'slack'`, `'linear'`).
- Place `{Service}BlockMeta` at the very bottom of the file, after the main block export.
- Register it in both the import and the `blocksMeta` object in `registry.ts`.

### Key SubBlock Patterns

**Condition-based visibility:**
Expand Down Expand Up @@ -359,14 +383,20 @@ export const tools: Record<string, ToolConfig> = {
### Block Registry (`apps/sim/blocks/registry.ts`)

```typescript
// Add import (alphabetically)
import { {Service}Block } from '@/blocks/blocks/{service}'
// Add import (alphabetically) — include BlockMeta
import { {Service}Block, {Service}BlockMeta } from '@/blocks/blocks/{service}'

// Add to registry (alphabetically)
// Add to blocks registry (alphabetically)
export const registry: Record<string, BlockConfig> = {
// ... existing blocks ...
{service}: {Service}Block,
}

// Add to blocksMeta registry (alphabetically)
export const blocksMeta = {
// ... existing entries ...
{service}: {Service}BlockMeta,
}
```

### Trigger Registry (`apps/sim/triggers/registry.ts`) - If triggers exist
Expand Down Expand Up @@ -433,7 +463,12 @@ If creating V2 versions (API-aligned outputs):
- [ ] Configured tools.access with all tool IDs
- [ ] Configured tools.config.tool selector
- [ ] Defined outputs matching tool outputs
- [ ] Registered block in `blocks/registry.ts`
- [ ] `integrationType` uses a valid `IntegrationType` enum value (no invented values)
- [ ] No `tags` field on the `BlockConfig` object (tags live only in `BlockMeta`)
- [ ] `{Service}BlockMeta` exported at bottom of file with `tags` and `templates`
- [ ] `BlockMeta` type imported from `@/blocks/types` alongside `BlockConfig`
- [ ] Block registered in `blocks/registry.ts` blocks object (alphabetically)
- [ ] Block meta registered in `blocks/registry.ts` blocksMeta object (alphabetically)
- [ ] If triggers: set `triggers.enabled` and `triggers.available`
- [ ] If triggers: spread trigger subBlocks with `getTrigger()`

Expand Down
29 changes: 29 additions & 0 deletions .claude/commands/add-block.md
Original file line number Diff line number Diff line change
Expand Up @@ -798,6 +798,33 @@ Use `wandConfig` for fields that are hard to fill out manually, such as timestam

All tool IDs referenced in `tools.access` and returned by `tools.config.tool` MUST use `snake_case` (e.g., `x_create_tweet`, `slack_send_message`). Never use camelCase or PascalCase.

## BlockMeta (Required)

Every block file must export a `{Service}BlockMeta` alongside the block — **minimum 7 templates**. Look at existing examples in `apps/sim/blocks/blocks/` (e.g. `browser_use.ts`, `google_sheets.ts`) for the pattern.

```typescript
import type { BlockMeta } from '@/blocks/types'

export const {Service}BlockMeta = {
tags: ['tag1', 'tag2'], // IntegrationTag[]
templates: [
{
icon: {Service}Icon,
title: '{Service} <use-case>', // 2–5 words
prompt: 'Build a workflow that...', // specific use case, 1–3 sentences
modules: ['agent', 'workflows'], // 'agent' | 'workflows' | 'tables' | 'files' | 'scheduled' | 'knowledge-base'
category: 'operations', // 'operations' | 'marketing' | 'sales' | 'engineering' | 'productivity' | 'support' | 'popular'
tags: ['automation'],
alsoIntegrations: ['slack'], // optional — other block IDs referenced in the prompt
featured: true, // optional
},
// ... at least 6 more
],
} as const satisfies BlockMeta
```

Derive templates from the service's real use cases. Each prompt should name a concrete trigger, transformation, and output — not a generic description of what the service does.

## Checklist Before Finishing

- [ ] `integrationType` is set to the correct `IntegrationType` enum value
Expand All @@ -816,6 +843,7 @@ All tool IDs referenced in `tools.access` and returned by `tools.config.tool` MU
- [ ] If triggers exist: `triggers` config set, trigger subBlocks spread
- [ ] Optional/rarely-used fields set to `mode: 'advanced'`
- [ ] Timestamps and complex inputs have `wandConfig` enabled
- [ ] Exported `{Service}BlockMeta` with at least 7 templates

## Final Validation (Required)

Expand All @@ -829,3 +857,4 @@ After creating the block, you MUST validate it against every tool it references:
- Type coercions in `tools.config.params` for any params that need conversion (Number(), Boolean(), JSON.parse())
3. **Verify block outputs** cover the key fields returned by all tools
4. **Verify conditions** — each subBlock should only show for the operations that actually use it
5. **Verify `{Service}BlockMeta` is exported** with at least 7 templates, each having `icon`, `title`, `prompt`, `modules`, `category`, and `tags`
24 changes: 24 additions & 0 deletions .claude/commands/add-integration.md
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,28 @@ export const {Service}Block: BlockConfig = {
- **Inputs section:** Must list canonical param IDs (e.g., `fileId`), NOT raw subblock IDs (e.g., `fileSelector`, `manualFileId`)
- **Params function:** Must use canonical param IDs, NOT raw subblock IDs (raw IDs are deleted after canonical transformation)

### BlockMeta (Required)

Export a `{Service}BlockMeta` in the same file as the block — **minimum 7 templates**. See `add-block.md` → "BlockMeta (Required)" for valid `modules` and `category` values and the full pattern.

```typescript
export const {Service}BlockMeta = {
tags: ['tag1', 'tag2'],
templates: [
{
icon: {Service}Icon,
title: '{Service} <use-case>',
prompt: 'Build a workflow that...', // concrete trigger → transformation → output
modules: ['agent', 'workflows'],
category: 'operations',
tags: ['automation'],
alsoIntegrations: ['slack'], // when the prompt references another service
},
// ... at least 6 more
],
} as const satisfies BlockMeta
```

## Step 4: Add Icon

### File Location
Expand Down Expand Up @@ -424,6 +446,7 @@ If creating V2 versions (API-aligned outputs):
- [ ] Registered block in `blocks/registry.ts`
- [ ] If triggers: set `triggers.enabled` and `triggers.available`
- [ ] If triggers: spread trigger subBlocks with `getTrigger()`
- [ ] Exported `{Service}BlockMeta` with at least 7 templates

### OAuth Scopes (if OAuth service)
- [ ] Defined scopes in `lib/oauth/oauth.ts` under `OAUTH_PROVIDERS`
Expand Down Expand Up @@ -454,6 +477,7 @@ If creating V2 versions (API-aligned outputs):
- [ ] Verified block subBlocks cover all required tool params with correct conditions
- [ ] Verified block outputs match what the tools actually return
- [ ] Verified `tools.config.params` correctly maps and coerces all param types
- [ ] `{Service}BlockMeta` exported with at least 7 templates, each having `icon`, `title`, `prompt`, `modules`, `category`, and `tags`

## Example Command

Expand Down
7 changes: 7 additions & 0 deletions .claude/commands/validate-integration.md
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,12 @@ For **each tool** in `tools.access`:
- [ ] `authMode` is set correctly (`AuthMode.OAuth` or `AuthMode.ApiKey`)
- [ ] Block is registered in `blocks/registry.ts` alphabetically

### BlockMeta
- [ ] `{Service}BlockMeta` is exported in the same file as the block
- [ ] Has at least 7 templates, each with `icon`, `title`, `prompt`, `modules`, `category`, and `tags`
- [ ] Prompts describe concrete use cases, not generic descriptions of what the service does
- [ ] `alsoIntegrations` is set on any template whose prompt references another service

### Block Inputs
- [ ] `inputs` section lists all subBlock params that the block accepts
- [ ] Input types match the subBlock types
Expand Down Expand Up @@ -282,6 +288,7 @@ After fixing, confirm:
- [ ] Validated pagination consistency across tools and block
- [ ] Validated error handling (error checks, meaningful messages)
- [ ] Validated registry entries (tools and block, alphabetical, correct imports)
- [ ] Validated `{Service}BlockMeta` exported with at least 7 templates
- [ ] Reported all issues grouped by severity
- [ ] Fixed all critical and warning issues
- [ ] Ran `bun run lint` after fixes
Expand Down
4 changes: 2 additions & 2 deletions apps/docs/app/api/og/route.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ const OG_FOOTER_STYLE = {
width: '100%',
} satisfies CSSProperties
const OG_DOMAIN_STYLE = {
fontSize: 20,
fontSize: 24,
fontWeight: 400,
color: '#71717a',
} satisfies CSSProperties
Expand Down Expand Up @@ -84,7 +84,7 @@ async function loadGoogleFont(font: string, weights: string, text: string): Prom
*/
function SimLogoFull() {
return (
<svg height='28' viewBox='720 440 1020 320' fill='none'>
<svg height='34' viewBox='720 440 1020 320' fill='none'>
{/* Green icon - top left shape with cutout */}
<path
fillRule='evenodd'
Expand Down
Binary file modified apps/docs/app/favicon.ico
Binary file not shown.
1 change: 1 addition & 0 deletions apps/docs/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ export const metadata = {
classification: 'Developer Documentation',
manifest: '/favicon/site.webmanifest',
icons: {
icon: [{ url: '/icon.svg', type: 'image/svg+xml', sizes: 'any' }],
apple: '/favicon/apple-touch-icon.png',
},
appleWebApp: {
Expand Down
Loading
Loading