Skip to content

Commit c12931b

Browse files
waleedlatif1icecrasher321emir-karabegclaudeSg312
committed
v0.5.69: kb upgrades, blog, copilot improvements, auth consolidation (#2973)
* fix(subflows): tag dropdown + resolution logic (#2949) * fix(subflows): tag dropdown + resolution logic * fixes; * revert parallel change * chore(deps): bump posthog-js to 1.334.1 (#2948) * fix(idempotency): add conflict target to atomicallyClaimDb query + remove redundant db namespace tracking (#2950) * fix(idempotency): add conflict target to atomicallyClaimDb query * delete needs to account for namespace * simplify namespace filtering logic * fix cleanup * consistent target * improvement(kb): add document filtering, select all, and React Query migration (#2951) * improvement(kb): add document filtering, select all, and React Query migration * test(kb): update tests for enabledFilter and removed userId params * fix(kb): remove non-null assertion, add explicit guard * improvement(logs): trace span, details (#2952) * improvement(action-bar): ordering * improvement(logs): details, trace span * feat(blog): v0.5 release post (#2953) * feat(blog): v0.5 post * improvement(blog): simplify title and remove code block header - Simplified blog title from Introducing Sim Studio v0.5 to Introducing Sim v0.5 - Removed language label header and copy button from code blocks for cleaner appearance Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * ack PR comments * small styling improvements * created system to create post-specific components * updated componnet * cache invalidation --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> * feat(admin): add credits endpoint to issue credits to users (#2954) * feat(admin): add credits endpoint to issue credits to users * fix(admin): use existing credit functions and handle enterprise seats * fix(admin): reject NaN and Infinity in amount validation * styling * fix(admin): validate userId and email are strings * improvement(copilot): fast mode, subagent tool responses and allow preferences (#2955) * Improvements * Fix actions mapping * Remove console logs * fix(billing): handle missing userStats and prevent crashes (#2956) * fix(billing): handle missing userStats and prevent crashes * fix(billing): correct import path for getFilledPillColor * fix(billing): add Number.isFinite check to lastPeriodCost * fix(logs): refresh logic to refresh logs details (#2958) * fix(security): add authentication and input validation to API routes (#2959) * fix(security): add authentication and input validation to API routes * moved utils * remove extraneous commetns * removed unused dep * improvement(helm): add internal ingress support and same-host path consolidation (#2960) * improvement(helm): add internal ingress support and same-host path consolidation * improvement(helm): clean up ingress template comments Simplify verbose inline Helm comments and section dividers to match the minimal style used in services.yaml. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(helm): add missing copilot path consolidation for realtime host When copilot.host equals realtime.host but differs from app.host, copilot paths were not being routed. Added logic to consolidate copilot paths into the realtime rule for this scenario. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * improvement(helm): follow ingress best practices - Remove orphan comments that appeared when services were disabled - Add documentation about path ordering requirements - Paths rendered in order: realtime, copilot, app (specific before catch-all) - Clean template output matching industry Helm chart standards --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> * feat(blog): enterprise post (#2961) * feat(blog): enterprise post * added more images, styling * more content * updated v0-5 post * remove unused transition --------- Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai> * fix(envvars): resolution standardized (#2957) * fix(envvars): resolution standardized * remove comments * address bugbot * fix highlighting for env vars * remove comments * address greptile * address bugbot * fix(copilot): mask credentials fix (#2963) * Fix copilot masking * Clean up * Lint * improvement(webhooks): remove dead code (#2965) * fix(webhooks): subscription recreation path * improvement(webhooks): remove dead code * fix tests * address bugbot comments * fix restoration edge case * fix more edge cases * address bugbot comments * fix gmail polling * add warnings for UI indication for credential sets * fix(preview): subblock values (#2969) * fix(child-workflow): nested spans handoff (#2966) * fix(child-workflow): nested spans handoff * remove overly defensive programming * update type check * type more code * remove more dead code * address bugbot comments * fix(security): restrict API key access on internal-only routes (#2964) * fix(security): restrict API key access on internal-only routes * test(security): update function execute tests for checkInternalAuth * updated agent handler * move session check higher in checkSessionOrInternalAuth * extracted duplicate code into helper for resolving user from jwt * fix(copilot): update copilot chat title (#2968) * fix(hitl): fix condition blocks after hitl (#2967) * fix(notes): ghost edges (#2970) * fix(notes): ghost edges * fix deployed state fallback * fallback * remove UI level checks * annotation missing from autoconnect source check * improvement(docs): loop and parallel var reference syntax (#2975) * fix(blog): slash actions description (#2976) * improvement(docs): loop and parallel var reference syntax * fix(blog): slash actions description * fix(auth): copilot routes (#2977) * Fix copilot auth * Fix * Fix * Fix * fix(copilot): fix edit summary for loops/parallels (#2978) * fix(integrations): hide from tool bar (#2544) * fix(landing): ui (#2979) * fix(edge-validation): race condition on collaborative add (#2980) * fix(variables): boolean type support and input improvements (#2981) * fix(variables): boolean type support and input improvements * fix formatting --------- Co-authored-by: Vikhyath Mondreti <vikhyathvikku@gmail.com> Co-authored-by: Emir Karabeg <78010029+emir-karabeg@users.noreply.github.com> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Siddharth Ganesan <33737564+Sg312@users.noreply.github.com> Co-authored-by: Vikhyath Mondreti <vikhyath@simstudio.ai>
2 parents e9c4251 + bcf6dc8 commit c12931b

File tree

289 files changed

+16866
-4280
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

289 files changed

+16866
-4280
lines changed

apps/docs/content/docs/en/blocks/loop.mdx

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,44 @@ Choose between four types of loops:
124124
3. Drag other blocks inside the loop container
125125
4. Connect the blocks as needed
126126

127-
### Accessing Results
127+
### Referencing Loop Data
128128

129-
After a loop completes, you can access aggregated results:
129+
There's an important distinction between referencing loop data from **inside** vs **outside** the loop:
130130

131-
- **`<loop.results>`**: Array of results from all loop iterations
131+
<Tabs items={['Inside the Loop', 'Outside the Loop']}>
132+
<Tab>
133+
**Inside the loop**, use `<loop.>` references to access the current iteration context:
134+
135+
- **`<loop.index>`**: Current iteration number (0-based)
136+
- **`<loop.currentItem>`**: Current item being processed (forEach only)
137+
- **`<loop.items>`**: Full collection being iterated (forEach only)
138+
139+
```
140+
// Inside a Function block within the loop
141+
const idx = <loop.index>; // 0, 1, 2, ...
142+
const item = <loop.currentItem>; // Current item
143+
```
144+
145+
<Callout type="info">
146+
These references are only available for blocks **inside** the loop container. They give you access to the current iteration's context.
147+
</Callout>
148+
</Tab>
149+
<Tab>
150+
**Outside the loop** (after it completes), reference the loop block by its name to access aggregated results:
151+
152+
- **`<LoopBlockName.results>`**: Array of results from all iterations
153+
154+
```
155+
// If your loop block is named "Process Items"
156+
const allResults = <processitems.results>;
157+
// Returns: [result1, result2, result3, ...]
158+
```
159+
160+
<Callout type="info">
161+
After the loop completes, use the loop's block name (not `loop.`) to access the collected results. The block name is normalized (lowercase, no spaces).
162+
</Callout>
163+
</Tab>
164+
</Tabs>
132165

133166
## Example Use Cases
134167

@@ -184,28 +217,29 @@ Variables (i=0) → Loop (While i<10) → Agent (Process) → Variables (i++)
184217
</ul>
185218
</Tab>
186219
<Tab>
220+
Available **inside** the loop only:
187221
<ul className="list-disc space-y-2 pl-6">
188222
<li>
189-
<strong>loop.currentItem</strong>: Current item being processed
223+
<strong>{"<loop.index>"}</strong>: Current iteration number (0-based)
190224
</li>
191225
<li>
192-
<strong>loop.index</strong>: Current iteration number (0-based)
226+
<strong>{"<loop.currentItem>"}</strong>: Current item being processed (forEach only)
193227
</li>
194228
<li>
195-
<strong>loop.items</strong>: Full collection (forEach loops)
229+
<strong>{"<loop.items>"}</strong>: Full collection (forEach only)
196230
</li>
197231
</ul>
198232
</Tab>
199233
<Tab>
200234
<ul className="list-disc space-y-2 pl-6">
201235
<li>
202-
<strong>loop.results</strong>: Array of all iteration results
236+
<strong>{"<blockname.results>"}</strong>: Array of all iteration results (accessed via block name)
203237
</li>
204238
<li>
205239
<strong>Structure</strong>: Results maintain iteration order
206240
</li>
207241
<li>
208-
<strong>Access</strong>: Available in blocks after the loop
242+
<strong>Access</strong>: Available in blocks after the loop completes
209243
</li>
210244
</ul>
211245
</Tab>

apps/docs/content/docs/en/blocks/parallel.mdx

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,44 @@ Choose between two types of parallel execution:
7676
3. Drag a single block inside the parallel container
7777
4. Connect the block as needed
7878

79-
### Accessing Results
79+
### Referencing Parallel Data
8080

81-
After a parallel block completes, you can access aggregated results:
81+
There's an important distinction between referencing parallel data from **inside** vs **outside** the parallel block:
8282

83-
- **`<parallel.results>`**: Array of results from all parallel instances
83+
<Tabs items={['Inside the Parallel', 'Outside the Parallel']}>
84+
<Tab>
85+
**Inside the parallel**, use `<parallel.>` references to access the current instance context:
86+
87+
- **`<parallel.index>`**: Current instance number (0-based)
88+
- **`<parallel.currentItem>`**: Item for this instance (collection-based only)
89+
- **`<parallel.items>`**: Full collection being distributed (collection-based only)
90+
91+
```
92+
// Inside a Function block within the parallel
93+
const idx = <parallel.index>; // 0, 1, 2, ...
94+
const item = <parallel.currentItem>; // This instance's item
95+
```
96+
97+
<Callout type="info">
98+
These references are only available for blocks **inside** the parallel container. They give you access to the current instance's context.
99+
</Callout>
100+
</Tab>
101+
<Tab>
102+
**Outside the parallel** (after it completes), reference the parallel block by its name to access aggregated results:
103+
104+
- **`<ParallelBlockName.results>`**: Array of results from all instances
105+
106+
```
107+
// If your parallel block is named "Process Tasks"
108+
const allResults = <processtasks.results>;
109+
// Returns: [result1, result2, result3, ...]
110+
```
111+
112+
<Callout type="info">
113+
After the parallel completes, use the parallel's block name (not `parallel.`) to access the collected results. The block name is normalized (lowercase, no spaces).
114+
</Callout>
115+
</Tab>
116+
</Tabs>
84117

85118
## Example Use Cases
86119

@@ -98,11 +131,11 @@ Parallel (["gpt-4o", "claude-3.7-sonnet", "gemini-2.5-pro"]) → Agent → Evalu
98131

99132
### Result Aggregation
100133

101-
Results from all parallel instances are automatically collected:
134+
Results from all parallel instances are automatically collected and accessible via the block name:
102135

103136
```javascript
104-
// In a Function block after the parallel
105-
const allResults = input.parallel.results;
137+
// In a Function block after a parallel named "Process Tasks"
138+
const allResults = <processtasks.results>;
106139
// Returns: [result1, result2, result3, ...]
107140
```
108141

@@ -158,25 +191,26 @@ Understanding when to use each:
158191
</ul>
159192
</Tab>
160193
<Tab>
194+
Available **inside** the parallel only:
161195
<ul className="list-disc space-y-2 pl-6">
162196
<li>
163-
<strong>parallel.currentItem</strong>: Item for this instance
197+
<strong>{"<parallel.index>"}</strong>: Instance number (0-based)
164198
</li>
165199
<li>
166-
<strong>parallel.index</strong>: Instance number (0-based)
200+
<strong>{"<parallel.currentItem>"}</strong>: Item for this instance (collection-based only)
167201
</li>
168202
<li>
169-
<strong>parallel.items</strong>: Full collection (collection-based)
203+
<strong>{"<parallel.items>"}</strong>: Full collection (collection-based only)
170204
</li>
171205
</ul>
172206
</Tab>
173207
<Tab>
174208
<ul className="list-disc space-y-2 pl-6">
175209
<li>
176-
<strong>parallel.results</strong>: Array of all instance results
210+
<strong>{"<blockname.results>"}</strong>: Array of all instance results (accessed via block name)
177211
</li>
178212
<li>
179-
<strong>Access</strong>: Available in blocks after the parallel
213+
<strong>Access</strong>: Available in blocks after the parallel completes
180214
</li>
181215
</ul>
182216
</Tab>

apps/sim/app/(landing)/components/footer/components/status-indicator.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ export default function StatusIndicator() {
5959
href={statusUrl}
6060
target='_blank'
6161
rel='noopener noreferrer'
62-
className={`flex items-center gap-[6px] whitespace-nowrap text-[12px] transition-colors ${STATUS_COLORS[status]}`}
62+
className={`flex min-w-[165px] items-center gap-[6px] whitespace-nowrap text-[12px] transition-colors ${STATUS_COLORS[status]}`}
6363
aria-label={`System status: ${message}`}
6464
>
6565
<StatusDotIcon status={status} className='h-[6px] w-[6px]' aria-hidden='true' />

apps/sim/app/(landing)/components/hero/components/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ export { LandingLoopNode } from './landing-canvas/landing-block/landing-loop-nod
1010
export { LandingNode } from './landing-canvas/landing-block/landing-node'
1111
export type { LoopBlockProps } from './landing-canvas/landing-block/loop-block'
1212
export { LoopBlock } from './landing-canvas/landing-block/loop-block'
13-
export type { TagProps } from './landing-canvas/landing-block/tag'
14-
export { Tag } from './landing-canvas/landing-block/tag'
13+
export type { SubBlockRowProps, TagProps } from './landing-canvas/landing-block/tag'
14+
export { SubBlockRow, Tag } from './landing-canvas/landing-block/tag'
1515
export type {
1616
LandingBlockNode,
1717
LandingCanvasProps,
Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import React from 'react'
2-
import { BookIcon } from 'lucide-react'
32
import {
4-
Tag,
5-
type TagProps,
3+
SubBlockRow,
4+
type SubBlockRowProps,
65
} from '@/app/(landing)/components/hero/components/landing-canvas/landing-block/tag'
76

87
/**
98
* Data structure for a landing card component
9+
* Matches the workflow block structure from the application
1010
*/
1111
export interface LandingCardData {
1212
/** Icon element to display in the card header */
@@ -15,8 +15,8 @@ export interface LandingCardData {
1515
color: string | '#f6f6f6'
1616
/** Name/title of the card */
1717
name: string
18-
/** Optional tags to display at the bottom of the card */
19-
tags?: TagProps[]
18+
/** Optional subblock rows to display below the header */
19+
tags?: SubBlockRowProps[]
2020
}
2121

2222
/**
@@ -28,7 +28,8 @@ export interface LandingBlockProps extends LandingCardData {
2828
}
2929

3030
/**
31-
* Landing block component that displays a card with icon, name, and optional tags
31+
* Landing block component that displays a card with icon, name, and optional subblock rows
32+
* Styled to match the application's workflow blocks
3233
* @param props - Component properties including icon, color, name, tags, and className
3334
* @returns A styled block card component
3435
*/
@@ -39,33 +40,37 @@ export const LandingBlock = React.memo(function LandingBlock({
3940
tags,
4041
className,
4142
}: LandingBlockProps) {
43+
const hasContentBelowHeader = tags && tags.length > 0
44+
4245
return (
4346
<div
44-
className={`z-10 flex w-64 flex-col items-start gap-3 rounded-[14px] border border-[#E5E5E5] bg-[#FEFEFE] p-3 ${className ?? ''}`}
45-
style={{
46-
boxShadow: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
47-
}}
47+
className={`z-10 flex w-[250px] flex-col rounded-[8px] border border-[#E5E5E5] bg-white ${className ?? ''}`}
4848
>
49-
<div className='flex w-full items-center justify-between'>
50-
<div className='flex items-center gap-2.5'>
49+
{/* Header - matches workflow-block.tsx header styling */}
50+
<div
51+
className={`flex items-center justify-between p-[8px] ${hasContentBelowHeader ? 'border-[#E5E5E5] border-b' : ''}`}
52+
>
53+
<div className='flex min-w-0 flex-1 items-center gap-[10px]'>
5154
<div
52-
className='flex h-6 w-6 items-center justify-center rounded-[8px] text-white'
53-
style={{ backgroundColor: color as string }}
55+
className='flex h-[24px] w-[24px] flex-shrink-0 items-center justify-center rounded-[6px]'
56+
style={{ background: color as string }}
5457
>
5558
{icon}
5659
</div>
57-
<p className='text-base text-card-foreground'>{name}</p>
60+
<span className='truncate font-medium text-[#171717] text-[16px]' title={name}>
61+
{name}
62+
</span>
5863
</div>
59-
<BookIcon className='h-4 w-4 text-muted-foreground' />
6064
</div>
6165

62-
{tags && tags.length > 0 ? (
63-
<div className='flex flex-wrap gap-2'>
66+
{/* Content - SubBlock Rows matching workflow-block.tsx */}
67+
{hasContentBelowHeader && (
68+
<div className='flex flex-col gap-[8px] p-[8px]'>
6469
{tags.map((tag) => (
65-
<Tag key={tag.label} icon={tag.icon} label={tag.label} />
70+
<SubBlockRow key={tag.label} icon={tag.icon} label={tag.label} />
6671
))}
6772
</div>
68-
) : null}
73+
)}
6974
</div>
7075
)
7176
})

apps/sim/app/(landing)/components/hero/components/landing-canvas/landing-block/landing-node.tsx

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,14 @@ import {
77
type LandingCardData,
88
} from '@/app/(landing)/components/hero/components/landing-canvas/landing-block/landing-block'
99

10+
/**
11+
* Handle Y offset from block top - matches HANDLE_POSITIONS.DEFAULT_Y_OFFSET
12+
*/
13+
const HANDLE_Y_OFFSET = 20
14+
1015
/**
1116
* React Flow node component for the landing canvas
12-
* Includes CSS animations and connection handles
17+
* Styled to match the application's workflow blocks
1318
* @param props - Component properties containing node data
1419
* @returns A React Flow compatible node component
1520
*/
@@ -41,15 +46,15 @@ export const LandingNode = React.memo(function LandingNode({ data }: { data: Lan
4146
type='target'
4247
position={Position.Left}
4348
style={{
44-
width: '12px',
45-
height: '12px',
46-
background: '#FEFEFE',
47-
border: '1px solid #E5E5E5',
48-
borderRadius: '50%',
49-
top: '50%',
50-
left: '-20px',
49+
width: '7px',
50+
height: '20px',
51+
background: '#D1D1D1',
52+
border: 'none',
53+
borderRadius: '2px 0 0 2px',
54+
top: `${HANDLE_Y_OFFSET}px`,
55+
left: '-7px',
5156
transform: 'translateY(-50%)',
52-
zIndex: 2,
57+
zIndex: 10,
5358
}}
5459
isConnectable={false}
5560
/>
@@ -59,15 +64,15 @@ export const LandingNode = React.memo(function LandingNode({ data }: { data: Lan
5964
type='source'
6065
position={Position.Right}
6166
style={{
62-
width: '12px',
63-
height: '12px',
64-
background: '#FEFEFE',
65-
border: '1px solid #E5E5E5',
66-
borderRadius: '50%',
67-
top: '50%',
68-
right: '-20px',
67+
width: '7px',
68+
height: '20px',
69+
background: '#D1D1D1',
70+
border: 'none',
71+
borderRadius: '0 2px 2px 0',
72+
top: `${HANDLE_Y_OFFSET}px`,
73+
right: '-7px',
6974
transform: 'translateY(-50%)',
70-
zIndex: 2,
75+
zIndex: 10,
7176
}}
7277
isConnectable={false}
7378
/>

0 commit comments

Comments
 (0)