Compare commits
41 Commits
fix/kb-ws-
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1c58c35bd8 | ||
|
|
80f00479a3 | ||
|
|
c140e90559 | ||
|
|
d63a5cb504 | ||
|
|
8bd5d41723 | ||
|
|
c12931bc50 | ||
|
|
e9c4251c1c | ||
|
|
cc2be33d6b | ||
|
|
45371e521e | ||
|
|
0ce0f98aa5 | ||
|
|
dff1c9d083 | ||
|
|
b09f683072 | ||
|
|
a8bb0db660 | ||
|
|
af82820a28 | ||
|
|
4372841797 | ||
|
|
5e8c843241 | ||
|
|
7bf3d73ee6 | ||
|
|
7ffc11a738 | ||
|
|
be578e2ed7 | ||
|
|
f415e5edc4 | ||
|
|
13a6e6c3fa | ||
|
|
f5ab7f21ae | ||
|
|
bfb6fffe38 | ||
|
|
4fbec0a43f | ||
|
|
585f5e365b | ||
|
|
3792bdd252 | ||
|
|
eb5d1f3e5b | ||
|
|
54ab82c8dd | ||
|
|
f895bf469b | ||
|
|
dd3209af06 | ||
|
|
b6ba3b50a7 | ||
|
|
b304233062 | ||
|
|
57e4b49bd6 | ||
|
|
e12dd204ed | ||
|
|
3d9d9cbc54 | ||
|
|
0f4ec962ad | ||
|
|
4827866f9a | ||
|
|
3e697d9ed9 | ||
|
|
4431a1a484 | ||
|
|
4d1a9a3f22 | ||
|
|
eb07a080fb |
40
apps/docs/components/ui/action-media.tsx
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
'use client'
|
||||||
|
|
||||||
|
import { getAssetUrl } from '@/lib/utils'
|
||||||
|
|
||||||
|
interface ActionImageProps {
|
||||||
|
src: string
|
||||||
|
alt: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ActionVideoProps {
|
||||||
|
src: string
|
||||||
|
alt: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export function ActionImage({ src, alt }: ActionImageProps) {
|
||||||
|
const resolvedSrc = getAssetUrl(src.startsWith('/') ? src.slice(1) : src)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<img
|
||||||
|
src={resolvedSrc}
|
||||||
|
alt={alt}
|
||||||
|
className='inline-block w-full max-w-[200px] rounded border border-neutral-200 dark:border-neutral-700'
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function ActionVideo({ src, alt }: ActionVideoProps) {
|
||||||
|
const resolvedSrc = getAssetUrl(src.startsWith('/') ? src.slice(1) : src)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<video
|
||||||
|
src={resolvedSrc}
|
||||||
|
autoPlay
|
||||||
|
loop
|
||||||
|
muted
|
||||||
|
playsInline
|
||||||
|
className='inline-block w-full max-w-[200px] rounded border border-neutral-200 dark:border-neutral-700'
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ description: Essential actions for navigating and using the Sim workflow editor
|
|||||||
---
|
---
|
||||||
|
|
||||||
import { Callout } from 'fumadocs-ui/components/callout'
|
import { Callout } from 'fumadocs-ui/components/callout'
|
||||||
|
import { ActionImage, ActionVideo } from '@/components/ui/action-media'
|
||||||
|
|
||||||
A quick lookup for everyday actions in the Sim workflow editor. For keyboard shortcuts, see [Keyboard Shortcuts](/keyboard-shortcuts).
|
A quick lookup for everyday actions in the Sim workflow editor. For keyboard shortcuts, see [Keyboard Shortcuts](/keyboard-shortcuts).
|
||||||
|
|
||||||
@@ -13,124 +14,362 @@ A quick lookup for everyday actions in the Sim workflow editor. For keyboard sho
|
|||||||
|
|
||||||
## Workspaces
|
## Workspaces
|
||||||
|
|
||||||
| Action | How |
|
<table>
|
||||||
|--------|-----|
|
<thead>
|
||||||
| Create a workspace | Click workspace dropdown in sidebar → **New Workspace** |
|
<tr><th>Action</th><th>How</th><th>Preview</th></tr>
|
||||||
| Rename a workspace | Workspace settings → Edit name |
|
</thead>
|
||||||
| Switch workspaces | Click workspace dropdown in sidebar → Select workspace |
|
<tbody>
|
||||||
| Invite team members | Workspace settings → **Team** → **Invite** |
|
<tr>
|
||||||
|
<td>Create a workspace</td>
|
||||||
|
<td>Click workspace dropdown → **New Workspace**</td>
|
||||||
|
<td><ActionVideo src="/static/quick-reference/create-workspace.mp4" alt="Create workspace" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Switch workspaces</td>
|
||||||
|
<td>Click workspace dropdown → Select workspace</td>
|
||||||
|
<td><ActionVideo src="/static/quick-reference/switch-workspace.mp4" alt="Switch workspaces" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Invite team members</td>
|
||||||
|
<td>Sidebar → **Invite**</td>
|
||||||
|
<td><ActionVideo src="/static/quick-reference/invite.mp4" alt="Invite team members" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Rename a workspace</td>
|
||||||
|
<td>Right-click workspace → **Rename**</td>
|
||||||
|
<td rowSpan={4}><ActionImage src="/static/quick-reference/workspace-context-menu.png" alt="Workspace context menu" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Duplicate a workspace</td>
|
||||||
|
<td>Right-click workspace → **Duplicate**</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Export a workspace</td>
|
||||||
|
<td>Right-click workspace → **Export**</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Delete a workspace</td>
|
||||||
|
<td>Right-click workspace → **Delete**</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
## Workflows
|
## Workflows
|
||||||
|
|
||||||
| Action | How |
|
<table>
|
||||||
|--------|-----|
|
<thead>
|
||||||
| Create a workflow | Click **New Workflow** button or `Mod+Shift+A` |
|
<tr><th>Action</th><th>How</th><th>Preview</th></tr>
|
||||||
| Rename a workflow | Double-click workflow name in sidebar, or right-click → **Rename** |
|
</thead>
|
||||||
| Duplicate a workflow | Right-click workflow → **Duplicate** |
|
<tbody>
|
||||||
| Reorder workflows | Drag workflow up/down in the sidebar list |
|
<tr>
|
||||||
| Import a workflow | Sidebar menu → **Import** → Select file |
|
<td>Create a workflow</td>
|
||||||
| Create a folder | Right-click in sidebar → **New Folder** |
|
<td>Click **+** button in sidebar</td>
|
||||||
| Rename a folder | Right-click folder → **Rename** |
|
<td><ActionImage src="/static/quick-reference/create-workflow.png" alt="Create workflow" /></td>
|
||||||
| Delete a folder | Right-click folder → **Delete** |
|
</tr>
|
||||||
| Collapse/expand folder | Click folder arrow, or double-click folder |
|
<tr>
|
||||||
| Move workflow to folder | Drag workflow onto folder in sidebar |
|
<td>Reorder / move workflows</td>
|
||||||
| Delete a workflow | Right-click workflow → **Delete** |
|
<td>Drag workflow up/down or onto a folder</td>
|
||||||
| Export a workflow | Right-click workflow → **Export** |
|
<td><ActionVideo src="/static/quick-reference/reordering.mp4" alt="Reorder workflows" /></td>
|
||||||
| Assign workflow color | Right-click workflow → **Change Color** |
|
</tr>
|
||||||
| Multi-select workflows | `Mod+Click` or `Shift+Click` workflows in sidebar |
|
<tr>
|
||||||
| Open in new tab | Right-click workflow → **Open in New Tab** |
|
<td>Import a workflow</td>
|
||||||
|
<td>Click import button in sidebar → Select file</td>
|
||||||
|
<td><ActionImage src="/static/quick-reference/import-workflow.png" alt="Import workflow" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Multi-select workflows</td>
|
||||||
|
<td>`Mod+Click` or `Shift+Click` workflows in sidebar</td>
|
||||||
|
<td><ActionVideo src="/static/quick-reference/multiselect.mp4" alt="Multi-select workflows" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Open in new tab</td>
|
||||||
|
<td>Right-click workflow → **Open in New Tab**</td>
|
||||||
|
<td rowSpan={6}><ActionImage src="/static/quick-reference/workflow-context-menu.png" alt="Workflow context menu" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Rename a workflow</td>
|
||||||
|
<td>Right-click workflow → **Rename**</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Assign workflow color</td>
|
||||||
|
<td>Right-click workflow → **Change Color**</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Duplicate a workflow</td>
|
||||||
|
<td>Right-click workflow → **Duplicate**</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Export a workflow</td>
|
||||||
|
<td>Right-click workflow → **Export**</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Delete a workflow</td>
|
||||||
|
<td>Right-click workflow → **Delete**</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Rename a folder</td>
|
||||||
|
<td>Right-click folder → **Rename**</td>
|
||||||
|
<td rowSpan={6}><ActionImage src="/static/quick-reference/folder-context-menu.png" alt="Folder context menu" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Create workflow in folder</td>
|
||||||
|
<td>Right-click folder → **Create workflow**</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Create folder in folder</td>
|
||||||
|
<td>Right-click folder → **Create folder**</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Duplicate a folder</td>
|
||||||
|
<td>Right-click folder → **Duplicate**</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Export a folder</td>
|
||||||
|
<td>Right-click folder → **Export**</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Delete a folder</td>
|
||||||
|
<td>Right-click folder → **Delete**</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
## Blocks
|
## Blocks
|
||||||
|
|
||||||
| Action | How |
|
<table>
|
||||||
|--------|-----|
|
<thead>
|
||||||
| Add a block | Drag from Toolbar panel, or right-click canvas → **Add Block** |
|
<tr><th>Action</th><th>How</th><th>Preview</th></tr>
|
||||||
| Select a block | Click on the block |
|
</thead>
|
||||||
| Multi-select blocks | `Mod+Click` additional blocks, or right-drag to draw selection box |
|
<tbody>
|
||||||
| Move blocks | Drag selected block(s) to new position |
|
<tr>
|
||||||
| Copy blocks | `Mod+C` with blocks selected |
|
<td>Add a block</td>
|
||||||
| Paste blocks | `Mod+V` to paste copied blocks |
|
<td>Drag from Toolbar panel, or right-click canvas → **Add Block**</td>
|
||||||
| Duplicate blocks | Right-click → **Duplicate** |
|
<td><ActionVideo src="/static/quick-reference/add-block.mp4" alt="Add a block" /></td>
|
||||||
| Delete blocks | `Delete` or `Backspace` key, or right-click → **Delete** |
|
</tr>
|
||||||
| Rename a block | Click block name in header, or edit in the Editor panel |
|
<tr>
|
||||||
| Enable/Disable a block | Right-click → **Enable/Disable** |
|
<td>Multi-select blocks</td>
|
||||||
| Toggle handle orientation | Right-click → **Toggle Handles** |
|
<td>`Mod+Click` additional blocks, or shift-drag to draw selection box</td>
|
||||||
| Toggle trigger mode | Right-click trigger block → **Toggle Trigger Mode** |
|
<td><ActionVideo src="/static/quick-reference/multiselect-blocks.mp4" alt="Multi-select blocks" /></td>
|
||||||
| Configure a block | Select block → use Editor panel on right |
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Copy blocks</td>
|
||||||
|
<td>`Mod+C` with blocks selected</td>
|
||||||
|
<td rowSpan={2}><ActionVideo src="/static/quick-reference/copy-paste.mp4" alt="Copy and paste blocks" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Paste blocks</td>
|
||||||
|
<td>`Mod+V` to paste copied blocks</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Duplicate blocks</td>
|
||||||
|
<td>Right-click → **Duplicate**</td>
|
||||||
|
<td><ActionVideo src="/static/quick-reference/duplicate-block.mp4" alt="Duplicate blocks" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Delete blocks</td>
|
||||||
|
<td>`Delete` or `Backspace` key, or right-click → **Delete**</td>
|
||||||
|
<td><ActionImage src="/static/quick-reference/delete-block.png" alt="Delete block" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Rename a block</td>
|
||||||
|
<td>Click block name in header, or edit in the Editor panel</td>
|
||||||
|
<td><ActionVideo src="/static/quick-reference/rename-block.mp4" alt="Rename a block" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Enable/Disable a block</td>
|
||||||
|
<td>Right-click → **Enable/Disable**</td>
|
||||||
|
<td><ActionImage src="/static/quick-reference/disable-block.png" alt="Disable block" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Toggle handle orientation</td>
|
||||||
|
<td>Right-click → **Toggle Handles**</td>
|
||||||
|
<td><ActionVideo src="/static/quick-reference/toggle-handles.mp4" alt="Toggle handle orientation" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Configure a block</td>
|
||||||
|
<td>Select block → use Editor panel on right</td>
|
||||||
|
<td><ActionVideo src="/static/quick-reference/configure-block.mp4" alt="Configure a block" /></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
## Connections
|
## Connections
|
||||||
|
|
||||||
| Action | How |
|
<table>
|
||||||
|--------|-----|
|
<thead>
|
||||||
| Create a connection | Drag from output handle to input handle |
|
<tr><th>Action</th><th>How</th><th>Preview</th></tr>
|
||||||
| Delete a connection | Click edge to select → `Delete` key |
|
</thead>
|
||||||
| Use output in another block | Drag connection tag into input field |
|
<tbody>
|
||||||
|
<tr>
|
||||||
## Canvas Navigation
|
<td>Create a connection</td>
|
||||||
|
<td>Drag from output handle to input handle</td>
|
||||||
| Action | How |
|
<td><ActionVideo src="/static/quick-reference/connect-blocks.mp4" alt="Connect blocks" /></td>
|
||||||
|--------|-----|
|
</tr>
|
||||||
| Pan/move canvas | Left-drag on empty space, or scroll/trackpad |
|
<tr>
|
||||||
| Zoom in/out | Scroll wheel or pinch gesture |
|
<td>Delete a connection</td>
|
||||||
| Auto-layout | `Shift+L` |
|
<td>Click edge to select → `Delete` key</td>
|
||||||
| Draw selection box | Right-drag on empty canvas area |
|
<td><ActionVideo src="/static/quick-reference/delete-connection.mp4" alt="Delete connection" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Use output in another block</td>
|
||||||
|
<td>Drag connection tag into input field</td>
|
||||||
|
<td><ActionVideo src="/static/quick-reference/connection-tag.mp4" alt="Use connection tag" /></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
## Panels & Views
|
## Panels & Views
|
||||||
|
|
||||||
| Action | How |
|
<table>
|
||||||
|--------|-----|
|
<thead>
|
||||||
| Open Copilot tab | Press `C` or click Copilot tab |
|
<tr><th>Action</th><th>How</th><th>Preview</th></tr>
|
||||||
| Open Toolbar tab | Press `T` or click Toolbar tab |
|
</thead>
|
||||||
| Open Editor tab | Press `E` or click Editor tab |
|
<tbody>
|
||||||
| Search toolbar | `Mod+F` |
|
<tr>
|
||||||
| Toggle advanced mode | Click toggle button on input fields |
|
<td>Search toolbar</td>
|
||||||
| Resize panels | Drag panel edge |
|
<td>`Mod+F`</td>
|
||||||
| Collapse/expand sidebar | Click collapse button on sidebar |
|
<td><ActionVideo src="/static/quick-reference/search-toolbar.mp4" alt="Search toolbar" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Search everything</td>
|
||||||
|
<td>`Mod+K`</td>
|
||||||
|
<td><ActionImage src="/static/quick-reference/search-everything.png" alt="Search everything" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Toggle manual mode</td>
|
||||||
|
<td>Click toggle button to switch between manual and selector</td>
|
||||||
|
<td><ActionImage src="/static/quick-reference/toggle-manual-mode.png" alt="Toggle manual mode" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Collapse/expand sidebar</td>
|
||||||
|
<td>Click collapse button on sidebar</td>
|
||||||
|
<td><ActionVideo src="/static/quick-reference/collapse-sidebar.mp4" alt="Collapse sidebar" /></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
## Running & Testing
|
## Running & Testing
|
||||||
|
|
||||||
| Action | How |
|
<table>
|
||||||
|--------|-----|
|
<thead>
|
||||||
| Run workflow | Click Play button or `Mod+Enter` |
|
<tr><th>Action</th><th>How</th><th>Preview</th></tr>
|
||||||
| Stop workflow | Click Stop button or `Mod+Enter` while running |
|
</thead>
|
||||||
| Test with chat | Use Chat panel on the right side |
|
<tbody>
|
||||||
| Select output to view | Click dropdown in Chat panel → Select block output |
|
<tr>
|
||||||
| Clear chat history | Click clear button in Chat panel |
|
<td>Run workflow</td>
|
||||||
| View execution logs | Open terminal panel at bottom, or `Mod+L` |
|
<td>Click Run Workflow button or `Mod+Enter`</td>
|
||||||
| Filter logs by block | Click block filter in terminal |
|
<td><ActionImage src="/static/quick-reference/run-workflow.png" alt="Run workflow" /></td>
|
||||||
| Filter logs by status | Click status filter in terminal |
|
</tr>
|
||||||
| Search logs | Use search field in terminal |
|
<tr>
|
||||||
| Copy log entry | Right-click log entry → **Copy** |
|
<td>Stop workflow</td>
|
||||||
| Clear terminal | `Mod+D` |
|
<td>Click Stop button or `Mod+Enter` while running</td>
|
||||||
|
<td><ActionImage src="/static/quick-reference/stop-workflow.png" alt="Stop workflow" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Test with chat</td>
|
||||||
|
<td>Use Chat panel on the right side</td>
|
||||||
|
<td><ActionImage src="/static/quick-reference/test-chat.png" alt="Test with chat" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Select output to view</td>
|
||||||
|
<td>Click dropdown in Chat panel → Select block output</td>
|
||||||
|
<td><ActionImage src="/static/quick-reference/output-select.png" alt="Select output to view" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Clear chat history</td>
|
||||||
|
<td>Click clear button in Chat panel</td>
|
||||||
|
<td><ActionImage src="/static/quick-reference/clear-chat.png" alt="Clear chat history" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>View execution logs</td>
|
||||||
|
<td>Open terminal panel at bottom, or `Mod+L`</td>
|
||||||
|
<td><ActionImage src="/static/quick-reference/terminal.png" alt="Execution logs terminal" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Filter logs by block or status</td>
|
||||||
|
<td>Click block filter in terminal or right-click log entry → **Filter by Block** or **Filter by Status**</td>
|
||||||
|
<td><ActionImage src="/static/quick-reference/filter-block.png" alt="Filter logs by block" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Search logs</td>
|
||||||
|
<td>Use search field in terminal or right-click log entry → **Search**</td>
|
||||||
|
<td><ActionImage src="/static/quick-reference/terminal-search.png" alt="Search logs" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Copy log entry</td>
|
||||||
|
<td>Clipboard Icon or Right-click log entry → **Copy**</td>
|
||||||
|
<td><ActionImage src="/static/quick-reference/copy-log.png" alt="Copy log entry" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Clear terminal</td>
|
||||||
|
<td>Trash icon or `Mod+D`</td>
|
||||||
|
<td><ActionImage src="/static/quick-reference/clear-terminal.png" alt="Clear terminal" /></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
## Deployment
|
## Deployment
|
||||||
|
|
||||||
| Action | How |
|
<table>
|
||||||
|--------|-----|
|
<thead>
|
||||||
| Deploy a workflow | Click **Deploy** button in Deploy tab |
|
<tr><th>Action</th><th>How</th><th>Preview</th></tr>
|
||||||
| Update deployment | Click **Update** when changes are detected |
|
</thead>
|
||||||
| View deployment status | Check status indicator (Live/Update/Deploy) in Deploy tab |
|
<tbody>
|
||||||
| Revert deployment | Access previous versions in Deploy tab |
|
<tr>
|
||||||
| Copy webhook URL | Deploy tab → Copy webhook URL |
|
<td>Deploy a workflow</td>
|
||||||
| Copy API endpoint | Deploy tab → Copy API endpoint URL |
|
<td>Click **Deploy** button in panel</td>
|
||||||
| Set up a schedule | Add Schedule trigger block → Configure interval |
|
<td><ActionImage src="/static/quick-reference/deploy.png" alt="Deploy workflow" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Update deployment</td>
|
||||||
|
<td>Click **Update** when changes are detected</td>
|
||||||
|
<td><ActionImage src="/static/quick-reference/update-deployment.png" alt="Update deployment" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>View deployment status</td>
|
||||||
|
<td>Check status indicator (Live/Update/Deploy) in Deploy tab</td>
|
||||||
|
<td><ActionImage src="/static/quick-reference/view-deployment.png" alt="View deployment status" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Revert deployment</td>
|
||||||
|
<td>Access previous versions in Deploy tab → **Promote to live**</td>
|
||||||
|
<td><ActionImage src="/static/quick-reference/promote-deployment.png" alt="Promote deployment to live" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Copy API endpoint</td>
|
||||||
|
<td>Deploy tab → Copy API endpoint URL</td>
|
||||||
|
<td><ActionImage src="/static/quick-reference/copy-api.png" alt="Copy API endpoint" /></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
## Variables
|
## Variables
|
||||||
|
|
||||||
| Action | How |
|
<table>
|
||||||
|--------|-----|
|
<thead>
|
||||||
| Add workflow variable | Variables tab → **Add Variable** |
|
<tr><th>Action</th><th>How</th><th>Preview</th></tr>
|
||||||
| Edit workflow variable | Variables tab → Click variable to edit |
|
</thead>
|
||||||
| Delete workflow variable | Variables tab → Click delete icon on variable |
|
<tbody>
|
||||||
| Add environment variable | Settings → **Environment Variables** → **Add** |
|
<tr>
|
||||||
| Reference a variable | Use `{{variableName}}` syntax in block inputs |
|
<td>Add / Edit / Delete workflow variable</td>
|
||||||
|
<td>Panel -> Variables -> **Add Variable**, click to edit, or delete icon</td>
|
||||||
## Credentials
|
<td><ActionImage src="/static/quick-reference/variables.png" alt="Variables panel" /></td>
|
||||||
|
</tr>
|
||||||
| Action | How |
|
<tr>
|
||||||
|--------|-----|
|
<td>Add environment variable</td>
|
||||||
| Add API key | Block credential field → **Add Credential** → Enter API key |
|
<td>Settings → **Environment Variables** → **Add**</td>
|
||||||
| Connect OAuth account | Block credential field → **Connect** → Authorize with provider |
|
<td><ActionImage src="/static/quick-reference/add-env-variable.png" alt="Add environment variable" /></td>
|
||||||
| Manage credentials | Settings → **Credentials** |
|
</tr>
|
||||||
| Remove credential | Settings → **Credentials** → Delete credential |
|
<tr>
|
||||||
|
<td>Reference a workflow variable</td>
|
||||||
|
<td>Use `<blockName.itemName>` syntax in block inputs</td>
|
||||||
|
<td><ActionImage src="/static/quick-reference/variable-reference.png" alt="Reference workflow variable" /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Reference an environment variable</td>
|
||||||
|
<td>Use `{{ENV_VAR}}` syntax in block inputs</td>
|
||||||
|
<td><ActionImage src="/static/quick-reference/env-variable-reference.png" alt="Reference environment variable" /></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|||||||
BIN
apps/docs/public/static/quick-reference/add-env-variable.png
Normal file
|
After Width: | Height: | Size: 104 KiB |
BIN
apps/docs/public/static/quick-reference/clear-chat.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
apps/docs/public/static/quick-reference/clear-terminal.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
apps/docs/public/static/quick-reference/copy-api.png
Normal file
|
After Width: | Height: | Size: 114 KiB |
BIN
apps/docs/public/static/quick-reference/copy-log.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
apps/docs/public/static/quick-reference/create-workflow.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
apps/docs/public/static/quick-reference/delete-block.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
apps/docs/public/static/quick-reference/deploy.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
apps/docs/public/static/quick-reference/disable-block.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 36 KiB |
BIN
apps/docs/public/static/quick-reference/filter-block.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
apps/docs/public/static/quick-reference/folder-context-menu.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
apps/docs/public/static/quick-reference/import-workflow.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
apps/docs/public/static/quick-reference/output-select.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
apps/docs/public/static/quick-reference/promote-deployment.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
apps/docs/public/static/quick-reference/rename-workflow.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
apps/docs/public/static/quick-reference/run-workflow.png
Normal file
|
After Width: | Height: | Size: 5.9 KiB |
BIN
apps/docs/public/static/quick-reference/search-everything.png
Normal file
|
After Width: | Height: | Size: 78 KiB |
BIN
apps/docs/public/static/quick-reference/stop-workflow.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
apps/docs/public/static/quick-reference/terminal-search.png
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
apps/docs/public/static/quick-reference/terminal.png
Normal file
|
After Width: | Height: | Size: 146 KiB |
BIN
apps/docs/public/static/quick-reference/test-chat.png
Normal file
|
After Width: | Height: | Size: 7.1 KiB |
BIN
apps/docs/public/static/quick-reference/toggle-manual-mode.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
apps/docs/public/static/quick-reference/update-deployment.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
apps/docs/public/static/quick-reference/variable-reference.png
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
apps/docs/public/static/quick-reference/variables.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
apps/docs/public/static/quick-reference/view-deployment.png
Normal file
|
After Width: | Height: | Size: 90 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 103 KiB |
@@ -581,6 +581,18 @@ export const GmailV2Block: BlockConfig<GmailToolResponse> = {
|
|||||||
results: { type: 'json', description: 'Search/read summary results' },
|
results: { type: 'json', description: 'Search/read summary results' },
|
||||||
attachments: { type: 'json', description: 'Downloaded attachments (if enabled)' },
|
attachments: { type: 'json', description: 'Downloaded attachments (if enabled)' },
|
||||||
|
|
||||||
|
// Draft-specific outputs
|
||||||
|
draftId: {
|
||||||
|
type: 'string',
|
||||||
|
description: 'Draft ID',
|
||||||
|
condition: { field: 'operation', value: 'draft_gmail' },
|
||||||
|
},
|
||||||
|
messageId: {
|
||||||
|
type: 'string',
|
||||||
|
description: 'Gmail message ID for the draft',
|
||||||
|
condition: { field: 'operation', value: 'draft_gmail' },
|
||||||
|
},
|
||||||
|
|
||||||
// Trigger outputs (unchanged)
|
// Trigger outputs (unchanged)
|
||||||
email_id: { type: 'string', description: 'Gmail message ID' },
|
email_id: { type: 'string', description: 'Gmail message ID' },
|
||||||
thread_id: { type: 'string', description: 'Gmail thread ID' },
|
thread_id: { type: 'string', description: 'Gmail thread ID' },
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import { getBlockOutputs } from '@/lib/workflows/blocks/block-outputs'
|
|
||||||
import { normalizeName } from '@/executor/constants'
|
import { normalizeName } from '@/executor/constants'
|
||||||
import type { ExecutionContext } from '@/executor/types'
|
import type { ExecutionContext } from '@/executor/types'
|
||||||
import type { OutputSchema } from '@/executor/utils/block-reference'
|
import type { OutputSchema } from '@/executor/utils/block-reference'
|
||||||
|
import type { SerializedBlock } from '@/serializer/types'
|
||||||
|
import type { ToolConfig } from '@/tools/types'
|
||||||
|
import { getTool } from '@/tools/utils'
|
||||||
|
|
||||||
export interface BlockDataCollection {
|
export interface BlockDataCollection {
|
||||||
blockData: Record<string, unknown>
|
blockData: Record<string, unknown>
|
||||||
@@ -9,6 +11,32 @@ export interface BlockDataCollection {
|
|||||||
blockOutputSchemas: Record<string, OutputSchema>
|
blockOutputSchemas: Record<string, OutputSchema>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getBlockSchema(
|
||||||
|
block: SerializedBlock,
|
||||||
|
toolConfig?: ToolConfig
|
||||||
|
): OutputSchema | undefined {
|
||||||
|
const isTrigger =
|
||||||
|
block.metadata?.category === 'triggers' ||
|
||||||
|
(block.config?.params as Record<string, unknown> | undefined)?.triggerMode === true
|
||||||
|
|
||||||
|
// Triggers use saved outputs (defines the trigger payload schema)
|
||||||
|
if (isTrigger && block.outputs && Object.keys(block.outputs).length > 0) {
|
||||||
|
return block.outputs as OutputSchema
|
||||||
|
}
|
||||||
|
|
||||||
|
// When a tool is selected, tool outputs are the source of truth
|
||||||
|
if (toolConfig?.outputs && Object.keys(toolConfig.outputs).length > 0) {
|
||||||
|
return toolConfig.outputs as OutputSchema
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback to saved outputs for blocks without tools
|
||||||
|
if (block.outputs && Object.keys(block.outputs).length > 0) {
|
||||||
|
return block.outputs as OutputSchema
|
||||||
|
}
|
||||||
|
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
|
||||||
export function collectBlockData(ctx: ExecutionContext): BlockDataCollection {
|
export function collectBlockData(ctx: ExecutionContext): BlockDataCollection {
|
||||||
const blockData: Record<string, unknown> = {}
|
const blockData: Record<string, unknown> = {}
|
||||||
const blockNameMapping: Record<string, string> = {}
|
const blockNameMapping: Record<string, string> = {}
|
||||||
@@ -18,24 +46,21 @@ export function collectBlockData(ctx: ExecutionContext): BlockDataCollection {
|
|||||||
if (state.output !== undefined) {
|
if (state.output !== undefined) {
|
||||||
blockData[id] = state.output
|
blockData[id] = state.output
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const workflowBlock = ctx.workflow?.blocks?.find((b) => b.id === id)
|
const workflowBlocks = ctx.workflow?.blocks ?? []
|
||||||
if (!workflowBlock) continue
|
for (const block of workflowBlocks) {
|
||||||
|
const id = block.id
|
||||||
|
|
||||||
if (workflowBlock.metadata?.name) {
|
if (block.metadata?.name) {
|
||||||
blockNameMapping[normalizeName(workflowBlock.metadata.name)] = id
|
blockNameMapping[normalizeName(block.metadata.name)] = id
|
||||||
}
|
}
|
||||||
|
|
||||||
const blockType = workflowBlock.metadata?.id
|
const toolId = block.config?.tool
|
||||||
if (blockType) {
|
const toolConfig = toolId ? getTool(toolId) : undefined
|
||||||
const params = workflowBlock.config?.params as Record<string, unknown> | undefined
|
const schema = getBlockSchema(block, toolConfig)
|
||||||
const subBlocks = params
|
if (schema && Object.keys(schema).length > 0) {
|
||||||
? Object.fromEntries(Object.entries(params).map(([k, v]) => [k, { value: v }]))
|
blockOutputSchemas[id] = schema
|
||||||
: undefined
|
|
||||||
const schema = getBlockOutputs(blockType, subBlocks)
|
|
||||||
if (schema && Object.keys(schema).length > 0) {
|
|
||||||
blockOutputSchemas[id] = schema
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -378,8 +378,30 @@ function buildManualTriggerOutput(
|
|||||||
return mergeFilesIntoOutput(output, workflowInput)
|
return mergeFilesIntoOutput(output, workflowInput)
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildIntegrationTriggerOutput(workflowInput: unknown): NormalizedBlockOutput {
|
function buildIntegrationTriggerOutput(
|
||||||
return isPlainObject(workflowInput) ? (workflowInput as NormalizedBlockOutput) : {}
|
workflowInput: unknown,
|
||||||
|
structuredInput: Record<string, unknown>,
|
||||||
|
hasStructured: boolean
|
||||||
|
): NormalizedBlockOutput {
|
||||||
|
const output: NormalizedBlockOutput = {}
|
||||||
|
|
||||||
|
if (hasStructured) {
|
||||||
|
for (const [key, value] of Object.entries(structuredInput)) {
|
||||||
|
output[key] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isPlainObject(workflowInput)) {
|
||||||
|
for (const [key, value] of Object.entries(workflowInput)) {
|
||||||
|
if (value !== undefined && value !== null) {
|
||||||
|
output[key] = value
|
||||||
|
} else if (!Object.hasOwn(output, key)) {
|
||||||
|
output[key] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return mergeFilesIntoOutput(output, workflowInput)
|
||||||
}
|
}
|
||||||
|
|
||||||
function extractSubBlocks(block: SerializedBlock): Record<string, unknown> | undefined {
|
function extractSubBlocks(block: SerializedBlock): Record<string, unknown> | undefined {
|
||||||
@@ -428,7 +450,7 @@ export function buildStartBlockOutput(options: StartBlockOutputOptions): Normali
|
|||||||
return buildManualTriggerOutput(finalInput, workflowInput)
|
return buildManualTriggerOutput(finalInput, workflowInput)
|
||||||
|
|
||||||
case StartBlockPath.EXTERNAL_TRIGGER:
|
case StartBlockPath.EXTERNAL_TRIGGER:
|
||||||
return buildIntegrationTriggerOutput(workflowInput)
|
return buildIntegrationTriggerOutput(workflowInput, structuredInput, hasStructured)
|
||||||
|
|
||||||
case StartBlockPath.LEGACY_STARTER:
|
case StartBlockPath.LEGACY_STARTER:
|
||||||
return buildLegacyStarterOutput(
|
return buildLegacyStarterOutput(
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import { getBlockOutputs } from '@/lib/workflows/blocks/block-outputs'
|
|
||||||
import {
|
import {
|
||||||
isReference,
|
isReference,
|
||||||
normalizeName,
|
normalizeName,
|
||||||
parseReferencePath,
|
parseReferencePath,
|
||||||
SPECIAL_REFERENCE_PREFIXES,
|
SPECIAL_REFERENCE_PREFIXES,
|
||||||
} from '@/executor/constants'
|
} from '@/executor/constants'
|
||||||
|
import { getBlockSchema } from '@/executor/utils/block-data'
|
||||||
import {
|
import {
|
||||||
InvalidFieldError,
|
InvalidFieldError,
|
||||||
type OutputSchema,
|
type OutputSchema,
|
||||||
@@ -67,15 +67,9 @@ export class BlockResolver implements Resolver {
|
|||||||
blockData[blockId] = output
|
blockData[blockId] = output
|
||||||
}
|
}
|
||||||
|
|
||||||
const blockType = block.metadata?.id
|
|
||||||
const params = block.config?.params as Record<string, unknown> | undefined
|
|
||||||
const subBlocks = params
|
|
||||||
? Object.fromEntries(Object.entries(params).map(([k, v]) => [k, { value: v }]))
|
|
||||||
: undefined
|
|
||||||
const toolId = block.config?.tool
|
const toolId = block.config?.tool
|
||||||
const toolConfig = toolId ? getTool(toolId) : undefined
|
const toolConfig = toolId ? getTool(toolId) : undefined
|
||||||
const outputSchema =
|
const outputSchema = getBlockSchema(block, toolConfig)
|
||||||
toolConfig?.outputs ?? (blockType ? getBlockOutputs(blockType, subBlocks) : block.outputs)
|
|
||||||
|
|
||||||
if (outputSchema && Object.keys(outputSchema).length > 0) {
|
if (outputSchema && Object.keys(outputSchema).length > 0) {
|
||||||
blockOutputSchemas[blockId] = outputSchema
|
blockOutputSchemas[blockId] = outputSchema
|
||||||
|
|||||||
@@ -618,13 +618,6 @@ export function getToolOutputs(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates output paths for a tool-based block.
|
|
||||||
*
|
|
||||||
* @param blockConfig - The block configuration containing tools config
|
|
||||||
* @param subBlocks - SubBlock values for tool selection and condition evaluation
|
|
||||||
* @returns Array of output paths for the tool, or empty array on error
|
|
||||||
*/
|
|
||||||
export function getToolOutputPaths(
|
export function getToolOutputPaths(
|
||||||
blockConfig: BlockConfig,
|
blockConfig: BlockConfig,
|
||||||
subBlocks?: Record<string, SubBlockWithValue>
|
subBlocks?: Record<string, SubBlockWithValue>
|
||||||
@@ -634,12 +627,22 @@ export function getToolOutputPaths(
|
|||||||
if (!outputs || Object.keys(outputs).length === 0) return []
|
if (!outputs || Object.keys(outputs).length === 0) return []
|
||||||
|
|
||||||
if (subBlocks && blockConfig.outputs) {
|
if (subBlocks && blockConfig.outputs) {
|
||||||
const filteredBlockOutputs = filterOutputsByCondition(blockConfig.outputs, subBlocks)
|
|
||||||
const allowedKeys = new Set(Object.keys(filteredBlockOutputs))
|
|
||||||
|
|
||||||
const filteredOutputs: Record<string, any> = {}
|
const filteredOutputs: Record<string, any> = {}
|
||||||
|
|
||||||
for (const [key, value] of Object.entries(outputs)) {
|
for (const [key, value] of Object.entries(outputs)) {
|
||||||
if (allowedKeys.has(key)) {
|
const blockOutput = blockConfig.outputs[key]
|
||||||
|
|
||||||
|
if (!blockOutput || typeof blockOutput !== 'object') {
|
||||||
|
filteredOutputs[key] = value
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
const condition = 'condition' in blockOutput ? blockOutput.condition : undefined
|
||||||
|
if (condition) {
|
||||||
|
if (evaluateOutputCondition(condition, subBlocks)) {
|
||||||
|
filteredOutputs[key] = value
|
||||||
|
}
|
||||||
|
} else {
|
||||||
filteredOutputs[key] = value
|
filteredOutputs[key] = value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||