Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
cb28b11
feat(lambda): add AWS Lambda integration with 50 operations (#7216)
waleedlatif1 Aug 28, 2026
9f594c9
improvement(tools): retire direct execution (#7207)
icecrasher321 Aug 28, 2026
6818425
fix(pricing): correct free-tier credits as one-time, not monthly (#7218)
TheodoreSpeaks Aug 28, 2026
b094b4d
improvement(usage): add a period-labelled chart to the workspace dril…
icecrasher321 Aug 28, 2026
60cb6f5
feat(observability): record Redis connection state on failed slot ope…
waleedlatif1 Aug 28, 2026
eadf30a
fix(enterprise): verify invited owner on acceptance (#7221)
icecrasher321 Aug 28, 2026
03a76b8
fix(workflow): stop requiring a human subject on actorless runs (#7220)
TheodoreSpeaks Aug 28, 2026
0f3d5e5
fix(canvas): show full Agent prompt tooltips (#6961)
BillLeoutsakosvl346 Aug 28, 2026
cc5affa
feat(integrations): add Dynamics 365 CRM (#6714)
BillLeoutsakosvl346 Aug 28, 2026
2bda859
fix(logs): prevent dashboard horizontal scrolling (#7223)
waleedlatif1 Aug 28, 2026
59b3f37
improvement(ui): consolidate fade-only overflow (#7225)
waleedlatif1 Aug 28, 2026
836b87f
fix(knowledge): classify rejected BYOK embedding keys (#7226)
waleedlatif1 Aug 28, 2026
34a5300
feat(secrets): reveal visible values to members (#7231)
icecrasher321 Aug 28, 2026
8a31757
fix(execution): treat an undetermined lease as a fallback, not a deni…
waleedlatif1 Aug 28, 2026
1ade0f4
fix(guardrails): route PII validation through app runtime (#7227)
TheodoreSpeaks Aug 28, 2026
acc4f1d
fix(executor): preserve actors for actorless tool calls (#7230)
TheodoreSpeaks Aug 28, 2026
d90e5ed
improvement(ui): soften overflow fade (#7234)
waleedlatif1 Aug 28, 2026
4bb46be
chore(skills): name directExecution as retired in the add-integration…
waleedlatif1 Aug 28, 2026
e9c343d
fix(ui): prevent competing sidebar tooltips (#7235)
waleedlatif1 Aug 28, 2026
6ca5b52
fix(execution): release the lease when abort races an undetermined ac…
waleedlatif1 Aug 28, 2026
44a3e44
fix(dataverse): harden OAuth connection preflight (#7238)
waleedlatif1 Aug 28, 2026
128e9d2
chore(docs): refresh introduction screenshot (#7239)
waleedlatif1 Aug 28, 2026
60776ba
feat(credential-groups): add seventeen OAuth providers (#7201)
TheodoreSpeaks Aug 28, 2026
e4c0a9f
docs(library): update best-ai-agent-builder-2026 (#7242)
icecrasher321 Aug 29, 2026
4aa1c04
fix(lambda): close the remaining contract validation gaps (#7241)
waleedlatif1 Aug 29, 2026
a38492b
fix(integrations): validate runtime values the type system only claim…
waleedlatif1 Aug 29, 2026
d673548
feat(library): Best AI Agents for Slack (#7245)
icecrasher321 Aug 29, 2026
3077553
fix(secrets): preserve caret when revealing values (#7246)
waleedlatif1 Aug 29, 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
  •  
  •  
  •  
4 changes: 4 additions & 0 deletions .agents/skills/add-block/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ When the user asks you to create a block:

Blocks depend on tool outputs. If the underlying tool response schema is not documented or live-verified, you MUST tell the user instead of guessing block outputs.

When block work changes tool execution, same-process work must use a registered
`InternalToolConfig.operation`. Never add a Sim `/api/...` self-hop or the retired
`directExecution` property.

- Do NOT invent block outputs for undocumented tool responses
- Do NOT describe unknown JSON shapes as if they were confirmed
- Do NOT wire fields into the block just because they seem likely to exist
Expand Down
8 changes: 4 additions & 4 deletions .agents/skills/add-integration/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ Choose the tool boundary before writing the declaration:
- Use `ToolConfig.request` only for an absolute external HTTP(S) provider endpoint.

Never point a tool at `/api/...`, construct an absolute URL back to Sim, declare
`request.internal`, or add an API route merely to reuse code, normalize files, or authorize
`request.internal`, add the retired `directExecution` property, or add an API route merely to reuse code, normalize files, or authorize
resources. A real external/browser route and an in-process tool may share the same operation, but
neither calls the other. Follow the full transport and handler rules in the `add-tools` skill.

Expand Down Expand Up @@ -171,7 +171,7 @@ Hard rules:
- Never substitute secret plaintext into source or serialize plaintext provenance.
- Never hand-roll private provenance headers/envelopes; the shared `executeTool` boundary owns
transport and strips private metadata from functional results.
- Never attach private provenance to an external URL or to `directExecution`. Project proven
- Never attach private provenance to an external URL. Project proven
model-visible external fields with `request.modelInput`; otherwise preserve ordinary request
semantics. Use a registered in-process operation when encrypted provenance must cross the
boundary.
Expand Down Expand Up @@ -606,8 +606,8 @@ If creating V2 versions (API-aligned outputs):
- [ ] Created tool file for each operation
- [ ] Chose exactly one boundary per tool: registered `InternalToolConfig.operation` or absolute
external HTTP(S) `ToolConfig.request`
- [ ] No tool points to `/api/...`, constructs a URL back to Sim, declares `request.internal`, or
has an HTTP fallback for an in-process operation
- [ ] No tool points to `/api/...`, constructs a URL back to Sim, declares `request.internal` or the
retired `directExecution` property, or has an HTTP fallback for an in-process operation
- [ ] All params have correct visibility
- [ ] All nullable fields use `?? null`
- [ ] All optional outputs have `optional: true`
Expand Down
3 changes: 2 additions & 1 deletion .agents/skills/add-tools/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ Every tool must use exactly one of these configurations:
HTTP(S) provider endpoint.

Never set a tool URL to `/api/...`, construct an absolute URL back to Sim, declare
`request.internal`, import a route module, or create an API route merely to normalize files,
`request.internal`, add the retired `directExecution` property, import a route module, or create an API route merely to normalize files,
authorize access, or reuse server code. A real browser/API route may remain as a thin adapter, but
the route and the tool must call the same operation directly. A true cross-process/capability
boundary uses an explicit server client and is not disguised as a tool self-hop.
Expand Down Expand Up @@ -524,6 +524,7 @@ All tool IDs MUST use `snake_case`: `{service}_{action}` (e.g., `x_create_tweet`
HTTP(S) `ToolConfig.request`
- [ ] No tool request points to `/api/...`, constructs a URL back to Sim, or declares
`request.internal`
- [ ] No tool declares `directExecution`; in-process work uses a registered operation
- [ ] All params have explicit `required: true` or `required: false`
- [ ] All params have appropriate `visibility`
- [ ] All nullable response fields use `?? null`
Expand Down
3 changes: 2 additions & 1 deletion .agents/skills/add-trigger/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -508,7 +508,8 @@ Two rules the checks enforce:
Webhook and polling routes are legitimate external ingress boundaries. They must not call this
Sim app's own API routes to reuse provider or business logic. Extract the shared provider operation
or authorized application use case and call it directly from the trigger handler and any other
server adapter. HTTP is reserved for an actual cross-process/capability boundary.
server adapter. HTTP is reserved for an actual cross-process/capability boundary. Tool work uses a
registered `InternalToolConfig.operation`; the retired `directExecution` property must not return.

### Trigger Definition
- [ ] Created `utils.ts` with options, instructions, extra fields, and output builders
Expand Down
10 changes: 8 additions & 2 deletions .agents/skills/tool-registry-boundary/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,12 @@ You keep the 4,300-tool executable registry out of module graphs that don't exec

> Client-reachable code reads tool **metadata**. Only code that actually executes a tool imports the **registry**.

`@/tools/registry` is a ~9,000-line barrel importing every tool. Each `ToolConfig` mixes plain data (`params`, `outputs`, `name`) with closures — `request.url`, `request.headers`, `transformResponse`, `directExecution`, `postProcess`. Those closures reach the SDK clients, API helpers and parsers each integration needs, and that is what makes the barrel expensive: reaching it costs ~4,700 additional modules.
`@/tools/registry` is a ~9,000-line barrel importing every tool. External `ToolConfig` entries mix
plain data (`params`, `outputs`, `name`) with request/response closures, while
`InternalToolConfig` entries contain semantic input projection and load their server implementation
through `lib/internal/tool-operations/registry.server.ts`. Request closures can still reach SDK
clients, API helpers, and parsers, which is what makes the executable barrel expensive: reaching it
costs ~4,700 additional modules.

`getTool()` returns the whole `ToolConfig`, so a single `getTool` import anywhere in a client-reachable file drags all of it in.

Expand Down Expand Up @@ -95,4 +100,5 @@ The canvas route reached the registry through **four** redundant edges — `prov

Ask what the caller does with the config. If it reads `params`, `outputs`, `name`, `description` or just checks existence, it belongs on `@/tools/metadata` — no exceptions, even on a path you believe is server-only today, because a future client import will silently re-attach the registry to the graph.

If it genuinely executes — builds a request, transforms a response, runs `directExecution` — use `getTool`, and keep that file off client-reachable paths.
If it genuinely executes — builds an external request, transforms a response, or dispatches a
registered internal operation — use `getTool`, and keep that file off client-reachable paths.
5 changes: 3 additions & 2 deletions .agents/skills/validate-integration/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,8 +159,9 @@ search, extraction, or "AI-powered" marketing terminology.
- [ ] Sim-owned durable writes and internal execution handoffs that can enter workflows/models use
field-scoped `request.secretProvenance`; authenticated receivers validate the exact selection
and scope, strip private metadata, and persist, import, or propagate it at the owning boundary
- [ ] Private provenance is never attached to external URLs or `directExecution`; proven
model-visible external fields use projection, while other external inputs remain unchanged
- [ ] Private provenance is never attached to external URLs; registered in-process operations
preserve it through `operation.modelInput` / `operation.secretProvenance`, while proven
model-visible external fields use request projection and other external inputs remain unchanged
- [ ] No tool performs raw secret plaintext/source substitution or serializes plaintext provenance
- [ ] No `transformResponse` or tool-local helper blanket-sanitizes ordinary third-party results;
only execution-scoped, activated Sim provenance is projected at shared model/log boundaries
Expand Down
2 changes: 1 addition & 1 deletion .claude/rules/emcn-components.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ The menu surface intentionally diverges from the pill: `dropdown-menu.tsx` items
- **`ChipDatePicker`** — chip-styled date field.
- **`ChipTimePicker`** — minute-granular time sibling of `ChipDatePicker`, a `ChipInput` that leniently parses typed input (`9:47`, `947`, `2:05pm`, `14:30`), commits on Enter/blur, and re-renders the canonical `9:47 AM` label.
- **`DropdownMenu`** — the canonical context/action menu (Radix-backed). Not a chip, but the standard menu for command/action lists; reach for it instead of a hand-rolled popover. Its surface intentionally diverges from the chip pill (`text-small`, `gap-2`) — keep them distinct. For a pill that opens a value picker, use `ChipDropdown`/`ChipSelect` instead.
- **`OverflowText`** — the canonical single-line overflow treatment for read-only human labels and titles. It owns `min-w-0`, single-line clipping, the conditional 18px edge fade, and the full-value floating tooltip; consumers pass only layout/typography through `className`. Never combine the fade with `truncate`, which paints an ellipsis beneath the mask. Keep ordinary `truncate` for editable or mirrored input values, code/log/path content, dense or virtualized grids, and composite rows where masking the container would also fade icons or actions. Multiline copy uses an intentional `line-clamp-*` treatment instead. A non-editable `Combobox` visual overlay passes its plain value through `overlayLabel`; render its visible `OverflowText` as a constrained block with `tooltipEnabled={false}` so the interactive trigger owns the single accessible tooltip.
- **`OverflowText`** — the canonical single-line overflow treatment for read-only human labels and titles. It owns `min-w-0`, fade-only clipping (never an ellipsis), the conditional 18px edge mask, and the full-value floating tooltip; consumers pass only layout/typography through `className`. `overflowTextClipClass` and `overflowTextFadeClass` are the complete base/faded treatments for the rare component that must own measurement itself; never pair either with `truncate`, `text-ellipsis`, or hover-time mask removal. Use `DropdownMenuItemLabel` for a menu label beside icons, checks, or actions. A non-editable `Combobox` passes the full visual value through `overlayLabel`; the combobox owns the visual overlay's fade and keeps its one accessible tooltip on the interactive layer. Keep ordinary `truncate` only for editable values, code/log/path content, dense or virtualized grids, and rich composite content that cannot supply a plain tooltip label. Multiline copy uses an intentional `line-clamp-*` treatment instead.

## Modal keyboard defaults

Expand Down
8 changes: 5 additions & 3 deletions .claude/rules/sim-styling.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,11 @@ Icons default `size-[14px]`. Equal h/w → `size-*` (`size-[14px]`, `size-4`), n

## Text Overflow

Use `OverflowText` from `@sim/emcn` for a constrained, single-line, read-only human label or title. It owns `min-w-0`, single-line clipping, the conditional edge fade, and the full-value floating tooltip; pass only layout and typography through `className`. Never combine a fade or hand-written `mask-image` with `truncate`, which leaves an ellipsis beneath the mask. Pass the full label to this component instead of shortening it in JavaScript first.
Use `OverflowText` from `@sim/emcn` for a constrained, single-line, read-only human label or title. It owns `min-w-0`, fade-only clipping, the conditional edge mask, and the full-value floating tooltip; pass only layout and typography through `className`. Never combine a fade or hand-written `mask-image` with `truncate`/`text-ellipsis`, and never remove the mask on hover to reveal an ellipsis. Pass the full label instead of shortening it in JavaScript first. Components that must measure a label externally use the complete `overflowTextClipClass` + conditional `overflowTextFadeClass` pair.

For a non-editable `Combobox` visual overlay, pass the same plain value as `overlayLabel` and render the visible `OverflowText` with `block w-full` (or `block flex-1` beside an icon) plus `tooltipEnabled={false}`. The transparent interactive layer then owns the one reachable full-value tooltip while the visual layer owns the measured fade.
For a non-editable `Combobox` visual overlay, pass the same full plain value as `overlayLabel`. The combobox owns the visible overlay's fade and keeps the one reachable full-value tooltip on its interactive layer; consumers provide only the overlay's decorated content.

Use `DropdownMenuItemLabel` for a human label beside menu icons, checks, shortcuts, or actions. Bare string children are wrapped automatically; a direct rich `<span>` is only a hard-clipped escape hatch and must not be used for an ordinary text label.

Do not apply the fade universally to editable or mirrored input values, code, logs, paths, filenames that use intentional middle truncation, dense or virtualized grids, or a composite container that also holds icons/actions. Those keep their purpose-built overflow behavior. Multiline copy uses an intentional `line-clamp-*` treatment.

Expand Down Expand Up @@ -92,7 +94,7 @@ Draw a line with a real `border-*` utility. Never hand-roll one as `shadow-[inse

### What className MAY carry

Layout/sizing ONLY: `flex-1`, `w-full`, `w-[Npx]`, `min-w-0`, `max-w-*`, margins, `truncate`. Example: `<ChipInput icon={Search} className='min-w-0 flex-1' .../>` (`app/workspace/[workspaceId]/integrations/integrations.tsx:257`). NEVER re-specify canonical chrome — the component already applies it.
Layout/sizing ONLY: `flex-1`, `w-full`, `w-[Npx]`, `min-w-0`, `max-w-*`, margins. `truncate` is allowed only for the explicit overflow exceptions above, never as a general layout class. Example: `<ChipInput icon={Search} className='min-w-0 flex-1' .../>` (`app/workspace/[workspaceId]/integrations/integrations.tsx:257`). NEVER re-specify canonical chrome — the component already applies it.

### Form / chip-modal layout rhythm

Expand Down
8 changes: 5 additions & 3 deletions .cursor/rules/sim-styling.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,11 @@ Icons default `size-[14px]`. Equal h/w → `size-*` (`size-[14px]`, `size-4`), n

## Text Overflow

Use `OverflowText` from `@sim/emcn` for a constrained, single-line, read-only human label or title. It owns `min-w-0`, single-line clipping, the conditional edge fade, and the full-value floating tooltip; pass only layout and typography through `className`. Never combine a fade or hand-written `mask-image` with `truncate`, which leaves an ellipsis beneath the mask. Pass the full label to this component instead of shortening it in JavaScript first.
Use `OverflowText` from `@sim/emcn` for a constrained, single-line, read-only human label or title. It owns `min-w-0`, fade-only clipping, the conditional edge mask, and the full-value floating tooltip; pass only layout and typography through `className`. Never combine a fade or hand-written `mask-image` with `truncate`/`text-ellipsis`, and never remove the mask on hover to reveal an ellipsis. Pass the full label instead of shortening it in JavaScript first. Components that must measure a label externally use the complete `overflowTextClipClass` + conditional `overflowTextFadeClass` pair.

For a non-editable `Combobox` visual overlay, pass the same plain value as `overlayLabel` and render the visible `OverflowText` with `block w-full` (or `block flex-1` beside an icon) plus `tooltipEnabled={false}`. The transparent interactive layer then owns the one reachable full-value tooltip while the visual layer owns the measured fade.
For a non-editable `Combobox` visual overlay, pass the same full plain value as `overlayLabel`. The combobox owns the visible overlay's fade and keeps the one reachable full-value tooltip on its interactive layer; consumers provide only the overlay's decorated content.

Use `DropdownMenuItemLabel` for a human label beside menu icons, checks, shortcuts, or actions. Bare string children are wrapped automatically; a direct rich `<span>` is only a hard-clipped escape hatch and must not be used for an ordinary text label.

Do not apply the fade universally to editable or mirrored input values, code, logs, paths, filenames that use intentional middle truncation, dense or virtualized grids, or a composite container that also holds icons/actions. Those keep their purpose-built overflow behavior. Multiline copy uses an intentional `line-clamp-*` treatment.

Expand All @@ -70,7 +72,7 @@ Value text `--text-body`; muted/placeholder/labels `--text-muted`; icons `--text

### What className MAY carry

Layout/sizing ONLY: `flex-1`, `w-full`, `w-[Npx]`, `min-w-0`, `max-w-*`, margins, `truncate`. Example: `<ChipInput icon={Search} className='min-w-0 flex-1' .../>` (`app/workspace/[workspaceId]/integrations/integrations.tsx:257`). NEVER re-specify canonical chrome — the component already applies it.
Layout/sizing ONLY: `flex-1`, `w-full`, `w-[Npx]`, `min-w-0`, `max-w-*`, margins. `truncate` is allowed only for the explicit overflow exceptions above, never as a general layout class. Example: `<ChipInput icon={Search} className='min-w-0 flex-1' .../>` (`app/workspace/[workspaceId]/integrations/integrations.tsx:257`). NEVER re-specify canonical chrome — the component already applies it.

### Form / chip-modal layout rhythm

Expand Down
26 changes: 26 additions & 0 deletions apps/docs/components/icons.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6843,6 +6843,32 @@ export function CloudFormationIcon(props: SVGProps<SVGSVGElement>) {
)
}

export function LambdaIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
{...props}
viewBox='5 5 70 70'
version='1.1'
xmlns='http://www.w3.org/2000/svg'
xmlnsXlink='http://www.w3.org/1999/xlink'
>
<g
id='Icon-Architecture/64/Arch_AWS-Lambda_64'
stroke='none'
strokeWidth='1'
fill='none'
fillRule='evenodd'
>
<path
d='M28.008,66 L15.591,66 L29.324,37.296 L35.546,50.106 L28.008,66 Z M30.22,34.553 C30.051,34.208 29.7,33.989 29.318,33.989 L29.315,33.989 C28.929,33.99 28.578,34.211 28.412,34.558 L13.098,66.569 C12.95,66.879 12.971,67.243 13.155,67.534 C13.337,67.824 13.658,68 14.002,68 L28.642,68 C29.03,68 29.382,67.777 29.548,67.428 L37.564,50.528 C37.693,50.254 37.692,49.937 37.559,49.665 L30.22,34.553 Z M64.995,66 L52.659,66 L32.867,24.57 C32.701,24.222 32.349,24 31.962,24 L23.89,24 L23.899,14 L39.72,14 L59.42,55.429 C59.586,55.777 59.939,56 60.326,56 L64.995,56 L64.995,66 Z M65.998,54 L60.96,54 L41.259,12.571 C41.094,12.223 40.741,12 40.353,12 L22.898,12 C22.345,12 21.896,12.447 21.895,12.999 L21.884,24.999 C21.884,25.265 21.989,25.519 22.178,25.707 C22.365,25.895 22.62,26 22.887,26 L31.329,26 L51.122,67.43 C51.289,67.778 51.639,68 52.026,68 L65.998,68 C66.552,68 67,67.552 67,67 L67,55 C67,54.448 66.552,54 65.998,54 L65.998,54 Z'
id='AWS-Lambda_Icon_64_Squid'
fill='currentColor'
/>
</g>
</svg>
)
}

export function AthenaIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
Expand Down
3 changes: 3 additions & 0 deletions apps/docs/components/ui/icon-mapping.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ import {
JupyterIcon,
KalshiIcon,
KetchIcon,
LambdaIcon,
LangsmithIcon,
LatexIcon,
LaunchDarklyIcon,
Expand Down Expand Up @@ -423,6 +424,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
kalshi_v2: KalshiIcon,
ketch: KetchIcon,
knowledge: PackageSearchIcon,
lambda: LambdaIcon,
langsmith: LangsmithIcon,
latex: LatexIcon,
launchdarkly: LaunchDarklyIcon,
Expand All @@ -446,6 +448,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
memory: BrainIcon,
microsoft_ad: AzureIcon,
microsoft_dataverse: MicrosoftDataverseIcon,
microsoft_dynamics_365: MicrosoftDataverseIcon,
microsoft_excel: MicrosoftExcelIcon,
microsoft_excel_v2: MicrosoftExcelIcon,
microsoft_planner: MicrosoftPlannerIcon,
Expand Down
6 changes: 3 additions & 3 deletions apps/docs/content/docs/de/introduction/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ Sim ist ein Open-Source-Tool zur visuellen Workflow-Erstellung für die Entwickl
<div className="flex justify-center">
<Image
src="/static/introduction.png"
alt="Sim visuelle Workflow-Leinwand"
width={700}
height={372}
alt="Sim-Workflow-Editor mit leerer Leinwand, Editor-Bereich und Navigation"
width={2304}
height={1600}
className="my-6"
/>
</div>
Expand Down
Loading
Loading