@motiadev/workbench 0.13.0-beta.162-439402 → 0.13.0-beta.162-158257

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/index.js.map +1 -1
  2. package/dist/middleware.js +1 -3
  3. package/dist/middleware.js.map +1 -1
  4. package/dist/src/src/components/flow/flow-page.tsx +3 -3
  5. package/dist/src/src/components/flow/flow-tab-menu-item.tsx +3 -3
  6. package/dist/src/src/components/flow/flow-view.tsx +1 -1
  7. package/dist/src/src/components/flow/hooks/use-get-flow-state.tsx +1 -1
  8. package/dist/src/src/components/flow/hooks/use-save-workflow-config.ts +1 -1
  9. package/dist/src/src/components/flow/node-organizer.tsx +1 -1
  10. package/dist/src/src/components/flow/nodes/api-flow-node.tsx +2 -2
  11. package/dist/src/src/components/flow/nodes/cron-flow-node.tsx +2 -2
  12. package/dist/src/src/components/flow/nodes/event-flow-node.tsx +2 -2
  13. package/dist/src/src/components/flow/nodes/noop-flow-node.tsx +2 -2
  14. package/dist/src/src/components/header/deploy-button.tsx +1 -1
  15. package/dist/src/src/components/header/header.tsx +5 -3
  16. package/dist/src/src/components/root-motia.tsx +1 -1
  17. package/dist/src/src/components/tutorial/tutorial-button.tsx +1 -1
  18. package/dist/src/src/components/tutorial/tutorial.tsx +1 -1
  19. package/dist/src/src/hooks/use-fetch-flows.ts +2 -2
  20. package/dist/src/src/lib/plugins.tsx +1 -1
  21. package/dist/src/src/lib/utils.ts +1 -1
  22. package/dist/src/src/publicComponents/base-node/base-node.tsx +2 -2
  23. package/dist/src/src/publicComponents/base-node/code-display.tsx +1 -1
  24. package/dist/src/src/publicComponents/base-node/emits.tsx +1 -1
  25. package/dist/src/src/publicComponents/base-node/feature-card.tsx +1 -1
  26. package/dist/src/src/publicComponents/base-node/language-indicator.tsx +1 -1
  27. package/dist/src/src/publicComponents/base-node/node-sidebar.tsx +1 -1
  28. package/dist/src/src/stores/use-tabs-store.ts +1 -1
  29. package/eslint.config.cjs +22 -0
  30. package/package.json +4 -4
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["workbenchXPath","sidebarContainer","closePanelButton","bottomPanel","flows","dropdownFlow","flowId","feature","featureId","previewButton","stepId","node","endpoints","endpointsList","endpoint","method","path","callPanel","specButton","bodyTab","headersTab","paramsTab","callTab","response","playButton","tracing","trace","index","details","timeline","logs","container","searchContainer","traceColumn","row","states","links","Position","useReactFlow","useUpdateNodeInternals","BaseNodeProps","useHandlePositions","data","$","_c","reactFlow","updateNodeInternals","sourcePosition","nodeConfig","sourceHandlePosition","Bottom","Right","targetPosition","targetHandlePosition","Top","Left","t0","position","updateNode","id","updateSourcePosition","t1","position_0","updateTargetPosition","t2","newPosition","toggleTargetPosition","t3","newPosition_0","toggleSourcePosition","t4","HandleProps","Position","Handle","RFHandle","clsx","React","HTMLAttributes","Props","Omit","HTMLDivElement","isHidden","onTogglePosition","BaseHandle","FC","props","$","_c","position","rest","isHorizontal","Left","Right","t0","Top","t1","Bottom","t2","t3","t4","t5","t6","t7","Symbol","for","background","t8","t9","cn","cva","VariantProps","CalendarClock","CircleOff","Link2","Waypoints","React","PropsWithChildren","baseIcon","variants","variant","event","api","noop","cron","NodeIcon","t0","$","_c","t1","Symbol","for","t2","Props","text","className","NodeHeader","FC","children","t3","t4","t5","t6","t7","cn","React","Feature","Props","feature","highlighted","onClick","onHover","FeatureCard","FC","t0","$","_c","t1","id","t2","t3","t4","title","t5","description","t6","link","t7","cn","FC","EventNodeData","Props","language","className","size","showLabel","LanguageIndicator","t0","$","_c","t1","t2","undefined","t3","language_0","renderIcon","t4","t5","t6","t7","useThemeStore","React","useRef","useState","Prism","SyntaxHighlighter","oneDark","oneLight","Feature","FeatureCard","LanguageIndicator","CodeDisplayProps","code","language","features","codeTagProps","style","fontFamily","fontSize","customStyle","margin","borderRadius","padding","isHighlighted","lines","lineNumber","some","line","start","end","split","map","num","parseInt","undefined","getFirstLineNumber","CodeDisplay","FC","t0","$","_c","theme","_temp","themeStyle","t1","Symbol","for","highlightedLines","setHighlightedLines","selectedFeature","setSelectedFeature","ref","handleFeatureClick","feature","current","querySelector","scrollIntoView","behavior","block","t2","t3","t4","t5","t6","t7","length","feature_0","index","t8","lineNumber_0","borderLeft","backgroundColor","t9","t10","t11","t12","state","Sidebar","X","React","Feature","CodeDisplay","NodeSidebarProps","content","features","title","subtitle","variant","language","isOpen","onClose","NodeSidebar","FC","t0","$","_c","t1","Symbol","for","t2","icon","onClick","label","t3","t4","Button","cn","ScanSearch","React","PropsWithChildren","useCallback","useEffect","useState","useHandlePositions","Feature","BaseNodeProps","BaseHandle","NodeHeader","NodeSidebar","Props","title","subtitle","variant","language","className","disableSourceHandle","disableTargetHandle","data","BaseNode","FC","t0","$","_c","children","isOpen","setIsOpen","sourcePosition","targetPosition","toggleTargetPosition","toggleSourcePosition","content","setContent","t1","Symbol","for","features","setFeatures","t2","id","response","fetch","responseData","json","fetchContent","t3","t4","t5","t6","toLowerCase","replace","t7","t8","t9","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","t20","t21","PropsWithChildren","BaseNode","ApiNodeProps","Props","ApiNode","t0","$","_c","data","children","t1","emits","length","virtualEmits","t2","subscribes","virtualSubscribes","t3","webhookUrl","t4","name","language","description","React","PropsWithChildren","BaseNode","EventNodeProps","EventNode","FC","t0","$","_c","data","children","t1","emits","length","virtualEmits","t2","subscribes","virtualSubscribes","t3","name","description","language","React","PropsWithChildren","BaseNode","NoopNodeProps","NoopNode","FC","t0","$","_c","data","children","t1","virtualEmits","length","t2","subscribes","t3","name","description"],"sources":["../src/components/tutorial/engine/workbench-xpath.ts","../src/hooks/use-update-handle-positions.ts","../src/publicComponents/base-node/base-handle.tsx","../src/publicComponents/base-node/node-header.tsx","../src/publicComponents/base-node/feature-card.tsx","../src/publicComponents/base-node/language-indicator.tsx","../src/publicComponents/base-node/code-display.tsx","../src/publicComponents/base-node/node-sidebar.tsx","../src/publicComponents/base-node/base-node.tsx","../src/publicComponents/api-node.tsx","../src/publicComponents/event-node.tsx","../src/publicComponents/noop-node.tsx"],"sourcesContent":["export const workbenchXPath = {\n sidebarContainer: '//div[@data-testid=\"sidebar-panel\"]',\n closePanelButton: '//div[@id=\"app-sidebar-container\"]//button[@data-testid=\"close-panel\"]',\n bottomPanel: '//div[@id=\"bottom-panel\"]',\n\n flows: {\n dropdownFlow: (flowId: string) => `//div[@data-testid=\"dropdown-${flowId}\"]`,\n feature: (featureId: string) => `//div[@data-feature-id=\"${featureId}\"]`,\n previewButton: (stepId: string) => `//button[@data-testid=\"open-code-preview-button-${stepId}\"]`,\n node: (stepId: string) => `//div[@data-testid=\"node-${stepId}\"]`,\n },\n\n endpoints: {\n endpointsList: '//div[@data-testid=\"endpoints-list\"]',\n endpoint: (method: string, path: string) => `//div[@data-testid=\"endpoint-${method}-${path}\"]`,\n callPanel: '//div[@data-testid=\"endpoint-details-panel\"]',\n specButton: '//button[@data-testid=\"endpoint-spec-button\"]',\n\n bodyTab: '//button[@data-testid=\"endpoint-body-tab\"]',\n headersTab: '//button[@data-testid=\"endpoint-headers-tab\"]',\n paramsTab: '//button[@data-testid=\"endpoint-params-tab\"]',\n\n callTab: '//button[@data-testid=\"endpoint-body-tab\"]', // deprecated\n response: '//div[@data-testid=\"endpoint-response-container\"]',\n playButton: '//button[@data-testid=\"endpoint-play-button\"]',\n },\n\n tracing: {\n trace: (index: number) => `(//button[contains(@class, 'motia-trace-group')])[${index}]`,\n details: '//div[@data-testid=\"trace-details\"]',\n timeline: (index: number) => `(//div[@data-testid=\"trace-timeline-item\"])[${index}]`,\n },\n\n logs: {\n container: '//div[@data-testid=\"logs-container\"]',\n searchContainer: '//div[@data-testid=\"logs-search-container\"]',\n traceColumn: (index: number) => `(//td[starts-with(@data-testid, 'trace')])[${index}]`,\n row: '//div[@data-testid=\"log-row\"]',\n },\n\n states: {\n container: '//div[@data-testid=\"states-container\"]',\n row: (index: number) => `(//tr[starts-with(@data-testid, 'item-')])[${index}]`,\n },\n\n links: {\n flows: '//div[@data-testid=\"flows-dropdown-trigger\"]',\n endpoints: '//button[@data-testid=\"endpoints-link\"]',\n tracing: '//button[@data-testid=\"tracing-link\"]',\n logs: '//button[@data-testid=\"logs-link\"]',\n states: '//button[@data-testid=\"states-link\"]',\n },\n}\n","import { Position, useReactFlow, useUpdateNodeInternals } from '@xyflow/react'\nimport type { BaseNodeProps } from '../publicComponents/node-props'\n\nexport const useHandlePositions = (data: BaseNodeProps) => {\n const reactFlow = useReactFlow()\n const updateNodeInternals = useUpdateNodeInternals()\n const sourcePosition = data.nodeConfig?.sourceHandlePosition === 'bottom' ? Position.Bottom : Position.Right\n const targetPosition = data.nodeConfig?.targetHandlePosition === 'top' ? Position.Top : Position.Left\n\n const updateSourcePosition = (position: 'bottom' | 'right') => {\n reactFlow.updateNode(data.id, {\n data: { ...data, nodeConfig: { ...data.nodeConfig, sourceHandlePosition: position } },\n })\n updateNodeInternals(data.id)\n }\n\n const updateTargetPosition = (position: 'top' | 'left') => {\n reactFlow.updateNode(data.id, {\n data: { ...data, nodeConfig: { ...data.nodeConfig, targetHandlePosition: position } },\n })\n updateNodeInternals(data.id)\n }\n\n const toggleTargetPosition = () => {\n const newPosition = targetPosition === Position.Top ? Position.Left : Position.Top\n updateTargetPosition(newPosition)\n }\n\n const toggleSourcePosition = () => {\n const newPosition = sourcePosition === Position.Bottom ? Position.Right : Position.Bottom\n updateSourcePosition(newPosition)\n }\n\n return {\n sourcePosition,\n targetPosition,\n updateSourcePosition,\n updateTargetPosition,\n toggleTargetPosition,\n toggleSourcePosition,\n }\n}\n","import { type HandleProps, Position, Handle as RFHandle } from '@xyflow/react'\nimport clsx from 'clsx'\nimport type React from 'react'\nimport type { HTMLAttributes } from 'react'\n\ntype Props = HandleProps &\n Omit<HTMLAttributes<HTMLDivElement>, 'id'> & {\n isHidden?: boolean\n onTogglePosition?: () => void\n }\n\nexport const BaseHandle: React.FC<Props> = (props) => {\n const { isHidden, position, onTogglePosition, ...rest } = props\n const isHorizontal = position === Position.Left || position === Position.Right\n\n return (\n <div\n className={clsx(\n 'absolute w-[6px] h-[6px]',\n position === Position.Top && '-top-[4px]',\n position === Position.Bottom && '-bottom-[4px]',\n position === Position.Left && '-left-[4px]',\n position === Position.Right && '-right-[4px]',\n isHorizontal ? 'top-1/2 -mt-[2px]' : 'left-1/2 -ml-[2px]',\n isHidden && 'hidden',\n )}\n onClick={onTogglePosition}\n >\n <RFHandle\n {...rest}\n position={position}\n style={{ background: 'rgb(30,118,231)' }}\n className=\"\n bg-white/50\n !static\n !w-[6px]\n !h-[6px]\n !min-w-[6px]\n !min-h-[6px]\n !p-0\n !border-none\n !transform-none\n !rounded-full\n !outline-none\n !shadow-none\n \"\n />\n </div>\n )\n}\n","import { cn } from '@motiadev/ui'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { CalendarClock, CircleOff, Link2, Waypoints } from 'lucide-react'\nimport type React from 'react'\nimport type { PropsWithChildren } from 'react'\n\nconst baseIcon = cva('rounded-md p-2', {\n variants: {\n variant: {\n event: 'bg-[rgba(30,118,231,0.2)] text-[rgb(30,118,231)]',\n api: 'dark:bg-[rgba(192,255,17,0.2)] dark:text-[rgb(192,255,17)] bg-[rgb(231,255,166)] text-[rgb(94,125,11)]',\n noop: 'bg-[rgba(239,18,229,0.2)] text-[rgb(239,18,229)]',\n cron: 'bg-[rgba(241,105,15,0.2)] text-[rgb(241,105,15)]',\n },\n },\n})\n\nconst NodeIcon = ({ variant }: { variant: VariantProps<typeof baseIcon>['variant'] }) => {\n if (variant === 'cron') {\n return <CalendarClock className=\"w-5 h-5\" />\n } else if (variant === 'api') {\n return <Link2 className=\"w-5 h-5\" />\n } else if (variant === 'noop') {\n return <CircleOff className=\"w-5 h-5\" />\n } else if (variant === 'event') {\n return <Waypoints className=\"w-5 h-5\" />\n }\n return <div className={cn(baseIcon({ variant }))}>Icon</div>\n}\n\ntype Props = PropsWithChildren<{\n text: string\n variant: VariantProps<typeof baseIcon>['variant']\n className?: string\n}>\n\nexport const NodeHeader: React.FC<Props> = ({ text, variant, children, className }) => (\n <div className={cn('flex items-center gap-2 p-2', className)}>\n <div className={baseIcon({ variant })}>\n <NodeIcon variant={variant} />\n </div>\n <div className=\"flex flex-1 justify-between items-start gap-4\">\n <div className=\"flex flex-col\">\n <div className=\"text-sm font-semibold leading-[1.25] tracking-[-0.25px]\">{text}</div>\n </div>\n {children}\n </div>\n </div>\n)\n","import { cn } from '@motiadev/ui'\nimport type React from 'react'\nimport type { Feature } from '@/types/file'\n\ntype Props = {\n feature: Feature\n highlighted: boolean\n onClick: () => void\n onHover: () => void\n}\n\nexport const FeatureCard: React.FC<Props> = ({ feature, highlighted, onClick, onHover }) => {\n return (\n <div\n data-feature-id={feature.id}\n className={cn(\n 'p-4 rounded-lg bg-card shadow-sm cursor-pointer hover:bg-card/50 border-2 border-transparent',\n highlighted && 'border-2 border-accent-1000 bg-accent-100',\n )}\n onClick={onClick}\n onMouseEnter={onHover}\n >\n <div className=\"text-md font-semibold text-foreground leading-tight whitespace-nowrap mb-2\">{feature.title}</div>\n <div className=\"text-sm font-medium text-muted-foreground leading-tight\">{feature.description}</div>\n {feature.link && (\n <div className=\"text-sm font-medium text-muted-foreground leading-tight\">\n <a href={feature.link}>Learn more</a>\n </div>\n )}\n </div>\n )\n}\n","import { cn } from '@motiadev/ui'\nimport type { FC } from 'react'\nimport type { EventNodeData } from '@/types/flow'\n\ntype Props = { language: EventNodeData['language']; className?: string; size?: number; showLabel?: boolean }\n\nexport const LanguageIndicator: FC<Props> = ({ language, className, size = 18, showLabel = false }) => {\n const renderIcon = (language?: string) => {\n if (language === 'typescript') {\n return (\n <>\n {showLabel ? <>TypeScript</> : null}\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M3 3V21H21V3H3ZM9 12H13.5V13.5H12V19.5H10.5V13.5H9V12ZM16.5 12H19.5V13.5H16.5V15H18C18.3975 15.0012 18.7783 15.1596 19.0593 15.4407C19.3404 15.7217 19.4988 16.1025 19.5 16.5V18C19.4988 18.3975 19.3404 18.7783 19.0593 19.0593C18.7783 19.3404 18.3975 19.4988 18 19.5H15V18H18V16.5H16.5C16.1025 16.4988 15.7217 16.3404 15.4407 16.0593C15.1596 15.7783 15.0012 15.3975 15 15V13.5C15.0012 13.1025 15.1596 12.7217 15.4407 12.4407C15.7217 12.1596 16.1025 12.0012 16.5 12Z\"\n fill=\"#0288D1\"\n />\n </svg>\n </>\n )\n }\n\n if (language === 'javascript') {\n return (\n <>\n {showLabel ? <>JavaScript</> : null}\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g clipPath=\"url(#clip0_42_2938)\">\n <path\n d=\"M0 0H20V20H0V0ZM18.3617 15.23C18.2158 14.3175 17.6217 13.5508 15.8592 12.8358C15.2458 12.5483 14.5642 12.3483 14.3617 11.8858C14.2858 11.6108 14.2742 11.4608 14.3233 11.2983C14.4483 10.76 15.0858 10.5983 15.5858 10.7483C15.9108 10.8483 16.2108 11.0983 16.3992 11.4983C17.2608 10.935 17.2608 10.935 17.8617 10.5608C17.6367 10.2108 17.525 10.06 17.3733 9.91083C16.8483 9.32333 16.1492 9.02333 15.0117 9.04917L14.4242 9.12333C13.8608 9.26083 13.3242 9.56083 12.9992 9.96083C12.0492 11.0367 12.3233 12.9117 13.4733 13.6867C14.6108 14.5367 16.2742 14.7233 16.4867 15.5242C16.6867 16.4992 15.7617 16.8117 14.8483 16.6992C14.1725 16.5492 13.7983 16.2108 13.3858 15.5858L11.8608 16.4617C12.0358 16.8617 12.2358 17.0358 12.5358 17.3858C13.9858 18.8492 17.6108 18.7742 18.2617 16.5492C18.2858 16.4742 18.4617 15.9617 18.3233 15.1742L18.3617 15.23ZM10.8758 9.1925H9.0025C9.0025 10.8075 8.995 12.4125 8.995 14.03C8.995 15.0567 9.0475 15.9992 8.88 16.2892C8.605 16.8633 7.89667 16.79 7.575 16.6892C7.245 16.5258 7.0775 16.3008 6.88333 15.9767C6.83083 15.8892 6.79167 15.8133 6.7775 15.8133L5.25667 16.7508C5.51083 17.2758 5.88167 17.7275 6.36 18.015C7.0725 18.44 8.03 18.5775 9.0325 18.3525C9.685 18.1642 10.2475 17.7767 10.5417 17.1767C10.9667 16.4017 10.8767 15.4517 10.8725 14.3883C10.8825 12.6767 10.8725 10.9642 10.8725 9.23917L10.8758 9.1925Z\"\n fill=\"white\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_42_2938\">\n <rect width=\"20\" height=\"20\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </>\n )\n }\n\n if (language === 'python') {\n return (\n <>\n {showLabel ? <>Python</> : null}\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M9.86 2C9.10148 2 8.37403 2.30132 7.83767 2.83767C7.30132 3.37403 7 4.10148 7 4.86V6.54H11.29C11.68 6.54 12 7.11 12 7.5H4.86C4.10148 7.5 3.37403 7.80132 2.83767 8.33767C2.30132 8.87403 2 9.60148 2 10.36V14.141C2 14.8995 2.30132 15.627 2.83767 16.1633C3.37403 16.6997 4.10148 17.001 4.86 17.001H6.04V14.321C6.03868 13.9459 6.11143 13.5742 6.25407 13.2273C6.3967 12.8803 6.60642 12.565 6.8712 12.2993C7.13598 12.0336 7.45061 11.8227 7.79704 11.6789C8.14347 11.535 8.51489 11.461 8.89 11.461H14.14C15.72 11.461 17 10.19 17 8.61V4.86C17 4.10148 16.6987 3.37403 16.1623 2.83767C15.626 2.30132 14.8985 2 14.14 2H9.86ZM9.14 3.61C9.54 3.61 9.86 3.73 9.86 4.32C9.86 4.91 9.54 5.211 9.14 5.211C8.75 5.211 8.43 4.911 8.43 4.321C8.43 3.731 8.75 3.61 9.14 3.61Z\"\n fill=\"#0288D1\"\n />\n <path\n d=\"M17.959 7V9.68C17.9602 10.055 17.8873 10.4266 17.7446 10.7734C17.602 11.1202 17.3922 11.4355 17.1274 11.7011C16.8627 11.9667 16.5481 12.1774 16.2017 12.3212C15.8554 12.465 15.484 12.539 15.109 12.539H9.86C9.48489 12.5377 9.11321 12.6104 8.76628 12.7531C8.41935 12.8957 8.10399 13.1054 7.83828 13.3702C7.57257 13.635 7.36175 13.9496 7.2179 14.296C7.07405 14.6425 7 15.0139 7 15.389V19.139C7 19.8975 7.30132 20.625 7.83767 21.1613C8.37403 21.6977 9.10148 21.999 9.86 21.999H14.14C14.8983 21.999 15.6256 21.6978 16.162 21.1617C16.6983 20.6255 16.9997 19.8983 17 19.14V17.46H12.709C12.319 17.46 12 16.89 12 16.5H19.14C19.8985 16.5 20.626 16.1987 21.1623 15.6623C21.6987 15.126 22 14.3985 22 13.64V9.86C22 9.10148 21.6987 8.37403 21.1623 7.83767C20.626 7.30132 19.8985 7 19.14 7H17.959ZM8.32 11.513L8.316 11.517L8.354 11.513H8.32ZM14.86 18.789C15.25 18.789 15.57 19.089 15.57 19.679C15.57 19.7722 15.5516 19.8646 15.516 19.9507C15.4803 20.0368 15.428 20.1151 15.362 20.181C15.2961 20.247 15.2178 20.2993 15.1317 20.335C15.0456 20.3706 14.9532 20.389 14.86 20.389C14.46 20.389 14.14 20.269 14.14 19.679C14.14 19.089 14.46 18.789 14.86 18.789Z\"\n fill=\"#FDD835\"\n />\n </svg>\n </>\n )\n }\n\n if (language === 'go') {\n return (\n <>\n {showLabel ? <>Go</> : null}\n <svg viewBox=\"0 0 128 128\" width={size} height={size} className={className}>\n <path d=\"M108.7 64.4c-1.6-1.2-3.8-1.9-6-1.9-.1-3.6-.2-7.2-.2-10.7-.1-9.5-.1-19.3-2.6-28.6 6.5-2.5 6.2-7.6 5.9-9.2-.7-3.8-4-7.9-9-7.9-1.9 0-3.9.6-5.8 1.9C83.4 1.6 73 .5 62.5.5 53 1.3 46.4 2.8 41 5.4c-2.3 1.1-4.2 2.4-6 3.9-1.8-1.1-3.7-1.7-5.5-1.7-5.1 0-8.8 4.1-9.4 8.1-.6 4 1.6 7.3 6 8.9-2.2 8.9-1.5 18.1-.7 27 .3 3.7.6 7.6.7 11.4h-.5c-2.3 0-4.6.7-6.3 1.9-.7.5-2.1 2-2 3.3 0 .4.2.9.9 1.3.2 2.1 1.5 2.4 2.3 2.4 1.6 0 3.4-1.1 3.9-1.5.5-.3.9-.5 1.2-.6l.5-.2c-.1 2.2-.3 4.5-.5 7-.9 11.7-2 25 3.9 34.6 1.2 1.9 2.6 3.6 4.3 5.1l-.9.6c-2.7 1.9-6.7 4.7-4.3 8.5v.1c.4.4.6.5.9.5h.1c.3.5.9 1.6 2.4 1.6.6 0 1.3-.2 2-.6 1.1-.6 2.1-1.4 3-2.2 1.5-1.3 3-2.6 5-2.9l.6-.1.7.3c6.4 2.6 12.9 3.3 17.3 3.4h2.6c7.7 0 14.8-1.2 20.5-3.5 1.2-.5 2.4-1.1 3.5-1.7 1.2.5 2.3 1.7 3.4 3 1.4 1.6 2.8 3.2 4.5 3.2.8 0 1.6-.4 2.4-1.1 1.2-.7 1.8-1.7 1.8-2.9 0-2.6-2.9-5.7-5.2-7.2 2-2 3.6-4.2 4.9-6.7 5.9-11.8 5-26.2 4.2-39l.5.3c.5.4 2.3 1.5 3.9 1.5.8 0 2.1-.3 2.3-2.4.7-.4.8-.9.9-1.3 0-1.3-1.4-2.8-2.1-3.3zm-17.1-56c1.7-1.1 3.4-1.7 5.2-1.7 4.4 0 7.7 3.7 8.3 7.3.6 3.7-1.4 6.8-5.4 8.4 0-.2-.1-.3-.2-.5l-.6-2.1-.3-.8-.9-2.4c0-.1 0-.1-.1-.2 0 0 0-.1-.1-.1-.4-.7-.7-1.4-1.1-2l-.2-.3-1.2-1.8c-.1-.1-.2-.2-.3-.4-.4-.5-.8-1-1.3-1.5-.1-.2-.3-.3-.5-.5l-1.2-1.2c.1.1 0-.1-.1-.2-.2zM26.3 23.9c-4-1.5-6.1-4.5-5.5-8.1.6-3.7 4-7.5 8.7-7.5 1.7 0 3.3.5 4.9 1.4l-.1.1-.3.3c-.5.5-1 1-1.4 1.5l-.3.3c-.5.6-1 1.2-1.5 1.9l-.2.3c-.5.7-.9 1.3-1.3 2 0 0 0 .1-.1.1-.4.7-.8 1.5-1.1 2.3 0 .2-.1.4-.1.5-.3.8-.7 1.6-.9 2.4 0 .1 0 .1-.1.2l-.6 2-.1.3zm-.9 45.2c-.3.1-.8.3-1.4.7-1 .7-2.4 1.4-3.5 1.4-.6 0-1.4-.2-1.6-1.7.5-.2 1-.4 1.4-.9.1-.2.1-.4-.1-.5-.2-.1-.4-.1-.5.1-.3.3-.6.5-1.1.6h-.1c-.3-.2-.5-.4-.6-.7.1-.9 1.1-2.1 1.8-2.7 1.6-1.2 3.7-1.8 5.9-1.8h.6v2.9l-.1 1c-.1 1.4-.2 1.4-.7 1.6zm15.8 52l.1.1c-1.9.5-3.4 1.7-4.8 2.9-.9.8-1.8 1.6-2.9 2.1-.6.4-1.1.5-1.6.5-1 0-1.5-.8-1.7-1.2.1-.8.5-1.5 1-2.2.3-.4.6-.9.8-1.4.1-.2 0-.4-.2-.5-.2-.1-.4 0-.5.2-.2.4-.5.8-.7 1.3-.4.7-.9 1.4-1.1 2.2h-.1c-.1 0-.2-.1-.4-.3-2-3.2 1.4-5.5 4.2-7.5l.9-.6h.2l.2.1 1.2.9.4.3c.4.3.8.6 1.3.9l.5.3 1.3.8.6.3c.4.3.8.5 1.3.8zm52.3-5.3c2.1 1.4 5 4.4 5 6.7 0 .8-.4 1.5-1.1 2-.1-.3-.2-.6-.4-.9-.3-.9-.7-1.9-1.5-2.6-.1-.1-.4-.1-.5 0-.1.1-.1.4 0 .5.7.6 1 1.5 1.3 2.4l.4 1.1c-.6.5-1.2.8-1.8.8-1.4 0-2.6-1.5-3.9-3-1-1.1-2-2.3-3.1-3l.3-.2c.3-.1.5-.3.7-.5l1.3-.9.8-.6 1.4-1.1c.2-.2.4-.4.7-.6.2.1.3 0 .4-.1zm4.7-7.5c-1.2 2.5-3.4 5.7-7.1 8.5l-.2.1c-.3.3-.7.5-1.1.8l-1.1.7-.2.1-1.6.9-.7.4c-5.4 2.8-12.8 4.8-23.2 4.8h-2.6c-8.1-.3-14.3-2-18.9-4.2h-.1c-1.1-.5-2.1-1.1-3.1-1.7-4.6-2.9-7.1-6.1-8.3-8-5.8-9.4-4.8-22.5-3.8-34.1.2-3 .5-5.7.6-8.4l.1-1.8.1-.1v-.1l-.1-.5V63c-.1-4-.4-7.7-.7-11.5-.8-9-1.5-18.4.9-27.4.2-.8.4-1.6.7-2.3v-.1l.1-.3c.1-.4.3-.8.5-1.2.1-.3.2-.5.3-.7l.3-.8.4-.8.3-.6c.1-.3.3-.6.4-.8.1-.2.2-.4.3-.5.2-.4.5-.8.7-1.1.2-.3.4-.6.6-.8.1-.2.2-.3.4-.5l.6-.8c.1-.1.2-.2.3-.4l.9-1 .1-.1 1.2-1.2.2-.2c7-6 17-7.8 27.1-8.6 5.9 0 13.5.3 20 2.7 3.2 1.2 6 2.8 8.4 4.9.3.3.6.6.9.8l.9.9 1 1.2.6.7 1 1.4.5.7.9 1.5.4.8c.3.6.5 1.3.7 2 0 .1.1.2.1.4.2.6.4 1.2.6 1.7l.1.3c3 9.9 3.1 20.2 3.1 30.4 0 3.5 0 7.4.2 10.4v.6c0 .9.1 1.8.1 2.5v.1l.1 1.9c0 .6.1 1.3.1 2v.3c.9 12.6 1.9 27.1-4 38.8zm11.2-40c-.5-.2-.9-.3-1.2-.7-.1-.2-.3-.2-.5-.1s-.2.3-.1.5c.4.5.9.7 1.4.9-.2 1.5-1 1.7-1.6 1.7-1.1 0-2.5-.7-3.5-1.4-.4-.3-.7-.4-1-.5l-.2-2.4c0-.4 0-.8-.1-1.1 0-.6-.1-1.3-.1-2 2.1.1 4.1.7 5.6 1.8.7.5 1.8 1.8 1.7 2.6.1.3-.1.6-.4.7zM77.7 7.2c-3.8 0-7.5 1.6-9.9 4.1-2.2 2.4-3.3 5.4-3.1 8.8v.1C66 27.4 72 30 76.8 30c4.2 0 8.1-1.8 10.4-4.7 2-2.5 2.7-5.8 1.8-9.3-1.5-6.4-6.8-8.8-11.3-8.8zm8.9 17.5c-2.1 2.7-5.9 4.3-9.9 4.3-2.7 0-5.2-.7-7.2-2.1-2.2-1.6-3.6-3.9-4.1-6.9-.2-3.2.8-6 2.9-8.2 2.3-2.5 5.8-3.9 9.4-3.9 4.2 0 9.2 2.1 10.6 8.1.8 3.4.2 6.4-1.7 8.7zm-27-5.5c-.4-7.3-6.2-10.6-11.8-10.6-4.1 0-7.9 1.7-10.3 4.5-2.1 2.6-2.8 5.9-2.1 9.6 1.6 6.3 7 8.5 11.5 8.5 3.8 0 7.4-1.5 9.8-4 2.1-2.2 3.1-5 2.9-8zM47 30.5c-4.2 0-9.3-2.1-10.8-8-.7-3.5 0-6.6 2-9 2.2-2.7 5.8-4.3 9.7-4.3 7.7 0 10.8 5.4 11.1 10 .2 2.9-.7 5.5-2.6 7.5-2.3 2.4-5.8 3.8-9.4 3.8zm-5.4-13.9c-1.9 0-3.5 1.7-3.5 3.8 0 2.1 1.6 3.8 3.5 3.8s3.5-1.7 3.5-3.8c0-2.1-1.6-3.8-3.5-3.8zm1.6 5.7c-.5 0-.8-.4-.8-1 0-.5.4-1 .8-1 .5 0 .8.4.8 1 0 .5-.4 1-.8 1zm27.9-6.6c-1.9 0-3.5 1.7-3.5 3.8 0 2.1 1.6 3.8 3.5 3.8s3.5-1.7 3.5-3.8c0-2.1-1.5-3.8-3.5-3.8zm1.6 5.6c-.5 0-.8-.4-.8-1 0-.5.4-1 .8-1 .5 0 .8.4.8 1s-.3 1-.8 1zm-4.2 9c.1-.3.1-.7 0-1.1-1.1-4.1-10.4-3.5-10.4 1.3 0-.4-.1-.6-.1-.8 0 .3.1.6.1.8-1.5.2-2.8 1.2-3.6 2.7-.7 1.4-.8 2.9-.1 4.2.6 1.1 1.6 1.7 2.8 1.7-.4 2.1 0 4.6 1 6 .5.7 1.2 1.1 1.8 1.1.9 0 1.9-.7 2.8-1.8.6 1 1.5 1.7 2.7 1.9h.2c.2-.1.4-.2.6-.2.7-.2 1.4-.5 1.9-1.3v-.1c.3-1.4.1-2.9 0-4.3l-.1-1.2c.5.2 1 .3 1.5.3 1 0 1.8-.4 2.5-1.2.9-1 1.2-2 1-3-.1-2.3-2.4-4-4.6-5zm-5.9 13.2c-.9 1.1-1.7 1.7-2.4 1.7-.5 0-.9-.3-1.3-.7-.9-1.2-1.3-3.7-.9-5.6l.5-.1h.2l.6-.1h.1l1.2-.4.6-.2c.1 0 .1 0 .2-.1.2-.1.3-.1.5-.1.2-.1.4-.1.7-.2h.2l-.1 1.3c-.1 1.3-.2 2.9-.1 4.5zm5.2-3.3c.1 1.3.2 2.7 0 4-.3.6-.8.7-1.5 1l-.6.2c-1-.2-1.8-.8-2.2-1.8-.2-1.5-.1-3 .1-4.6l.1-1.5h.1c1.1 0 2.1.5 3.1.9l.7.3c.1.4.2.9.2 1.5zm4.1-2.7c-.6.7-1.3 1-2 1-.6 0-1.1-.2-1.7-.4-.3-.1-.6-.2-.9-.4-1.1-.4-2.2-.9-3.4-.9h-1.3l-.4.1c-.1 0-.2 0-.3.1-.2 0-.3.1-.5.2-.1 0-.2 0-.2.1l-.8.3c-.1.1-.3.1-.4.1l-.3.1-.3.1c-.2.1-.3.1-.5.1-.1 0-.2 0-.3.1l-.5.1h-.2l-.6.1c-1 0-1.7-.4-2.2-1.3-.6-1-.6-2.3.1-3.5.7-1.2 1.9-2.1 3.1-2.3 1.2 2.5 8.1 2.2 9.9-.2 2 .9 4.2 2.5 4.5 4.2.2.7-.1 1.5-.8 2.3zM58 29.4z\"></path>\n </svg>\n </>\n )\n }\n\n if (language === 'ruby') {\n return (\n <>\n {showLabel ? <>Ruby</> : null}\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g clipPath=\"url(#clip0_42_2969)\">\n <path\n d=\"M16.7967 0.0691243C19.3242 0.506624 20.0408 2.23412 19.9875 4.04412L20 4.01829L18.8625 18.925L4.075 19.9383H4.08833C2.86083 19.8866 0.125 19.7741 0 15.9491L1.37083 13.4491L3.72 18.9375L4.13917 19.9141L6.47667 12.2941L6.45167 12.3L6.465 12.275L14.1775 14.7383L13.0142 10.2125L12.1892 6.96246L19.5392 6.48829L19.0267 6.06329L13.75 1.76162L16.7992 0.060791L16.7967 0.0691243ZM4.275 4.22746C7.2425 1.28329 11.0725 -0.456709 12.5433 1.02746C14.0117 2.50829 12.4558 6.11496 9.4825 9.05746C6.51333 12.0008 2.73 13.8358 1.2625 12.355C-0.209167 10.8741 1.3 7.17412 4.2725 4.22996L4.275 4.22746Z\"\n fill=\"white\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_42_2969\">\n <rect width=\"20\" height=\"20\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </>\n )\n }\n\n if (language === 'php') {\n return (\n <>\n {showLabel ? <>PHP</> : null}\n <svg viewBox=\"0 0 128 128\" width={size} height={size} className={className}>\n <path d=\"M64 30.332C28.654 30.332 0 45.407 0 64s28.654 33.668 64 33.668c35.345 0 64-15.075 64-33.668S99.346 30.332 64 30.332zm-5.982 9.81h7.293v.003l-1.745 8.968h6.496c4.087 0 6.908.714 8.458 2.139 1.553 1.427 2.017 2.017 3.737 3.737 5.946 1.719 2.209-2.209 2.209-5.928 0-8.137zm-51.051 51.372c0-3.757-1.072-5.686-3.214-5.791a6.03 6.03 0 00-2.495.409c-.646.231-1.082.461-1.311.692v8.968c1.371.86 2.588 1.26 3.649 1.197 2.247-.148 3.371-1.971 3.371-5.475zm2.643.157c0 1.909-.447 3.493-1.348 4.753-1.003 1.427-2.394 2.16-4.172 2.201-1.34.043-2.721-.378-4.142-1.258v8.151l-2.298-.82V107.14c.377-.462.862-.859 1.451-1.196 1.368-.798 3.031-1.207 4.987-1.228l.033.032c1.788-.022 3.166.712 4.134 2.201.902 1.366 1.355 3.117 1.355 5.257zm14.049 5.349c0 2.56-.257 4.333-.77 5.318-.516.986-1.497 1.773-2.945 2.359-1.174.463-2.444.714-3.808.757l-.38-1.448c1.386-.188 2.362-.378 2.928-.566 1.114-.377 1.878-.955 2.298-1.73.337-.631.503-1.835.503-3.618v-.599a11.809 11.809 0 01-4.941 1.068c-1.132 0-2.13-.354-2.99-1.068-.966-.777-1.449-1.764-1.449-2.958v-9.566l2.299-.787v9.63c0 1.028.332 1.82.996 2.376s1.524.822 2.578.803c1.054-.022 2.183-.431 3.382-1.228v-11.234h2.299v12.491zm8.973 1.479a9.457 9.457 0 01-.757.032c-1.3 0-2.314-.309-3.038-.93-.722-.622-1.084-1.479-1.084-2.573v-9.054h-1.574v-1.446h1.574v-3.84l2.296-.817v4.657h2.583v1.446h-2.583v8.991c0 .862.231 1.474.694 1.83.397.295 1.029.463 1.889.506v1.198zm13.917-.189h-2.298v-8.873c0-.902-.211-1.68-.631-2.329-.485-.734-1.159-1.102-2.024-1.102-1.054 0-2.372.556-3.954 1.668v10.636h-2.298V97.637l2.298-.725v9.659c1.469-1.068 3.073-1.604 4.816-1.604 1.218 0 2.203.41 2.958 1.228.757.817 1.134 1.836 1.134 3.053v9.597h-.001zm12.218-7.157c0-1.444-.274-2.636-.82-3.579-.649-1.149-1.657-1.756-3.021-1.818-2.52.146-3.778 1.951-3.778 5.412 0 1.587.262 2.912.79 3.976.674 1.356 1.685 2.024 3.033 2.002 2.531-.02 3.796-2.017 3.796-5.993zm2.518.015c0 2.055-.526 3.765-1.575 5.131-1.154 1.528-2.749 2.296-4.783 2.296-2.017 0-3.589-.768-4.723-2.296-1.028-1.366-1.542-3.076-1.542-5.131 0-1.932.556-3.556 1.668-4.879 1.174-1.403 2.718-2.107 4.627-2.107 1.909 0 3.463.704 4.66 2.107 1.111 1.323 1.668 2.947 1.668 4.879zm13.178 7.142h-2.299v-9.376c0-1.028-.31-1.831-.928-2.409-.619-.576-1.443-.855-2.472-.833-1.091.021-2.13.378-3.116 1.069v11.549h-2.299v-11.833c1.323-.963 2.54-1.592 3.652-1.886 1.049-.274 1.974-.41 2.771-.41.545 0 1.059.053 1.542.158.903.209 1.637.596 2.203 1.164.631.629.946 1.384.946 2.267v10.54z\"></path>\n </svg>\n </>\n )\n }\n\n return\n }\n return (\n <div\n className={cn('text-muted-foreground', {\n 'text-sm flex items-center justify-center flex-row gap-2': showLabel,\n 'font-mono text-xs': !showLabel,\n })}\n >\n {renderIcon(language)}\n </div>\n )\n}\n","import { useThemeStore } from '@motiadev/ui'\nimport type React from 'react'\nimport { useRef, useState } from 'react'\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'\nimport { oneDark, oneLight } from 'react-syntax-highlighter/dist/esm/styles/prism'\nimport type { Feature } from '@/types/file'\nimport { FeatureCard } from './feature-card'\nimport { LanguageIndicator } from './language-indicator'\n\ntype CodeDisplayProps = {\n code: string\n language?: string\n features?: Feature[]\n}\n\nconst codeTagProps = {\n style: {\n fontFamily: 'DM Mono, monospace',\n fontSize: '16px',\n },\n}\n\nconst customStyle = {\n margin: 0,\n borderRadius: 0,\n padding: 0,\n}\n\nconst isHighlighted = (lines: string[], lineNumber: number) => {\n return lines.some((line) => {\n const [start, end] = line.split('-').map((num) => parseInt(num, 10))\n\n if (end !== undefined) {\n return lineNumber >= start && lineNumber <= end\n }\n\n return lineNumber == start\n })\n}\n\nconst getFirstLineNumber = (line: string) => {\n const [start] = line.split('-').map((num) => parseInt(num, 10))\n return start\n}\n\nexport const CodeDisplay: React.FC<CodeDisplayProps> = ({ code, language, features }) => {\n const theme = useThemeStore((state) => state.theme)\n const themeStyle = theme === 'dark' ? oneDark : oneLight\n const [highlightedLines, setHighlightedLines] = useState<string[]>([])\n const [selectedFeature, setSelectedFeature] = useState<Feature | null>(null)\n const ref = useRef<HTMLDivElement>(null)\n\n const handleFeatureClick = (feature: Feature) => {\n setSelectedFeature(feature)\n setHighlightedLines(feature.lines)\n const lineNumber = getFirstLineNumber(feature.lines[0])\n const line = ref.current?.querySelector(`[data-line-number=\"${lineNumber}\"]`)\n\n if (line) {\n line.scrollIntoView({ behavior: 'smooth', block: 'center' })\n }\n }\n\n return (\n <div className=\"flex flex-col h-full overflow-hidden\">\n <div className=\"flex items-center py-2 px-5 dark:bg-[#1e1e1e] gap-2 justify-center\">\n <div className=\"text-sm text-muted-foreground\">Read only</div>\n <div className=\"flex-1\" />\n <LanguageIndicator language={language} className=\"w-4 h-4\" size={16} showLabel />\n </div>\n <div className=\"flex flex-row h-[calc(100%-36px)]\">\n {features && features.length > 0 && (\n <div className=\"flex flex-col gap-2 p-2 bg-card overflow-y-auto min-w-[200px] w-[300px]\">\n {features.map((feature, index) => (\n <FeatureCard\n key={index}\n feature={feature}\n highlighted={selectedFeature === feature}\n onClick={() => handleFeatureClick(feature)}\n onHover={() => handleFeatureClick(feature)}\n />\n ))}\n </div>\n )}\n\n <div className=\"overflow-y-auto\" ref={ref}>\n <SyntaxHighlighter\n showLineNumbers\n language={language}\n style={themeStyle}\n codeTagProps={codeTagProps}\n customStyle={customStyle}\n wrapLines\n lineProps={(lineNumber) => {\n if (isHighlighted(highlightedLines, lineNumber)) {\n return {\n 'data-line-number': lineNumber,\n style: {\n borderLeft: '2px solid var(--accent-1000)',\n backgroundColor: 'rgb(from var(--accent-1000) r g b / 0.2)',\n },\n }\n }\n\n return {\n 'data-line-number': lineNumber,\n style: {\n borderLeft: '2px solid transparent',\n },\n }\n }}\n >\n {code}\n </SyntaxHighlighter>\n </div>\n </div>\n </div>\n )\n}\n","import { Sidebar } from '@motiadev/ui'\nimport { X } from 'lucide-react'\nimport type React from 'react'\nimport type { Feature } from '@/types/file'\nimport { CodeDisplay } from './code-display'\n\ntype NodeSidebarProps = {\n content: string\n features: Feature[]\n title: string\n subtitle?: string\n variant: 'event' | 'api' | 'noop' | 'cron'\n language?: string\n isOpen: boolean\n onClose: () => void\n}\n\nexport const NodeSidebar: React.FC<NodeSidebarProps> = ({\n content,\n title,\n subtitle,\n language,\n isOpen,\n onClose,\n features,\n}) => {\n if (!isOpen) return null\n\n return (\n <Sidebar\n title={title}\n subtitle={subtitle}\n initialWidth={900}\n contentClassName=\"p-0 h-full gap-0\"\n onClose={onClose}\n actions={[{ icon: <X />, onClick: onClose, label: 'Close' }]}\n >\n <CodeDisplay code={content} language={language} features={features} />\n </Sidebar>\n )\n}\n","import { Button, cn } from '@motiadev/ui'\nimport { ScanSearch } from 'lucide-react'\nimport type React from 'react'\nimport { type PropsWithChildren, useCallback, useEffect, useState } from 'react'\nimport { useHandlePositions } from '@/hooks/use-update-handle-positions'\nimport type { Feature } from '@/types/file'\nimport type { BaseNodeProps } from '../node-props'\nimport { BaseHandle } from './base-handle'\nimport { NodeHeader } from './node-header'\nimport { NodeSidebar } from './node-sidebar'\n\ntype Props = PropsWithChildren<{\n title: string\n subtitle?: string\n variant: 'event' | 'api' | 'noop' | 'cron'\n language?: string\n className?: string\n disableSourceHandle?: boolean\n disableTargetHandle?: boolean\n data: BaseNodeProps\n}>\n\nexport const BaseNode: React.FC<Props> = ({\n title,\n variant,\n children,\n disableSourceHandle,\n disableTargetHandle,\n language,\n subtitle,\n data,\n}) => {\n const [isOpen, setIsOpen] = useState(false)\n const { sourcePosition, targetPosition, toggleTargetPosition, toggleSourcePosition } = useHandlePositions(data)\n\n const [content, setContent] = useState<string | null>(null)\n const [features, setFeatures] = useState<Feature[]>([])\n\n const fetchContent = useCallback(async () => {\n const response = await fetch(`/__motia/step/${data.id}`)\n const responseData = await response.json()\n setContent(responseData.content)\n setFeatures(responseData.features)\n }, [data.id])\n\n useEffect(() => {\n if (data.id && isOpen) {\n fetchContent()\n }\n }, [data.id, isOpen, fetchContent])\n\n return (\n <div\n className={cn('p-1 rounded-lg max-w-[350px]', {\n 'bg-muted-foreground/20': isOpen,\n })}\n >\n <div\n className=\"rounded-lg dark:bg-[#101010] bg-background border-1 border-muted-foreground/30 border-solid\"\n data-testid={`node-${title?.toLowerCase().replace(/ /g, '-')}`}\n >\n <div className=\"group relative\">\n {/* Main node content */}\n <NodeHeader text={title} variant={variant} className=\"border-b-2 border-muted-foreground/10\">\n <div className=\"flex justify-end\">\n <Button\n data-testid={`open-code-preview-button-${title?.toLowerCase()}`}\n variant=\"ghost\"\n className=\"h-5 p-0.5\"\n onClick={() => setIsOpen(true)}\n >\n <ScanSearch className=\"w-4 h-4\" />\n </Button>\n </div>\n </NodeHeader>\n\n {subtitle && <div className=\"py-4 px-6 text-sm text-muted-foreground\">{subtitle}</div>}\n {children && (\n <div className=\"p-2\">\n <div\n className={cn('space-y-3 p-4 text-sm text-muted-foreground', {\n 'bg-card': variant !== 'noop',\n })}\n >\n {children}\n </div>\n </div>\n )}\n\n {/* Connection points */}\n {!disableTargetHandle && (\n <BaseHandle type=\"target\" position={targetPosition} onTogglePosition={toggleTargetPosition} />\n )}\n {!disableSourceHandle && (\n <BaseHandle type=\"source\" position={sourcePosition} onTogglePosition={toggleSourcePosition} />\n )}\n </div>\n </div>\n\n {content && (\n <NodeSidebar\n features={features}\n content={content}\n title={title}\n subtitle={subtitle}\n variant={variant}\n language={language}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n />\n )}\n </div>\n )\n}\n","import type { PropsWithChildren } from 'react'\nimport { BaseNode } from './base-node/base-node'\nimport type { ApiNodeProps } from './node-props'\n\ntype Props = PropsWithChildren<ApiNodeProps>\n\nexport const ApiNode = ({ data, children }: Props) => {\n return (\n <BaseNode\n data={data}\n variant=\"api\"\n title={data.name}\n language={data.language}\n subtitle={data.description}\n disableSourceHandle={!data.emits?.length && !data.virtualEmits?.length}\n disableTargetHandle={!data.subscribes?.length && !data.virtualSubscribes?.length}\n >\n {data.webhookUrl && (\n <div className=\"flex gap-1 items-center text-muted-foreground\">\n <div className=\"font-mono\">{data.webhookUrl}</div>\n </div>\n )}\n {children}\n </BaseNode>\n )\n}\n","import type React from 'react'\nimport type { PropsWithChildren } from 'react'\nimport { BaseNode } from './base-node/base-node'\nimport type { EventNodeProps } from './node-props'\n\nexport const EventNode: React.FC<PropsWithChildren<EventNodeProps>> = ({ data, children }) => {\n return (\n <BaseNode\n data={data}\n variant=\"event\"\n title={data.name}\n subtitle={data.description}\n language={data.language}\n disableSourceHandle={!data.emits?.length && !data.virtualEmits?.length}\n disableTargetHandle={!data.subscribes?.length && !data.virtualSubscribes?.length}\n >\n {children}\n </BaseNode>\n )\n}\n","import type React from 'react'\nimport type { PropsWithChildren } from 'react'\nimport { BaseNode } from './base-node/base-node'\nimport type { NoopNodeProps } from './node-props'\n\nexport const NoopNode: React.FC<PropsWithChildren<NoopNodeProps>> = ({ data, children }) => {\n return (\n <BaseNode\n data={data}\n variant=\"noop\"\n title={data.name}\n subtitle={data.description}\n disableSourceHandle={!data.virtualEmits.length}\n disableTargetHandle={!data.subscribes?.length}\n >\n {children}\n </BaseNode>\n )\n}\n"],"mappings":";;;;;;;;;;;;AAAA,MAAaA,iBAAiB;CAC5BC,kBAAkB;CAClBC,kBAAkB;CAClBC,aAAa;CAEbC,OAAO;EACLC,eAAeC,WAAmB,gCAAgCA,OAAM;EACxEC,UAAUC,cAAsB,2BAA2BA,UAAS;EACpEC,gBAAgBC,WAAmB,mDAAmDA,OAAM;EAC5FC,OAAOD,WAAmB,4BAA4BA,OAAM;EAC7D;CAEDE,WAAW;EACTC,eAAe;EACfC,WAAWC,QAAgBC,SAAiB,gCAAgCD,OAAM,GAAIC,KAAI;EAC1FC,WAAW;EACXC,YAAY;EAEZC,SAAS;EACTC,YAAY;EACZC,WAAW;EAEXC,SAAS;EACTC,UAAU;EACVC,YAAY;EACb;CAEDC,SAAS;EACPC,QAAQC,UAAkB,qDAAqDA,MAAK;EACpFC,SAAS;EACTC,WAAWF,UAAkB,+CAA+CA,MAAK;EAClF;CAEDG,MAAM;EACJC,WAAW;EACXC,iBAAiB;EACjBC,cAAcN,UAAkB,8CAA8CA,MAAK;EACnFO,KAAK;EACN;CAEDC,QAAQ;EACNJ,WAAW;EACXG,MAAMP,UAAkB,8CAA8CA,MAAK;EAC5E;CAEDS,OAAO;EACLhC,OAAO;EACPQ,WAAW;EACXa,SAAS;EACTK,MAAM;EACNK,QAAQ;EACV;CACD;;;;ACjDD,MAAaM,sBAAqBC,SAAA;CAAA,MAAAC,IAAAC,EAAA,GAAA;CAChC,MAAAC,YAAkBP,cAAc;CAChC,MAAAQ,sBAA4BP,wBAAwB;CACpD,MAAAQ,iBAAuBL,KAAIM,YAAiCC,yBAAK,WAAWZ,WAAQa,SAAUb,WAAQc;CACtG,MAAAC,iBAAuBV,KAAIM,YAAiCK,yBAAK,QAAQhB,WAAQiB,MAAOjB,WAAQkB;CAAK,IAAAC;AAAA,KAAAb,EAAA,OAAAD,QAAAC,EAAA,OAAAE,aAAAF,EAAA,OAAAG,qBAAA;AAExEU,QAAAC,aAAA;AAC3BZ,aAASa,WAAYhB,KAAIiB,IAAK,EAAAjB,MACtB;IAAA,GAAKA;IAAIM,YAAc;KAAA,GAAKN,KAAIM;KAAWC,sBAAwBQ;KAAS;IAAE,EACrF,CAAC;AACFX,uBAAoBJ,KAAIiB,GAAI;;AAC7BhB,IAAA,KAAAD;AAAAC,IAAA,KAAAE;AAAAF,IAAA,KAAAG;AAAAH,IAAA,KAAAa;OAAAA,MAAAb,EAAA;CALD,MAAAiB,uBAA6BJ;CAK5B,IAAAK;AAAA,KAAAlB,EAAA,OAAAD,QAAAC,EAAA,OAAAE,aAAAF,EAAA,OAAAG,qBAAA;AAE4Be,QAAAC,eAAA;AAC3BjB,aAASa,WAAYhB,KAAIiB,IAAK,EAAAjB,MACtB;IAAA,GAAKA;IAAIM,YAAc;KAAA,GAAKN,KAAIM;KAAWK,sBAAwBI;KAAS;IAAE,EACrF,CAAC;AACFX,uBAAoBJ,KAAIiB,GAAI;;AAC7BhB,IAAA,KAAAD;AAAAC,IAAA,KAAAE;AAAAF,IAAA,KAAAG;AAAAH,IAAA,KAAAkB;OAAAA,MAAAlB,EAAA;CALD,MAAAoB,uBAA6BF;CAK5B,IAAAG;AAAA,KAAArB,EAAA,OAAAS,kBAAAT,EAAA,OAAAoB,sBAAA;AAE4BC,aAAA;AAE3BD,wBADoBX,mBAAmBf,WAAQiB,MAAOjB,WAAQkB,OAAQlB,WAAQiB,IAC7C;;AAClCX,IAAA,KAAAS;AAAAT,IAAA,KAAAoB;AAAApB,IAAA,MAAAqB;OAAAA,MAAArB,EAAA;CAHD,MAAAuB,uBAA6BF;CAG5B,IAAAG;AAAA,KAAAxB,EAAA,QAAAI,kBAAAJ,EAAA,QAAAiB,sBAAA;AAE4BO,aAAA;AAE3BP,wBADoBb,mBAAmBV,WAAQa,SAAUb,WAAQc,QAASd,WAAQa,OACjD;;AAClCP,IAAA,MAAAI;AAAAJ,IAAA,MAAAiB;AAAAjB,IAAA,MAAAwB;OAAAA,MAAAxB,EAAA;CAHD,MAAA0B,uBAA6BF;CAG5B,IAAAG;AAAA,KAAA3B,EAAA,QAAAI,kBAAAJ,EAAA,QAAAS,kBAAAT,EAAA,QAAA0B,wBAAA1B,EAAA,QAAAuB,wBAAAvB,EAAA,QAAAiB,wBAAAjB,EAAA,QAAAoB,sBAAA;AAEMO,OAAA;GAAAvB;GAAAK;GAAAQ;GAAAG;GAAAG;GAAAG;GAON;AAAA1B,IAAA,MAAAI;AAAAJ,IAAA,MAAAS;AAAAT,IAAA,MAAA0B;AAAA1B,IAAA,MAAAuB;AAAAvB,IAAA,MAAAiB;AAAAjB,IAAA,MAAAoB;AAAApB,IAAA,MAAA2B;OAAAA,MAAA3B,EAAA;AAAA,QAPM2B;;;;;ACtBT,MAAaa,cAA8BE,UAAA;CAAA,MAAAC,IAAAC,EAAA,GAAA;CAAA,IAAAN;CAAA,IAAAC;CAAA,IAAAM;CAAA,IAAAC;AAAA,KAAAH,EAAA,OAAAD,OAAA;AACzC,GAAA,CAAAJ,UAAAO,UAAAN,qBAAAO,QAA0DJ;AAAKC,IAAA,KAAAD;AAAAC,IAAA,KAAAL;AAAAK,IAAA,KAAAJ;AAAAI,IAAA,KAAAE;AAAAF,IAAA,KAAAG;QAAA;AAAAR,aAAAK,EAAA;AAAAJ,qBAAAI,EAAA;AAAAE,aAAAF,EAAA;AAAAG,SAAAH,EAAA;;CAC/D,MAAAI,eAAqBF,aAAahB,WAAQmB,QAASH,aAAahB,WAAQoB;CAMlE,MAAAC,KAAAL,aAAahB,WAAQsB,OAArB;CACA,MAAAC,KAAAP,aAAahB,WAAQwB,UAArB;CACA,MAAAC,KAAAT,aAAahB,WAAQmB,QAArB;CACA,MAAAO,KAAAV,aAAahB,WAAQoB,SAArB;CACA,MAAAO,KAAAT,eAAA,sBAAA;CACA,MAAAU,KAAAnB,YAAA;CAAoB,IAAAoB;AAAA,KAAAf,EAAA,OAAAO,MAAAP,EAAA,OAAAS,MAAAT,EAAA,OAAAW,MAAAX,EAAA,OAAAY,MAAAZ,EAAA,OAAAa,MAAAb,EAAA,QAAAc,IAAA;AAPXC,OAAA1B,KACT,4BACAkB,IACAE,IACAE,IACAC,IACAC,IACAC,GACD;AAAAd,IAAA,KAAAO;AAAAP,IAAA,KAAAS;AAAAT,IAAA,KAAAW;AAAAX,IAAA,KAAAY;AAAAZ,IAAA,KAAAa;AAAAb,IAAA,MAAAc;AAAAd,IAAA,MAAAe;OAAAA,MAAAf,EAAA;CAAA,IAAAgB;AAAA,KAAAhB,EAAA,QAAAiB,OAAAC,IAAA,4BAAA,EAAA;AAMQF,OAAA,EAAAG,YAAc,mBAAmB;AAAAnB,IAAA,MAAAgB;OAAAA,MAAAhB,EAAA;CAAA,IAAAoB;AAAA,KAAApB,EAAA,QAAAE,YAAAF,EAAA,QAAAG,MAAA;AAH1CiB,OAAA,oBAAC;GAAQ,GACHjB;GACMD;GACH,OAAAc;GACG,WAAA;IAcV;AAAAhB,IAAA,MAAAE;AAAAF,IAAA,MAAAG;AAAAH,IAAA,MAAAoB;OAAAA,MAAApB,EAAA;CAAA,IAAAqB;AAAA,KAAArB,EAAA,QAAAJ,oBAAAI,EAAA,QAAAe,MAAAf,EAAA,QAAAoB,IAAA;AA9BJC,OAAA,oBAAA;GACa,WAAAN;GASFnB,SAAAA;aAETwB;IAmBI;AAAApB,IAAA,MAAAJ;AAAAI,IAAA,MAAAe;AAAAf,IAAA,MAAAoB;AAAApB,IAAA,MAAAqB;OAAAA,MAAArB,EAAA;AAAA,QA/BNqB;;;;;ACVJ,MAAMU,WAAWR,IAAI,kBAAkB,EACrCS,UAAU,EACRC,SAAS;CACPC,OAAO;CACPC,KAAK;CACLC,MAAM;CACNC,MAAM;CACR,EACF,EACD,CAAC;AAEF,MAAMC,YAAWC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAR,YAAAM;AAChB,KAAIN,YAAY,QAAM;EAAA,IAAAS;AAAA,MAAAF,EAAA,OAAAG,OAAAC,IAAA,4BAAA,EAAA;AACbF,UAAA,oBAAC,iBAAwB,WAAA,YAAY;AAAAF,KAAA,KAAAE;QAAAA,QAAAF,EAAA;AAAA,SAArCE;YACET,YAAY,OAAK;EAAA,IAAAS;AAAA,MAAAF,EAAA,OAAAG,OAAAC,IAAA,4BAAA,EAAA;AACnBF,UAAA,oBAAC,SAAgB,WAAA,YAAY;AAAAF,KAAA,KAAAE;QAAAA,QAAAF,EAAA;AAAA,SAA7BE;YACET,YAAY,QAAM;EAAA,IAAAS;AAAA,MAAAF,EAAA,OAAAG,OAAAC,IAAA,4BAAA,EAAA;AACpBF,UAAA,oBAAC,aAAoB,WAAA,YAAY;AAAAF,KAAA,KAAAE;QAAAA,QAAAF,EAAA;AAAA,SAAjCE;YACET,YAAY,SAAO;EAAA,IAAAS;AAAA,MAAAF,EAAA,OAAAG,OAAAC,IAAA,4BAAA,EAAA;AACrBF,UAAA,oBAAC,aAAoB,WAAA,YAAY;AAAAF,KAAA,KAAAE;QAAAA,QAAAF,EAAA;AAAA,SAAjCE;;CACR,IAAAA;AAAA,KAAAF,EAAA,OAAAP,SAAA;AACsBS,OAAApB,GAAGS,SAAS,EAAAE,SAAW,CAAC,CAAC;AAAAO,IAAA,KAAAP;AAAAO,IAAA,KAAAE;OAAAA,MAAAF,EAAA;CAAA,IAAAK;AAAA,KAAAL,EAAA,OAAAE,IAAA;AAAzCG,OAAA,oBAAA;GAAgB,WAAAH;aAA2B;IAAU;AAAAF,IAAA,KAAAE;AAAAF,IAAA,KAAAK;OAAAA,MAAAL,EAAA;AAAA,QAArDK;;AAST,MAAaI,cAA8BV,OAAA;CAAA,MAAAC,IAAAC,EAAA,GAAA;CAAC,MAAA,EAAAM,MAAAd,SAAAkB,UAAAH,cAAAT;CAAsC,IAAAG;AAAA,KAAAF,EAAA,OAAAQ,WAAA;AAChEN,OAAApB,GAAG,+BAA+B0B,UAAU;AAAAR,IAAA,KAAAQ;AAAAR,IAAA,KAAAE;OAAAA,MAAAF,EAAA;CAAA,IAAAK;AAAA,KAAAL,EAAA,OAAAP,SAAA;AAC1CY,OAAAd,SAAS,EAAAE,SAAW,CAAC;AAAAO,IAAA,KAAAP;AAAAO,IAAA,KAAAK;OAAAA,MAAAL,EAAA;CAAA,IAAAY;AAAA,KAAAZ,EAAA,OAAAP,SAAA;AACnCmB,OAAA,oBAAC,YAAkBnB,UAAW;AAAAO,IAAA,KAAAP;AAAAO,IAAA,KAAAY;OAAAA,MAAAZ,EAAA;CAAA,IAAAa;AAAA,KAAAb,EAAA,OAAAK,MAAAL,EAAA,OAAAY,IAAA;AADhCC,OAAA,oBAAA;GAAgB,WAAAR;aACdO;IACI;AAAAZ,IAAA,KAAAK;AAAAL,IAAA,KAAAY;AAAAZ,IAAA,KAAAa;OAAAA,MAAAb,EAAA;CAAA,IAAAc;AAAA,KAAAd,EAAA,OAAAO,MAAA;AAEJO,OAAA,oBAAA;GAAe,WAAA;aACb,oBAAA;IAAe,WAAA;cAA2DP;KAC5E;IAAM;AAAAP,IAAA,KAAAO;AAAAP,IAAA,MAAAc;OAAAA,MAAAd,EAAA;CAAA,IAAAe;AAAA,KAAAf,EAAA,QAAAW,YAAAX,EAAA,QAAAc,IAAA;AAHRC,OAAA,qBAAA;GAAe,WAAA;cACbD,IAGCH;IACG;AAAAX,IAAA,MAAAW;AAAAX,IAAA,MAAAc;AAAAd,IAAA,MAAAe;OAAAA,MAAAf,EAAA;CAAA,IAAAgB;AAAA,KAAAhB,EAAA,QAAAE,MAAAF,EAAA,QAAAa,MAAAb,EAAA,QAAAe,IAAA;AATRC,OAAA,qBAAA;GAAgB,WAAAd;cACdW,IAGAE;IAMI;AAAAf,IAAA,MAAAE;AAAAF,IAAA,MAAAa;AAAAb,IAAA,MAAAe;AAAAf,IAAA,MAAAgB;OAAAA,MAAAhB,EAAA;AAAA,QAVNgB;;;;;AC1BF,MAAaS,eAA+BE,OAAA;CAAA,MAAAC,IAAAC,EAAA,GAAA;CAAC,MAAA,EAAAR,SAAAC,aAAAC,SAAAC,YAAAG;CAGtB,MAAAG,KAAAT,QAAOU;CAGtB,MAAAC,KAAAV,eAAA;CAA0D,IAAAW;AAAA,KAAAL,EAAA,OAAAI,IAAA;AAFjDC,OAAAhB,GACT,gGACAe,GACD;AAAAJ,IAAA,KAAAI;AAAAJ,IAAA,KAAAK;OAAAA,MAAAL,EAAA;CAAA,IAAAM;AAAA,KAAAN,EAAA,OAAAP,QAAAc,OAAA;AAIDD,OAAA,oBAAA;GAAe,WAAA;aAA8Eb,QAAOc;IAAa;AAAAP,IAAA,KAAAP,QAAAc;AAAAP,IAAA,KAAAM;OAAAA,MAAAN,EAAA;CAAA,IAAAQ;AAAA,KAAAR,EAAA,OAAAP,QAAAgB,aAAA;AACjHD,OAAA,oBAAA;GAAe,WAAA;aAA2Df,QAAOgB;IAAmB;AAAAT,IAAA,KAAAP,QAAAgB;AAAAT,IAAA,KAAAQ;OAAAA,MAAAR,EAAA;CAAA,IAAAU;AAAA,KAAAV,EAAA,OAAAP,QAAAkB,MAAA;AACnGD,OAAAjB,QAAOkB,QACN,oBAAA;GAAe,WAAA;aACb,oBAAA;IAAS,MAAAlB,QAAOkB;cAAO;KACzB;IACD;AAAAX,IAAA,KAAAP,QAAAkB;AAAAX,IAAA,KAAAU;OAAAA,MAAAV,EAAA;CAAA,IAAAY;AAAA,KAAAZ,EAAA,OAAAP,QAAAU,MAAAH,EAAA,OAAAL,WAAAK,EAAA,QAAAJ,WAAAI,EAAA,QAAAK,MAAAL,EAAA,QAAAM,MAAAN,EAAA,QAAAQ,MAAAR,EAAA,QAAAU,IAAA;AAfHE,OAAA,qBAAA;GACmB,mBAAAV;GACN,WAAAG;GAIFV;GACKC,cAAAA;;IAEdU;IACAE;IACCE;;IAKG;AAAAV,IAAA,KAAAP,QAAAU;AAAAH,IAAA,KAAAL;AAAAK,IAAA,MAAAJ;AAAAI,IAAA,MAAAK;AAAAL,IAAA,MAAAM;AAAAN,IAAA,MAAAQ;AAAAR,IAAA,MAAAU;AAAAV,IAAA,MAAAY;OAAAA,MAAAZ,EAAA;AAAA,QAhBNY;;;;;ACPJ,MAAaS,qBAA+BC,OAAA;CAAA,MAAAC,IAAAC,EAAA,GAAA;CAAC,MAAA,EAAAP,UAAAC,WAAAC,MAAAM,IAAAL,WAAAM,OAAAJ;CAAuB,MAAAH,OAAAM,OAAAE,SAAA,KAAAF;CAAW,MAAAL,YAAAM,OAAAC,SAAA,QAAAD;CAAiB,IAAAE;AAAA,KAAAL,EAAA,OAAAL,aAAAK,EAAA,OAAAH,aAAAG,EAAA,OAAAJ,MAAA;AAC3ES,QAAAC,eAAA;AACjB,OAAIZ,eAAa,aAAY,QAEzB,4CACGG,YAAA,0CAAc,eAAoB,GAAlC,MACD,oBAAA;IAAW,OAAA;IAAoCD,OAAAA;IAAcA,QAAAA;IAAc,SAAA;IAAiB,MAAA;cAC1F,oBAAA;KACI,GAAA;KACG,MAAA;MAET;KAAM,IACL;AAIP,OAAIF,eAAa,aAAY,QAEzB,4CACGG,YAAA,0CAAc,eAAoB,GAAlC,MACD,qBAAA;IACSD,OAAAA;IACCA,QAAAA;IACA,SAAA;IACH,MAAA;IACC,OAAA;IACKD;eAEX,oBAAA;KAAY,UAAA;eACV,oBAAA;MACI,GAAA;MACG,MAAA;OAET;MACA,sBAAA,oBACE,oBAAA;KAAa,IAAA;eACX,oBAAA;MAAY,OAAA;MAAY,QAAA;MAAU,MAAA;OACpC;MACF,GACF;KAAM,IACL;AAIP,OAAID,eAAa,SAAQ,QAErB,4CACGG,YAAA,0CAAc,WAAgB,GAA9B,MACD,qBAAA;IAAW,OAAA;IAAoCD,OAAAA;IAAcA,QAAAA;IAAc,SAAA;IAAiB,MAAA;eAC1F,oBAAA;KACI,GAAA;KACG,MAAA;MAEP,sBAAA;KACI,GAAA;KACG,MAAA;MAET;KAAM,IACL;AAIP,OAAIF,eAAa,KAAI,QAEjB,4CACGG,YAAA,0CAAc,OAAY,GAA1B,MACD,oBAAA;IAAa,SAAA;IAAqBD,OAAAA;IAAcA,QAAAA;IAAiBD;cAC/D,oBAAA,UAAQ,GAAA,+nKACV;KAAM,IACL;AAIP,OAAID,eAAa,OAAM,QAEnB,4CACGG,YAAA,0CAAc,SAAc,GAA5B,MACD,qBAAA;IACSD,OAAAA;IACCA,QAAAA;IACA,SAAA;IACH,MAAA;IACC,OAAA;IACKD;eAEX,oBAAA;KAAY,UAAA;eACV,oBAAA;MACI,GAAA;MACG,MAAA;OAET;MACA,sBAAA,oBACE,oBAAA;KAAa,IAAA;eACX,oBAAA;MAAY,OAAA;MAAY,QAAA;MAAU,MAAA;OACpC;MACF,GACF;KAAM,IACL;AAIP,OAAID,eAAa,MAAK,QAElB,4CACGG,YAAA,0CAAc,QAAa,GAA3B,MACD,oBAAA;IAAa,SAAA;IAAqBD,OAAAA;IAAcA,QAAAA;IAAiBD;cAC/D,oBAAA,UAAQ,GAAA,24EACV;KAAM,IACL;;AAKRK,IAAA,KAAAL;AAAAK,IAAA,KAAAH;AAAAG,IAAA,KAAAJ;AAAAI,IAAA,KAAAK;OAAAA,MAAAL,EAAA;CAhHD,MAAAO,aAAmBF;CAqHQ,MAAAG,KAAA,CAACX;CAAS,IAAAY;AAAA,KAAAT,EAAA,OAAAH,aAAAG,EAAA,OAAAQ,IAAA;AAFtBC,OAAAnB,GAAG,yBAAyB;GAAA,2DACsBO;GAAS,qBAC/CW;GACtB,CAAC;AAAAR,IAAA,KAAAH;AAAAG,IAAA,KAAAQ;AAAAR,IAAA,KAAAS;OAAAA,MAAAT,EAAA;CAAA,IAAAU;AAAA,KAAAV,EAAA,OAAAN,YAAAM,EAAA,OAAAO,YAAA;AAEDG,OAAAH,WAAWb,SAAS;AAAAM,IAAA,KAAAN;AAAAM,IAAA,KAAAO;AAAAP,IAAA,KAAAU;OAAAA,MAAAV,EAAA;CAAA,IAAAW;AAAA,KAAAX,EAAA,QAAAS,MAAAT,EAAA,QAAAU,IAAA;AANvBC,OAAA,oBAAA;GACa,WAAAF;aAKVC;IACG;AAAAV,IAAA,MAAAS;AAAAT,IAAA,MAAAU;AAAAV,IAAA,MAAAW;OAAAA,MAAAX,EAAA;AAAA,QAPNW;;;;;AC1GJ,MAAMgB,eAAe,EACnBC,OAAO;CACLC,YAAY;CACZC,UAAU;CACZ,EACD;AAED,MAAMC,cAAc;CAClBC,QAAQ;CACRC,cAAc;CACdC,SAAS;CACV;AAED,MAAMC,iBAAiBC,OAAiBC,eAAuB;AAC7D,QAAOD,MAAME,MAAMC,SAAS;EAC1B,MAAM,CAACC,OAAOC,OAAOF,KAAKG,MAAM,IAAI,CAACC,KAAKC,QAAQC,SAASD,KAAK,GAAG,CAAC;AAEpE,MAAIH,QAAQK,OACV,QAAOT,cAAcG,SAASH,cAAcI;AAG9C,SAAOJ,cAAcG;GACrB;;AAGJ,MAAMO,sBAAsBR,SAAiB;CAC3C,MAAM,CAACC,SAASD,KAAKG,MAAM,IAAI,CAACC,KAAKC,QAAQC,SAASD,KAAK,GAAG,CAAC;AAC/D,QAAOJ;;AAGT,MAAaQ,eAA0CE,OAAA;CAAA,MAAAC,IAAAC,EAAA,GAAA;CAAC,MAAA,EAAA5B,MAAAC,UAAAC,aAAAwB;CAEtD,MAAAK,aADc3C,cAAc0C,MAAuB,KACtB,SAAVpC,UAAAC;CAAqC,IAAAqC;AAAA,KAAAL,EAAA,OAAAM,OAAAC,IAAA,4BAAA,EAAA;AACWF,OAAA,EAAE;AAAAL,IAAA,KAAAK;OAAAA,MAAAL,EAAA;CAArE,MAAA,CAAAQ,kBAAAC,uBAAgD7C,SAAmByC,GAAG;CACtE,MAAA,CAAAK,iBAAAC,sBAA8C/C,SAAyB,KAAK;CAC5E,MAAAgD,MAAYjD,OAAuB,KAAK;CAExC,MAAAkD,sBAA2BC,YAAA;AACzBH,qBAAmBG,QAAQ;AAC3BL,sBAAoBK,QAAO7B,MAAO;EAClC,MAAAC,aAAmBU,mBAAmBkB,QAAO7B,MAAM,GAAI;EACvD,MAAAG,OAAawB,IAAGG,SAAuBC,cAAC,sBAAsB9B,WAAU,IAAK;AAE7E,MAAIE,KACFA,MAAI6B,eAAgB;GAAAC,UAAY;GAAQC,OAAS;GAAU,CAAC;;CAK/C,MAAAC,KAAA;CAAsC,IAAAC;CAAA,IAAAC;AAAA,KAAAtB,EAAA,OAAAM,OAAAC,IAAA,4BAAA,EAAA;AAEjDc,OAAA,oBAAA;GAAe,WAAA;aAAgC;IAAe;AAC9DC,OAAA,oBAAA,SAAe,WAAA,WAAW;AAAAtB,IAAA,KAAAqB;AAAArB,IAAA,KAAAsB;QAAA;AAAAD,OAAArB,EAAA;AAAAsB,OAAAtB,EAAA;;CAAA,IAAAuB;AAAA,KAAAvB,EAAA,OAAA1B,UAAA;AAF5BiD,OAAA,qBAAA;GAAe,WAAA;;IACbF;IACAC;IACA,oBAAC;KAA4BhD;KAAoB,WAAA;KAAgB,MAAA;KAAI,WAAA;MACvE;;IAAM;AAAA0B,IAAA,KAAA1B;AAAA0B,IAAA,KAAAuB;OAAAA,MAAAvB,EAAA;CACS,MAAAwB,KAAA;CACZ,MAAAC,KAAAlD,YAAYA,SAAQmD,SAAU,KAC7B,oBAAA;EAAe,WAAA;YACZnD,SAAQiB,KAAKmC,WAAAC,UACZ,oBAAC;GAEUd,SAAAA;GACI,aAAAJ,oBAAoBI;GACxB,eAAMD,mBAAmBC,UAAO;GAChC,eAAMD,mBAAmBC,UAAO;KAJpCc,MAMR,CAAA;GAEJ;CAAA,IAAAC;AAAA,KAAA7B,EAAA,OAAAQ,kBAAA;AAUcqB,QAAAC,iBAAA;AACT,OAAI9C,cAAcwB,kBAAkBtB,aAAW,CAAA,QACtC;IAAA,oBACeA;IAAUT,OACvB;KAAAsD,YACO;KAA8BC,iBACzB;KACnB;IACD;AACF,UAEM;IAAA,oBACe9C;IAAUT,OACvB,EAAAsD,YACO,yBACd;IACD;;AACF/B,IAAA,KAAAQ;AAAAR,IAAA,KAAA6B;OAAAA,MAAA7B,EAAA;CAAA,IAAAiC;AAAA,KAAAjC,EAAA,OAAA3B,QAAA2B,EAAA,OAAA1B,YAAA0B,EAAA,OAAA6B,MAAA7B,EAAA,QAAAI,YAAA;AAxBH6B,OAAA,oBAAC;GACC,iBAAA;GACU3D;GACH8B,OAAAA;GACO5B;GACDI;GACb,WAAA;GACW,WAAAiD;aAmBVxD;IACiB;AAAA2B,IAAA,KAAA3B;AAAA2B,IAAA,KAAA1B;AAAA0B,IAAA,KAAA6B;AAAA7B,IAAA,MAAAI;AAAAJ,IAAA,MAAAiC;OAAAA,MAAAjC,EAAA;CAAA,IAAAkC;AAAA,KAAAlC,EAAA,QAAAY,OAAAZ,EAAA,QAAAiC,IAAA;AA5BtBC,QAAA,oBAAA;GAAe,WAAA;GAAuBtB;aACpCqB;IA4BI;AAAAjC,IAAA,MAAAY;AAAAZ,IAAA,MAAAiC;AAAAjC,IAAA,MAAAkC;OAAAA,OAAAlC,EAAA;CAAA,IAAAmC;AAAA,KAAAnC,EAAA,QAAAkC,OAAAlC,EAAA,QAAAyB,IAAA;AA5CRU,QAAA,qBAAA;GAAe,WAAAX;cACZC,IAcDS;IA8BI;AAAAlC,IAAA,MAAAkC;AAAAlC,IAAA,MAAAyB;AAAAzB,IAAA,MAAAmC;OAAAA,OAAAnC,EAAA;CAAA,IAAAoC;AAAA,KAAApC,EAAA,QAAAmC,OAAAnC,EAAA,QAAAuB,IAAA;AAnDRa,QAAA,qBAAA;GAAe,WAAAhB;cACbG,IAKAY;IA8CI;AAAAnC,IAAA,MAAAmC;AAAAnC,IAAA,MAAAuB;AAAAvB,IAAA,MAAAoC;OAAAA,OAAApC,EAAA;AAAA,QApDNoC;;AAnBmD,SAAAjC,MAAAkC,OAAA;AAAA,QACdA,MAAKnC;;;;;AC7B9C,MAAakD,eAA0CE,OAAA;CAAA,MAAAC,IAAAC,EAAA,GAAA;CAAC,MAAA,EAAAZ,SAAAE,OAAAC,UAAAE,UAAAC,QAAAC,SAAAN,aAAAS;AAStD,KAAI,CAACJ,OAAM,QAAS;CAAI,IAAAO;AAAA,KAAAF,EAAA,OAAAG,OAAAC,IAAA,4BAAA,EAAA;AASFF,OAAA,oBAAC,MAAI;AAAAF,IAAA,KAAAE;OAAAA,MAAAF,EAAA;CAAA,IAAAK;AAAA,KAAAL,EAAA,OAAAJ,SAAA;AAAdS,OAAA,CAAC;GAAAC,MAAQJ;GAAKK,SAAWX;GAAOY,OAAS;GAAS,CAAC;AAAAR,IAAA,KAAAJ;AAAAI,IAAA,KAAAK;OAAAA,MAAAL,EAAA;CAAA,IAAAS;AAAA,KAAAT,EAAA,OAAAX,WAAAW,EAAA,OAAAV,YAAAU,EAAA,OAAAN,UAAA;AAE5De,OAAA,oBAAC;GAAkBpB,MAAAA;GAAmBK;GAAoBJ;IAAY;AAAAU,IAAA,KAAAX;AAAAW,IAAA,KAAAV;AAAAU,IAAA,KAAAN;AAAAM,IAAA,KAAAS;OAAAA,MAAAT,EAAA;CAAA,IAAAU;AAAA,KAAAV,EAAA,OAAAJ,WAAAI,EAAA,OAAAR,YAAAQ,EAAA,OAAAK,MAAAL,EAAA,QAAAS,MAAAT,EAAA,QAAAT,OAAA;AARxEmB,OAAA,oBAAC;GACQnB;GACGC;GACI,cAAA;GACG,kBAAA;GACRI;GACA,SAAAS;aAETI;IACQ;AAAAT,IAAA,KAAAJ;AAAAI,IAAA,KAAAR;AAAAQ,IAAA,KAAAK;AAAAL,IAAA,MAAAS;AAAAT,IAAA,MAAAT;AAAAS,IAAA,MAAAU;OAAAA,MAAAV,EAAA;AAAA,QATVU;;;;;ACPJ,MAAawB,YAA4BE,OAAA;CAAA,MAAAC,IAAAC,EAAA,GAAA;CAAC,MAAA,EAAAZ,OAAAE,SAAAW,UAAAR,qBAAAC,qBAAAH,UAAAF,UAAAM,SAAAG;CAUxC,MAAA,CAAAI,QAAAC,aAA4BvB,SAAS,MAAM;CAC3C,MAAA,EAAAwB,gBAAAC,gBAAAC,sBAAAC,yBAAuF1B,mBAAmBc,KAAK;CAE/G,MAAA,CAAAa,SAAAC,cAA8B7B,SAAwB,KAAK;CAAA,IAAA8B;AAAA,KAAAX,EAAA,OAAAY,OAAAC,IAAA,4BAAA,EAAA;AACPF,OAAA,EAAE;AAAAX,IAAA,KAAAW;OAAAA,MAAAX,EAAA;CAAtD,MAAA,CAAAc,UAAAC,eAAgClC,SAAoB8B,GAAG;CAAA,IAAAK;AAAA,KAAAhB,EAAA,OAAAJ,KAAAqB,IAAA;AAEtBD,OAAA,YAAA;GAE/B,MAAAI,eAAqB,OADJ,MAAMD,MAAM,iBAAiBvB,KAAIqB,KAAM,EACrBI,MAAO;AAC1CX,cAAWU,aAAYX,QAAS;AAChCM,eAAYK,aAAYN,SAAU;;AACnCd,IAAA,KAAAJ,KAAAqB;AAAAjB,IAAA,KAAAgB;OAAAA,MAAAhB,EAAA;CALD,MAAAsB,eAAqBN;CAKR,IAAAO;CAAA,IAAAC;AAAA,KAAAxB,EAAA,OAAAJ,KAAAqB,MAAAjB,EAAA,OAAAsB,gBAAAtB,EAAA,OAAAG,QAAA;AAEHoB,aAAA;AACR,OAAI3B,KAAIqB,MAAJd,OACFmB,eAAc;;AAEfE,OAAA;GAAC5B,KAAIqB;GAAKd;GAAQmB;GAAa;AAAAtB,IAAA,KAAAJ,KAAAqB;AAAAjB,IAAA,KAAAsB;AAAAtB,IAAA,KAAAG;AAAAH,IAAA,KAAAuB;AAAAvB,IAAA,KAAAwB;QAAA;AAAAD,OAAAvB,EAAA;AAAAwB,OAAAxB,EAAA;;AAJlCpB,WAAU2C,IAIPC,GAAgC;CAAA,IAAAC;AAAA,KAAAzB,EAAA,OAAAG,QAAA;AAIpBsB,OAAAlD,GAAG,gCAAgC,EAAA,0BAClB4B,QAC3B,CAAC;AAAAH,IAAA,KAAAG;AAAAH,IAAA,KAAAyB;OAAAA,MAAAzB,EAAA;CAAA,IAAA0B;AAAA,KAAA1B,EAAA,QAAAX,OAAA;AAIqBqC,OAAArC,OAAKsC,aAAuB,CAAAC,QAAC,MAAM,IAAI;AAAA5B,IAAA,MAAAX;AAAAW,IAAA,MAAA0B;OAAAA,MAAA1B,EAAA;CAA/C,MAAA6B,KAAA,QAAQH;CAAyC,IAAAI;AAAA,KAAA9B,EAAA,QAAAX,OAAA;AAObyC,OAAAzC,OAAKsC,aAAe;AAAA3B,IAAA,MAAAX;AAAAW,IAAA,MAAA8B;OAAAA,MAAA9B,EAAA;CAAhD,MAAA+B,KAAA,4BAA4BD;CAAsB,IAAAE;CAAA,IAAAC;AAAA,KAAAjC,EAAA,QAAAY,OAAAC,IAAA,4BAAA,EAAA;AAGtDmB,cAAM5B,UAAU,KAAK;AAE9B6B,QAAA,oBAAC,cAAqB,WAAA,YAAY;AAAAjC,IAAA,MAAAgC;AAAAhC,IAAA,MAAAiC;QAAA;AAAAD,QAAAhC,EAAA;AAAAiC,QAAAjC,EAAA;;CAAA,IAAAkC;AAAA,KAAAlC,EAAA,QAAA+B,IAAA;AAPtCG,QAAA,oBAAA;GAAe,WAAA;aACb,oBAAC;IACc,eAAAH;IACL,SAAA;IACE,WAAA;IACD,SAAAC;cAETC;KAEJ;IAAM;AAAAjC,IAAA,MAAA+B;AAAA/B,IAAA,MAAAkC;OAAAA,OAAAlC,EAAA;CAAA,IAAAmC;AAAA,KAAAnC,EAAA,QAAAkC,OAAAlC,EAAA,QAAAX,SAAAW,EAAA,QAAAT,SAAA;AAVR4C,QAAA,oBAAC;GAAiB9C,MAAAA;GAAgBE;GAAmB,WAAA;aACnD2C;IAUW;AAAAlC,IAAA,MAAAkC;AAAAlC,IAAA,MAAAX;AAAAW,IAAA,MAAAT;AAAAS,IAAA,MAAAmC;OAAAA,OAAAnC,EAAA;CAAA,IAAAoC;AAAA,KAAApC,EAAA,QAAAV,UAAA;AAEZ8C,QAAA9C,YAAY,oBAAA;GAAe,WAAA;aAA2CA;IAAe;AAAAU,IAAA,MAAAV;AAAAU,IAAA,MAAAoC;OAAAA,OAAApC,EAAA;CAAA,IAAAqC;AAAA,KAAArC,EAAA,QAAAE,YAAAF,EAAA,QAAAT,SAAA;AACrF8C,QAAAnC,YACC,oBAAA;GAAe,WAAA;aACb,oBAAA;IACa,WAAA3B,GAAG,+CAA+C,EAAA,WAChDgB,YAAY,QACxB,CAAA;IAEAW;KAEL;IACD;AAAAF,IAAA,MAAAE;AAAAF,IAAA,MAAAT;AAAAS,IAAA,MAAAqC;OAAAA,OAAArC,EAAA;CAAA,IAAAsC;AAAA,KAAAtC,EAAA,QAAAL,uBAAAK,EAAA,QAAAM,kBAAAN,EAAA,QAAAO,sBAAA;AAGA+B,QAAA,CAAC3C,uBACA,oBAAC;GAAgB,MAAA;GAAmBW,UAAAA;GAAkCC,kBAAAA;IACvE;AAAAP,IAAA,MAAAL;AAAAK,IAAA,MAAAM;AAAAN,IAAA,MAAAO;AAAAP,IAAA,MAAAsC;OAAAA,OAAAtC,EAAA;CAAA,IAAAuC;AAAA,KAAAvC,EAAA,QAAAN,uBAAAM,EAAA,QAAAK,kBAAAL,EAAA,QAAAQ,sBAAA;AACA+B,QAAA,CAAC7C,uBACA,oBAAC;GAAgB,MAAA;GAAmBW,UAAAA;GAAkCG,kBAAAA;IACvE;AAAAR,IAAA,MAAAN;AAAAM,IAAA,MAAAK;AAAAL,IAAA,MAAAQ;AAAAR,IAAA,MAAAuC;OAAAA,OAAAvC,EAAA;CAAA,IAAAwC;AAAA,KAAAxC,EAAA,QAAAmC,OAAAnC,EAAA,QAAAoC,OAAApC,EAAA,QAAAqC,OAAArC,EAAA,QAAAsC,OAAAtC,EAAA,QAAAuC,KAAA;AAlCHC,QAAA,qBAAA;GAAe,WAAA;;IAEbL;IAaCC;IACAC;IAaAC;IAGAC;;IAGG;AAAAvC,IAAA,MAAAmC;AAAAnC,IAAA,MAAAoC;AAAApC,IAAA,MAAAqC;AAAArC,IAAA,MAAAsC;AAAAtC,IAAA,MAAAuC;AAAAvC,IAAA,MAAAwC;OAAAA,OAAAxC,EAAA;CAAA,IAAAyC;AAAA,KAAAzC,EAAA,QAAAwC,OAAAxC,EAAA,QAAA6B,IAAA;AAvCRY,QAAA,oBAAA;GACY,WAAA;GACG,eAAAZ;aAEbW;IAoCI;AAAAxC,IAAA,MAAAwC;AAAAxC,IAAA,MAAA6B;AAAA7B,IAAA,MAAAyC;OAAAA,OAAAzC,EAAA;CAAA,IAAA0C;AAAA,KAAA1C,EAAA,QAAAS,WAAAT,EAAA,QAAAc,YAAAd,EAAA,QAAAG,UAAAH,EAAA,QAAAR,YAAAQ,EAAA,QAAAV,YAAAU,EAAA,QAAAX,SAAAW,EAAA,QAAAT,SAAA;AAELmD,QAAAjC,WACC,oBAAC;GACWK;GACDL;GACFpB;GACGC;GACDC;GACCC;GACFW;GACC,eAAMC,UAAU,MAAK;IAEjC;AAAAJ,IAAA,MAAAS;AAAAT,IAAA,MAAAc;AAAAd,IAAA,MAAAG;AAAAH,IAAA,MAAAR;AAAAQ,IAAA,MAAAV;AAAAU,IAAA,MAAAX;AAAAW,IAAA,MAAAT;AAAAS,IAAA,MAAA0C;OAAAA,OAAA1C,EAAA;CAAA,IAAA2C;AAAA,KAAA3C,EAAA,QAAAyC,OAAAzC,EAAA,QAAA0C,OAAA1C,EAAA,QAAAyB,IAAA;AA1DHkB,QAAA,qBAAA;GACa,WAAAlB;cAIXgB,KA0CCC;IAYG;AAAA1C,IAAA,MAAAyC;AAAAzC,IAAA,MAAA0C;AAAA1C,IAAA,MAAAyB;AAAAzB,IAAA,MAAA2C;OAAAA,OAAA3C,EAAA;AAAA,QA3DN2C;;;;;AC9CJ,MAAaK,WAAUC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAC,MAAAC,aAAAJ;CAQG,MAAAK,KAAA,CAACF,KAAIG,OAAcC,UAAnB,CAAwBJ,KAAIK,cAAqBD;CACjD,MAAAE,KAAA,CAACN,KAAIO,YAAmBH,UAAxB,CAA6BJ,KAAIQ,mBAA0BJ;CAAA,IAAAK;AAAA,KAAAX,EAAA,OAAAE,KAAAU,YAAA;AAE/ED,OAAAT,KAAIU,cACH,oBAAA;GAAe,WAAA;aACb,oBAAA;IAAe,WAAA;cAAaV,KAAIU;KAClC;IACD;AAAAZ,IAAA,KAAAE,KAAAU;AAAAZ,IAAA,KAAAW;OAAAA,MAAAX,EAAA;CAAA,IAAAa;AAAA,KAAAb,EAAA,OAAAG,YAAAH,EAAA,OAAAE,QAAAF,EAAA,OAAAI,MAAAJ,EAAA,OAAAQ,MAAAR,EAAA,OAAAW,IAAA;AAbHE,OAAA,qBAAC;GACOX;GACE,SAAA;GACD,OAAAA,KAAIY;GACD,UAAAZ,KAAIa;GACJ,UAAAb,KAAIc;GACO,qBAAAZ;GACA,qBAAAI;cAEpBG,IAKAR;IACQ;AAAAH,IAAA,KAAAG;AAAAH,IAAA,KAAAE;AAAAF,IAAA,KAAAI;AAAAJ,IAAA,KAAAQ;AAAAR,IAAA,KAAAW;AAAAX,IAAA,KAAAa;OAAAA,MAAAb,EAAA;AAAA,QAfXa;;;;;ACHJ,MAAaQ,aAAyDE,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAC,MAAAC,aAAAJ;CAQ5C,MAAAK,KAAA,CAACF,KAAIG,OAAcC,UAAnB,CAAwBJ,KAAIK,cAAqBD;CACjD,MAAAE,KAAA,CAACN,KAAIO,YAAmBH,UAAxB,CAA6BJ,KAAIQ,mBAA0BJ;CAAA,IAAAK;AAAA,KAAAX,EAAA,OAAAG,YAAAH,EAAA,OAAAE,QAAAF,EAAA,OAAAI,MAAAJ,EAAA,OAAAQ,IAAA;AAPlFG,OAAA,oBAAC;GACOT;GACE,SAAA;GACD,OAAAA,KAAIU;GACD,UAAAV,KAAIW;GACJ,UAAAX,KAAIY;GACO,qBAAAV;GACA,qBAAAI;GAEpBL;IACQ;AAAAH,IAAA,KAAAG;AAAAH,IAAA,KAAAE;AAAAF,IAAA,KAAAI;AAAAJ,IAAA,KAAAQ;AAAAR,IAAA,KAAAW;OAAAA,MAAAX,EAAA;AAAA,QAVXW;;;;;ACFJ,MAAaQ,YAAuDE,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAC,MAAAC,aAAAJ;CAO1C,MAAAK,KAAA,CAACF,KAAIG,aAAaC;CAClB,MAAAC,KAAA,CAACL,KAAIM,YAAmBF;CAAA,IAAAG;AAAA,KAAAT,EAAA,OAAAG,YAAAH,EAAA,OAAAE,QAAAF,EAAA,OAAAI,MAAAJ,EAAA,OAAAO,IAAA;AAN/CE,OAAA,oBAAC;GACOP;GACE,SAAA;GACD,OAAAA,KAAIQ;GACD,UAAAR,KAAIS;GACO,qBAAAP;GACA,qBAAAG;GAEpBJ;IACQ;AAAAH,IAAA,KAAAG;AAAAH,IAAA,KAAAE;AAAAF,IAAA,KAAAI;AAAAJ,IAAA,KAAAO;AAAAP,IAAA,KAAAS;OAAAA,MAAAT,EAAA;AAAA,QATXS"}
1
+ {"version":3,"file":"index.js","names":["workbenchXPath","sidebarContainer","closePanelButton","bottomPanel","flows","dropdownFlow","flowId","feature","featureId","previewButton","stepId","node","endpoints","endpointsList","endpoint","method","path","callPanel","specButton","bodyTab","headersTab","paramsTab","callTab","response","playButton","tracing","trace","index","details","timeline","logs","container","searchContainer","traceColumn","row","states","links","Position","useReactFlow","useUpdateNodeInternals","BaseNodeProps","useHandlePositions","data","$","_c","reactFlow","updateNodeInternals","sourcePosition","nodeConfig","sourceHandlePosition","Bottom","Right","targetPosition","targetHandlePosition","Top","Left","t0","position","updateNode","id","updateSourcePosition","t1","position_0","updateTargetPosition","t2","newPosition","toggleTargetPosition","t3","newPosition_0","toggleSourcePosition","t4","HandleProps","Position","Handle","RFHandle","clsx","React","HTMLAttributes","Props","Omit","HTMLDivElement","isHidden","onTogglePosition","BaseHandle","FC","props","$","_c","position","rest","isHorizontal","Left","Right","t0","Top","t1","Bottom","t2","t3","t4","t5","t6","t7","Symbol","for","background","t8","t9","cn","cva","VariantProps","CalendarClock","CircleOff","Link2","Waypoints","React","PropsWithChildren","baseIcon","variants","variant","event","api","noop","cron","NodeIcon","t0","$","_c","t1","Symbol","for","t2","Props","text","className","NodeHeader","FC","children","t3","t4","t5","t6","t7","cn","React","Feature","Props","feature","highlighted","onClick","onHover","FeatureCard","FC","t0","$","_c","t1","id","t2","t3","t4","title","t5","description","t6","link","t7","cn","FC","EventNodeData","Props","language","className","size","showLabel","LanguageIndicator","t0","$","_c","t1","t2","undefined","t3","language_0","renderIcon","t4","t5","t6","t7","useThemeStore","React","useRef","useState","Prism","SyntaxHighlighter","oneDark","oneLight","Feature","FeatureCard","LanguageIndicator","CodeDisplayProps","code","language","features","codeTagProps","style","fontFamily","fontSize","customStyle","margin","borderRadius","padding","isHighlighted","lines","lineNumber","some","line","start","end","split","map","num","parseInt","undefined","getFirstLineNumber","CodeDisplay","FC","t0","$","_c","theme","_temp","themeStyle","t1","Symbol","for","highlightedLines","setHighlightedLines","selectedFeature","setSelectedFeature","ref","handleFeatureClick","feature","current","querySelector","scrollIntoView","behavior","block","t2","t3","t4","t5","t6","t7","length","feature_0","index","t8","lineNumber_0","borderLeft","backgroundColor","t9","t10","t11","t12","state","Sidebar","X","React","Feature","CodeDisplay","NodeSidebarProps","content","features","title","subtitle","variant","language","isOpen","onClose","NodeSidebar","FC","t0","$","_c","t1","Symbol","for","t2","icon","onClick","label","t3","t4","Button","cn","ScanSearch","React","PropsWithChildren","useCallback","useEffect","useState","useHandlePositions","Feature","BaseNodeProps","BaseHandle","NodeHeader","NodeSidebar","Props","title","subtitle","variant","language","className","disableSourceHandle","disableTargetHandle","data","BaseNode","FC","t0","$","_c","children","isOpen","setIsOpen","sourcePosition","targetPosition","toggleTargetPosition","toggleSourcePosition","content","setContent","t1","Symbol","for","features","setFeatures","t2","id","response","fetch","responseData","json","fetchContent","t3","t4","t5","t6","toLowerCase","replace","t7","t8","t9","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19","t20","t21","PropsWithChildren","BaseNode","ApiNodeProps","Props","ApiNode","t0","$","_c","data","children","t1","emits","length","virtualEmits","t2","subscribes","virtualSubscribes","t3","webhookUrl","t4","name","language","description","React","PropsWithChildren","BaseNode","EventNodeProps","EventNode","FC","t0","$","_c","data","children","t1","emits","length","virtualEmits","t2","subscribes","virtualSubscribes","t3","name","description","language","React","PropsWithChildren","BaseNode","NoopNodeProps","NoopNode","FC","t0","$","_c","data","children","t1","virtualEmits","length","t2","subscribes","t3","name","description"],"sources":["../src/components/tutorial/engine/workbench-xpath.ts","../src/hooks/use-update-handle-positions.ts","../src/publicComponents/base-node/base-handle.tsx","../src/publicComponents/base-node/node-header.tsx","../src/publicComponents/base-node/feature-card.tsx","../src/publicComponents/base-node/language-indicator.tsx","../src/publicComponents/base-node/code-display.tsx","../src/publicComponents/base-node/node-sidebar.tsx","../src/publicComponents/base-node/base-node.tsx","../src/publicComponents/api-node.tsx","../src/publicComponents/event-node.tsx","../src/publicComponents/noop-node.tsx"],"sourcesContent":["export const workbenchXPath = {\n sidebarContainer: '//div[@data-testid=\"sidebar-panel\"]',\n closePanelButton: '//div[@id=\"app-sidebar-container\"]//button[@data-testid=\"close-panel\"]',\n bottomPanel: '//div[@id=\"bottom-panel\"]',\n\n flows: {\n dropdownFlow: (flowId: string) => `//div[@data-testid=\"dropdown-${flowId}\"]`,\n feature: (featureId: string) => `//div[@data-feature-id=\"${featureId}\"]`,\n previewButton: (stepId: string) => `//button[@data-testid=\"open-code-preview-button-${stepId}\"]`,\n node: (stepId: string) => `//div[@data-testid=\"node-${stepId}\"]`,\n },\n\n endpoints: {\n endpointsList: '//div[@data-testid=\"endpoints-list\"]',\n endpoint: (method: string, path: string) => `//div[@data-testid=\"endpoint-${method}-${path}\"]`,\n callPanel: '//div[@data-testid=\"endpoint-details-panel\"]',\n specButton: '//button[@data-testid=\"endpoint-spec-button\"]',\n\n bodyTab: '//button[@data-testid=\"endpoint-body-tab\"]',\n headersTab: '//button[@data-testid=\"endpoint-headers-tab\"]',\n paramsTab: '//button[@data-testid=\"endpoint-params-tab\"]',\n\n callTab: '//button[@data-testid=\"endpoint-body-tab\"]', // deprecated\n response: '//div[@data-testid=\"endpoint-response-container\"]',\n playButton: '//button[@data-testid=\"endpoint-play-button\"]',\n },\n\n tracing: {\n trace: (index: number) => `(//button[contains(@class, 'motia-trace-group')])[${index}]`,\n details: '//div[@data-testid=\"trace-details\"]',\n timeline: (index: number) => `(//div[@data-testid=\"trace-timeline-item\"])[${index}]`,\n },\n\n logs: {\n container: '//div[@data-testid=\"logs-container\"]',\n searchContainer: '//div[@data-testid=\"logs-search-container\"]',\n traceColumn: (index: number) => `(//td[starts-with(@data-testid, 'trace')])[${index}]`,\n row: '//div[@data-testid=\"log-row\"]',\n },\n\n states: {\n container: '//div[@data-testid=\"states-container\"]',\n row: (index: number) => `(//tr[starts-with(@data-testid, 'item-')])[${index}]`,\n },\n\n links: {\n flows: '//div[@data-testid=\"flows-dropdown-trigger\"]',\n endpoints: '//button[@data-testid=\"endpoints-link\"]',\n tracing: '//button[@data-testid=\"tracing-link\"]',\n logs: '//button[@data-testid=\"logs-link\"]',\n states: '//button[@data-testid=\"states-link\"]',\n },\n}\n","import { Position, useReactFlow, useUpdateNodeInternals } from '@xyflow/react'\nimport type { BaseNodeProps } from '../publicComponents/node-props'\n\nexport const useHandlePositions = (data: BaseNodeProps) => {\n const reactFlow = useReactFlow()\n const updateNodeInternals = useUpdateNodeInternals()\n const sourcePosition = data.nodeConfig?.sourceHandlePosition === 'bottom' ? Position.Bottom : Position.Right\n const targetPosition = data.nodeConfig?.targetHandlePosition === 'top' ? Position.Top : Position.Left\n\n const updateSourcePosition = (position: 'bottom' | 'right') => {\n reactFlow.updateNode(data.id, {\n data: { ...data, nodeConfig: { ...data.nodeConfig, sourceHandlePosition: position } },\n })\n updateNodeInternals(data.id)\n }\n\n const updateTargetPosition = (position: 'top' | 'left') => {\n reactFlow.updateNode(data.id, {\n data: { ...data, nodeConfig: { ...data.nodeConfig, targetHandlePosition: position } },\n })\n updateNodeInternals(data.id)\n }\n\n const toggleTargetPosition = () => {\n const newPosition = targetPosition === Position.Top ? Position.Left : Position.Top\n updateTargetPosition(newPosition)\n }\n\n const toggleSourcePosition = () => {\n const newPosition = sourcePosition === Position.Bottom ? Position.Right : Position.Bottom\n updateSourcePosition(newPosition)\n }\n\n return {\n sourcePosition,\n targetPosition,\n updateSourcePosition,\n updateTargetPosition,\n toggleTargetPosition,\n toggleSourcePosition,\n }\n}\n","import { type HandleProps, Position, Handle as RFHandle } from '@xyflow/react'\nimport clsx from 'clsx'\nimport type React from 'react'\nimport type { HTMLAttributes } from 'react'\n\ntype Props = HandleProps &\n Omit<HTMLAttributes<HTMLDivElement>, 'id'> & {\n isHidden?: boolean\n onTogglePosition?: () => void\n }\n\nexport const BaseHandle: React.FC<Props> = (props) => {\n const { isHidden, position, onTogglePosition, ...rest } = props\n const isHorizontal = position === Position.Left || position === Position.Right\n\n return (\n <div\n className={clsx(\n 'absolute w-[6px] h-[6px]',\n position === Position.Top && '-top-[4px]',\n position === Position.Bottom && '-bottom-[4px]',\n position === Position.Left && '-left-[4px]',\n position === Position.Right && '-right-[4px]',\n isHorizontal ? 'top-1/2 -mt-[2px]' : 'left-1/2 -ml-[2px]',\n isHidden && 'hidden',\n )}\n onClick={onTogglePosition}\n >\n <RFHandle\n {...rest}\n position={position}\n style={{ background: 'rgb(30,118,231)' }}\n className=\"\n bg-white/50\n !static\n !w-[6px]\n !h-[6px]\n !min-w-[6px]\n !min-h-[6px]\n !p-0\n !border-none\n !transform-none\n !rounded-full\n !outline-none\n !shadow-none\n \"\n />\n </div>\n )\n}\n","import { cn } from '@motiadev/ui'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { CalendarClock, CircleOff, Link2, Waypoints } from 'lucide-react'\nimport type React from 'react'\nimport type { PropsWithChildren } from 'react'\n\nconst baseIcon = cva('rounded-md p-2', {\n variants: {\n variant: {\n event: 'bg-[rgba(30,118,231,0.2)] text-[rgb(30,118,231)]',\n api: 'dark:bg-[rgba(192,255,17,0.2)] dark:text-[rgb(192,255,17)] bg-[rgb(231,255,166)] text-[rgb(94,125,11)]',\n noop: 'bg-[rgba(239,18,229,0.2)] text-[rgb(239,18,229)]',\n cron: 'bg-[rgba(241,105,15,0.2)] text-[rgb(241,105,15)]',\n },\n },\n})\n\nconst NodeIcon = ({ variant }: { variant: VariantProps<typeof baseIcon>['variant'] }) => {\n if (variant === 'cron') {\n return <CalendarClock className=\"w-5 h-5\" />\n } else if (variant === 'api') {\n return <Link2 className=\"w-5 h-5\" />\n } else if (variant === 'noop') {\n return <CircleOff className=\"w-5 h-5\" />\n } else if (variant === 'event') {\n return <Waypoints className=\"w-5 h-5\" />\n }\n return <div className={cn(baseIcon({ variant }))}>Icon</div>\n}\n\ntype Props = PropsWithChildren<{\n text: string\n variant: VariantProps<typeof baseIcon>['variant']\n className?: string\n}>\n\nexport const NodeHeader: React.FC<Props> = ({ text, variant, children, className }) => (\n <div className={cn('flex items-center gap-2 p-2', className)}>\n <div className={baseIcon({ variant })}>\n <NodeIcon variant={variant} />\n </div>\n <div className=\"flex flex-1 justify-between items-start gap-4\">\n <div className=\"flex flex-col\">\n <div className=\"text-sm font-semibold leading-[1.25] tracking-[-0.25px]\">{text}</div>\n </div>\n {children}\n </div>\n </div>\n)\n","import { cn } from '@motiadev/ui'\nimport type React from 'react'\nimport type { Feature } from '../../types/file'\n\ntype Props = {\n feature: Feature\n highlighted: boolean\n onClick: () => void\n onHover: () => void\n}\n\nexport const FeatureCard: React.FC<Props> = ({ feature, highlighted, onClick, onHover }) => {\n return (\n <div\n data-feature-id={feature.id}\n className={cn(\n 'p-4 rounded-lg bg-card shadow-sm cursor-pointer hover:bg-card/50 border-2 border-transparent',\n highlighted && 'border-2 border-accent-1000 bg-accent-100',\n )}\n onClick={onClick}\n onMouseEnter={onHover}\n >\n <div className=\"text-md font-semibold text-foreground leading-tight whitespace-nowrap mb-2\">{feature.title}</div>\n <div className=\"text-sm font-medium text-muted-foreground leading-tight\">{feature.description}</div>\n {feature.link && (\n <div className=\"text-sm font-medium text-muted-foreground leading-tight\">\n <a href={feature.link}>Learn more</a>\n </div>\n )}\n </div>\n )\n}\n","import { cn } from '@motiadev/ui'\nimport type { FC } from 'react'\nimport type { EventNodeData } from '../../types/flow'\n\ntype Props = { language: EventNodeData['language']; className?: string; size?: number; showLabel?: boolean }\n\nexport const LanguageIndicator: FC<Props> = ({ language, className, size = 18, showLabel = false }) => {\n const renderIcon = (language?: string) => {\n if (language === 'typescript') {\n return (\n <>\n {showLabel ? <>TypeScript</> : null}\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M3 3V21H21V3H3ZM9 12H13.5V13.5H12V19.5H10.5V13.5H9V12ZM16.5 12H19.5V13.5H16.5V15H18C18.3975 15.0012 18.7783 15.1596 19.0593 15.4407C19.3404 15.7217 19.4988 16.1025 19.5 16.5V18C19.4988 18.3975 19.3404 18.7783 19.0593 19.0593C18.7783 19.3404 18.3975 19.4988 18 19.5H15V18H18V16.5H16.5C16.1025 16.4988 15.7217 16.3404 15.4407 16.0593C15.1596 15.7783 15.0012 15.3975 15 15V13.5C15.0012 13.1025 15.1596 12.7217 15.4407 12.4407C15.7217 12.1596 16.1025 12.0012 16.5 12Z\"\n fill=\"#0288D1\"\n />\n </svg>\n </>\n )\n }\n\n if (language === 'javascript') {\n return (\n <>\n {showLabel ? <>JavaScript</> : null}\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g clipPath=\"url(#clip0_42_2938)\">\n <path\n d=\"M0 0H20V20H0V0ZM18.3617 15.23C18.2158 14.3175 17.6217 13.5508 15.8592 12.8358C15.2458 12.5483 14.5642 12.3483 14.3617 11.8858C14.2858 11.6108 14.2742 11.4608 14.3233 11.2983C14.4483 10.76 15.0858 10.5983 15.5858 10.7483C15.9108 10.8483 16.2108 11.0983 16.3992 11.4983C17.2608 10.935 17.2608 10.935 17.8617 10.5608C17.6367 10.2108 17.525 10.06 17.3733 9.91083C16.8483 9.32333 16.1492 9.02333 15.0117 9.04917L14.4242 9.12333C13.8608 9.26083 13.3242 9.56083 12.9992 9.96083C12.0492 11.0367 12.3233 12.9117 13.4733 13.6867C14.6108 14.5367 16.2742 14.7233 16.4867 15.5242C16.6867 16.4992 15.7617 16.8117 14.8483 16.6992C14.1725 16.5492 13.7983 16.2108 13.3858 15.5858L11.8608 16.4617C12.0358 16.8617 12.2358 17.0358 12.5358 17.3858C13.9858 18.8492 17.6108 18.7742 18.2617 16.5492C18.2858 16.4742 18.4617 15.9617 18.3233 15.1742L18.3617 15.23ZM10.8758 9.1925H9.0025C9.0025 10.8075 8.995 12.4125 8.995 14.03C8.995 15.0567 9.0475 15.9992 8.88 16.2892C8.605 16.8633 7.89667 16.79 7.575 16.6892C7.245 16.5258 7.0775 16.3008 6.88333 15.9767C6.83083 15.8892 6.79167 15.8133 6.7775 15.8133L5.25667 16.7508C5.51083 17.2758 5.88167 17.7275 6.36 18.015C7.0725 18.44 8.03 18.5775 9.0325 18.3525C9.685 18.1642 10.2475 17.7767 10.5417 17.1767C10.9667 16.4017 10.8767 15.4517 10.8725 14.3883C10.8825 12.6767 10.8725 10.9642 10.8725 9.23917L10.8758 9.1925Z\"\n fill=\"white\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_42_2938\">\n <rect width=\"20\" height=\"20\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </>\n )\n }\n\n if (language === 'python') {\n return (\n <>\n {showLabel ? <>Python</> : null}\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M9.86 2C9.10148 2 8.37403 2.30132 7.83767 2.83767C7.30132 3.37403 7 4.10148 7 4.86V6.54H11.29C11.68 6.54 12 7.11 12 7.5H4.86C4.10148 7.5 3.37403 7.80132 2.83767 8.33767C2.30132 8.87403 2 9.60148 2 10.36V14.141C2 14.8995 2.30132 15.627 2.83767 16.1633C3.37403 16.6997 4.10148 17.001 4.86 17.001H6.04V14.321C6.03868 13.9459 6.11143 13.5742 6.25407 13.2273C6.3967 12.8803 6.60642 12.565 6.8712 12.2993C7.13598 12.0336 7.45061 11.8227 7.79704 11.6789C8.14347 11.535 8.51489 11.461 8.89 11.461H14.14C15.72 11.461 17 10.19 17 8.61V4.86C17 4.10148 16.6987 3.37403 16.1623 2.83767C15.626 2.30132 14.8985 2 14.14 2H9.86ZM9.14 3.61C9.54 3.61 9.86 3.73 9.86 4.32C9.86 4.91 9.54 5.211 9.14 5.211C8.75 5.211 8.43 4.911 8.43 4.321C8.43 3.731 8.75 3.61 9.14 3.61Z\"\n fill=\"#0288D1\"\n />\n <path\n d=\"M17.959 7V9.68C17.9602 10.055 17.8873 10.4266 17.7446 10.7734C17.602 11.1202 17.3922 11.4355 17.1274 11.7011C16.8627 11.9667 16.5481 12.1774 16.2017 12.3212C15.8554 12.465 15.484 12.539 15.109 12.539H9.86C9.48489 12.5377 9.11321 12.6104 8.76628 12.7531C8.41935 12.8957 8.10399 13.1054 7.83828 13.3702C7.57257 13.635 7.36175 13.9496 7.2179 14.296C7.07405 14.6425 7 15.0139 7 15.389V19.139C7 19.8975 7.30132 20.625 7.83767 21.1613C8.37403 21.6977 9.10148 21.999 9.86 21.999H14.14C14.8983 21.999 15.6256 21.6978 16.162 21.1617C16.6983 20.6255 16.9997 19.8983 17 19.14V17.46H12.709C12.319 17.46 12 16.89 12 16.5H19.14C19.8985 16.5 20.626 16.1987 21.1623 15.6623C21.6987 15.126 22 14.3985 22 13.64V9.86C22 9.10148 21.6987 8.37403 21.1623 7.83767C20.626 7.30132 19.8985 7 19.14 7H17.959ZM8.32 11.513L8.316 11.517L8.354 11.513H8.32ZM14.86 18.789C15.25 18.789 15.57 19.089 15.57 19.679C15.57 19.7722 15.5516 19.8646 15.516 19.9507C15.4803 20.0368 15.428 20.1151 15.362 20.181C15.2961 20.247 15.2178 20.2993 15.1317 20.335C15.0456 20.3706 14.9532 20.389 14.86 20.389C14.46 20.389 14.14 20.269 14.14 19.679C14.14 19.089 14.46 18.789 14.86 18.789Z\"\n fill=\"#FDD835\"\n />\n </svg>\n </>\n )\n }\n\n if (language === 'go') {\n return (\n <>\n {showLabel ? <>Go</> : null}\n <svg viewBox=\"0 0 128 128\" width={size} height={size} className={className}>\n <path d=\"M108.7 64.4c-1.6-1.2-3.8-1.9-6-1.9-.1-3.6-.2-7.2-.2-10.7-.1-9.5-.1-19.3-2.6-28.6 6.5-2.5 6.2-7.6 5.9-9.2-.7-3.8-4-7.9-9-7.9-1.9 0-3.9.6-5.8 1.9C83.4 1.6 73 .5 62.5.5 53 1.3 46.4 2.8 41 5.4c-2.3 1.1-4.2 2.4-6 3.9-1.8-1.1-3.7-1.7-5.5-1.7-5.1 0-8.8 4.1-9.4 8.1-.6 4 1.6 7.3 6 8.9-2.2 8.9-1.5 18.1-.7 27 .3 3.7.6 7.6.7 11.4h-.5c-2.3 0-4.6.7-6.3 1.9-.7.5-2.1 2-2 3.3 0 .4.2.9.9 1.3.2 2.1 1.5 2.4 2.3 2.4 1.6 0 3.4-1.1 3.9-1.5.5-.3.9-.5 1.2-.6l.5-.2c-.1 2.2-.3 4.5-.5 7-.9 11.7-2 25 3.9 34.6 1.2 1.9 2.6 3.6 4.3 5.1l-.9.6c-2.7 1.9-6.7 4.7-4.3 8.5v.1c.4.4.6.5.9.5h.1c.3.5.9 1.6 2.4 1.6.6 0 1.3-.2 2-.6 1.1-.6 2.1-1.4 3-2.2 1.5-1.3 3-2.6 5-2.9l.6-.1.7.3c6.4 2.6 12.9 3.3 17.3 3.4h2.6c7.7 0 14.8-1.2 20.5-3.5 1.2-.5 2.4-1.1 3.5-1.7 1.2.5 2.3 1.7 3.4 3 1.4 1.6 2.8 3.2 4.5 3.2.8 0 1.6-.4 2.4-1.1 1.2-.7 1.8-1.7 1.8-2.9 0-2.6-2.9-5.7-5.2-7.2 2-2 3.6-4.2 4.9-6.7 5.9-11.8 5-26.2 4.2-39l.5.3c.5.4 2.3 1.5 3.9 1.5.8 0 2.1-.3 2.3-2.4.7-.4.8-.9.9-1.3 0-1.3-1.4-2.8-2.1-3.3zm-17.1-56c1.7-1.1 3.4-1.7 5.2-1.7 4.4 0 7.7 3.7 8.3 7.3.6 3.7-1.4 6.8-5.4 8.4 0-.2-.1-.3-.2-.5l-.6-2.1-.3-.8-.9-2.4c0-.1 0-.1-.1-.2 0 0 0-.1-.1-.1-.4-.7-.7-1.4-1.1-2l-.2-.3-1.2-1.8c-.1-.1-.2-.2-.3-.4-.4-.5-.8-1-1.3-1.5-.1-.2-.3-.3-.5-.5l-1.2-1.2c.1.1 0-.1-.1-.2-.2zM26.3 23.9c-4-1.5-6.1-4.5-5.5-8.1.6-3.7 4-7.5 8.7-7.5 1.7 0 3.3.5 4.9 1.4l-.1.1-.3.3c-.5.5-1 1-1.4 1.5l-.3.3c-.5.6-1 1.2-1.5 1.9l-.2.3c-.5.7-.9 1.3-1.3 2 0 0 0 .1-.1.1-.4.7-.8 1.5-1.1 2.3 0 .2-.1.4-.1.5-.3.8-.7 1.6-.9 2.4 0 .1 0 .1-.1.2l-.6 2-.1.3zm-.9 45.2c-.3.1-.8.3-1.4.7-1 .7-2.4 1.4-3.5 1.4-.6 0-1.4-.2-1.6-1.7.5-.2 1-.4 1.4-.9.1-.2.1-.4-.1-.5-.2-.1-.4-.1-.5.1-.3.3-.6.5-1.1.6h-.1c-.3-.2-.5-.4-.6-.7.1-.9 1.1-2.1 1.8-2.7 1.6-1.2 3.7-1.8 5.9-1.8h.6v2.9l-.1 1c-.1 1.4-.2 1.4-.7 1.6zm15.8 52l.1.1c-1.9.5-3.4 1.7-4.8 2.9-.9.8-1.8 1.6-2.9 2.1-.6.4-1.1.5-1.6.5-1 0-1.5-.8-1.7-1.2.1-.8.5-1.5 1-2.2.3-.4.6-.9.8-1.4.1-.2 0-.4-.2-.5-.2-.1-.4 0-.5.2-.2.4-.5.8-.7 1.3-.4.7-.9 1.4-1.1 2.2h-.1c-.1 0-.2-.1-.4-.3-2-3.2 1.4-5.5 4.2-7.5l.9-.6h.2l.2.1 1.2.9.4.3c.4.3.8.6 1.3.9l.5.3 1.3.8.6.3c.4.3.8.5 1.3.8zm52.3-5.3c2.1 1.4 5 4.4 5 6.7 0 .8-.4 1.5-1.1 2-.1-.3-.2-.6-.4-.9-.3-.9-.7-1.9-1.5-2.6-.1-.1-.4-.1-.5 0-.1.1-.1.4 0 .5.7.6 1 1.5 1.3 2.4l.4 1.1c-.6.5-1.2.8-1.8.8-1.4 0-2.6-1.5-3.9-3-1-1.1-2-2.3-3.1-3l.3-.2c.3-.1.5-.3.7-.5l1.3-.9.8-.6 1.4-1.1c.2-.2.4-.4.7-.6.2.1.3 0 .4-.1zm4.7-7.5c-1.2 2.5-3.4 5.7-7.1 8.5l-.2.1c-.3.3-.7.5-1.1.8l-1.1.7-.2.1-1.6.9-.7.4c-5.4 2.8-12.8 4.8-23.2 4.8h-2.6c-8.1-.3-14.3-2-18.9-4.2h-.1c-1.1-.5-2.1-1.1-3.1-1.7-4.6-2.9-7.1-6.1-8.3-8-5.8-9.4-4.8-22.5-3.8-34.1.2-3 .5-5.7.6-8.4l.1-1.8.1-.1v-.1l-.1-.5V63c-.1-4-.4-7.7-.7-11.5-.8-9-1.5-18.4.9-27.4.2-.8.4-1.6.7-2.3v-.1l.1-.3c.1-.4.3-.8.5-1.2.1-.3.2-.5.3-.7l.3-.8.4-.8.3-.6c.1-.3.3-.6.4-.8.1-.2.2-.4.3-.5.2-.4.5-.8.7-1.1.2-.3.4-.6.6-.8.1-.2.2-.3.4-.5l.6-.8c.1-.1.2-.2.3-.4l.9-1 .1-.1 1.2-1.2.2-.2c7-6 17-7.8 27.1-8.6 5.9 0 13.5.3 20 2.7 3.2 1.2 6 2.8 8.4 4.9.3.3.6.6.9.8l.9.9 1 1.2.6.7 1 1.4.5.7.9 1.5.4.8c.3.6.5 1.3.7 2 0 .1.1.2.1.4.2.6.4 1.2.6 1.7l.1.3c3 9.9 3.1 20.2 3.1 30.4 0 3.5 0 7.4.2 10.4v.6c0 .9.1 1.8.1 2.5v.1l.1 1.9c0 .6.1 1.3.1 2v.3c.9 12.6 1.9 27.1-4 38.8zm11.2-40c-.5-.2-.9-.3-1.2-.7-.1-.2-.3-.2-.5-.1s-.2.3-.1.5c.4.5.9.7 1.4.9-.2 1.5-1 1.7-1.6 1.7-1.1 0-2.5-.7-3.5-1.4-.4-.3-.7-.4-1-.5l-.2-2.4c0-.4 0-.8-.1-1.1 0-.6-.1-1.3-.1-2 2.1.1 4.1.7 5.6 1.8.7.5 1.8 1.8 1.7 2.6.1.3-.1.6-.4.7zM77.7 7.2c-3.8 0-7.5 1.6-9.9 4.1-2.2 2.4-3.3 5.4-3.1 8.8v.1C66 27.4 72 30 76.8 30c4.2 0 8.1-1.8 10.4-4.7 2-2.5 2.7-5.8 1.8-9.3-1.5-6.4-6.8-8.8-11.3-8.8zm8.9 17.5c-2.1 2.7-5.9 4.3-9.9 4.3-2.7 0-5.2-.7-7.2-2.1-2.2-1.6-3.6-3.9-4.1-6.9-.2-3.2.8-6 2.9-8.2 2.3-2.5 5.8-3.9 9.4-3.9 4.2 0 9.2 2.1 10.6 8.1.8 3.4.2 6.4-1.7 8.7zm-27-5.5c-.4-7.3-6.2-10.6-11.8-10.6-4.1 0-7.9 1.7-10.3 4.5-2.1 2.6-2.8 5.9-2.1 9.6 1.6 6.3 7 8.5 11.5 8.5 3.8 0 7.4-1.5 9.8-4 2.1-2.2 3.1-5 2.9-8zM47 30.5c-4.2 0-9.3-2.1-10.8-8-.7-3.5 0-6.6 2-9 2.2-2.7 5.8-4.3 9.7-4.3 7.7 0 10.8 5.4 11.1 10 .2 2.9-.7 5.5-2.6 7.5-2.3 2.4-5.8 3.8-9.4 3.8zm-5.4-13.9c-1.9 0-3.5 1.7-3.5 3.8 0 2.1 1.6 3.8 3.5 3.8s3.5-1.7 3.5-3.8c0-2.1-1.6-3.8-3.5-3.8zm1.6 5.7c-.5 0-.8-.4-.8-1 0-.5.4-1 .8-1 .5 0 .8.4.8 1 0 .5-.4 1-.8 1zm27.9-6.6c-1.9 0-3.5 1.7-3.5 3.8 0 2.1 1.6 3.8 3.5 3.8s3.5-1.7 3.5-3.8c0-2.1-1.5-3.8-3.5-3.8zm1.6 5.6c-.5 0-.8-.4-.8-1 0-.5.4-1 .8-1 .5 0 .8.4.8 1s-.3 1-.8 1zm-4.2 9c.1-.3.1-.7 0-1.1-1.1-4.1-10.4-3.5-10.4 1.3 0-.4-.1-.6-.1-.8 0 .3.1.6.1.8-1.5.2-2.8 1.2-3.6 2.7-.7 1.4-.8 2.9-.1 4.2.6 1.1 1.6 1.7 2.8 1.7-.4 2.1 0 4.6 1 6 .5.7 1.2 1.1 1.8 1.1.9 0 1.9-.7 2.8-1.8.6 1 1.5 1.7 2.7 1.9h.2c.2-.1.4-.2.6-.2.7-.2 1.4-.5 1.9-1.3v-.1c.3-1.4.1-2.9 0-4.3l-.1-1.2c.5.2 1 .3 1.5.3 1 0 1.8-.4 2.5-1.2.9-1 1.2-2 1-3-.1-2.3-2.4-4-4.6-5zm-5.9 13.2c-.9 1.1-1.7 1.7-2.4 1.7-.5 0-.9-.3-1.3-.7-.9-1.2-1.3-3.7-.9-5.6l.5-.1h.2l.6-.1h.1l1.2-.4.6-.2c.1 0 .1 0 .2-.1.2-.1.3-.1.5-.1.2-.1.4-.1.7-.2h.2l-.1 1.3c-.1 1.3-.2 2.9-.1 4.5zm5.2-3.3c.1 1.3.2 2.7 0 4-.3.6-.8.7-1.5 1l-.6.2c-1-.2-1.8-.8-2.2-1.8-.2-1.5-.1-3 .1-4.6l.1-1.5h.1c1.1 0 2.1.5 3.1.9l.7.3c.1.4.2.9.2 1.5zm4.1-2.7c-.6.7-1.3 1-2 1-.6 0-1.1-.2-1.7-.4-.3-.1-.6-.2-.9-.4-1.1-.4-2.2-.9-3.4-.9h-1.3l-.4.1c-.1 0-.2 0-.3.1-.2 0-.3.1-.5.2-.1 0-.2 0-.2.1l-.8.3c-.1.1-.3.1-.4.1l-.3.1-.3.1c-.2.1-.3.1-.5.1-.1 0-.2 0-.3.1l-.5.1h-.2l-.6.1c-1 0-1.7-.4-2.2-1.3-.6-1-.6-2.3.1-3.5.7-1.2 1.9-2.1 3.1-2.3 1.2 2.5 8.1 2.2 9.9-.2 2 .9 4.2 2.5 4.5 4.2.2.7-.1 1.5-.8 2.3zM58 29.4z\"></path>\n </svg>\n </>\n )\n }\n\n if (language === 'ruby') {\n return (\n <>\n {showLabel ? <>Ruby</> : null}\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g clipPath=\"url(#clip0_42_2969)\">\n <path\n d=\"M16.7967 0.0691243C19.3242 0.506624 20.0408 2.23412 19.9875 4.04412L20 4.01829L18.8625 18.925L4.075 19.9383H4.08833C2.86083 19.8866 0.125 19.7741 0 15.9491L1.37083 13.4491L3.72 18.9375L4.13917 19.9141L6.47667 12.2941L6.45167 12.3L6.465 12.275L14.1775 14.7383L13.0142 10.2125L12.1892 6.96246L19.5392 6.48829L19.0267 6.06329L13.75 1.76162L16.7992 0.060791L16.7967 0.0691243ZM4.275 4.22746C7.2425 1.28329 11.0725 -0.456709 12.5433 1.02746C14.0117 2.50829 12.4558 6.11496 9.4825 9.05746C6.51333 12.0008 2.73 13.8358 1.2625 12.355C-0.209167 10.8741 1.3 7.17412 4.2725 4.22996L4.275 4.22746Z\"\n fill=\"white\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_42_2969\">\n <rect width=\"20\" height=\"20\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </>\n )\n }\n\n if (language === 'php') {\n return (\n <>\n {showLabel ? <>PHP</> : null}\n <svg viewBox=\"0 0 128 128\" width={size} height={size} className={className}>\n <path d=\"M64 30.332C28.654 30.332 0 45.407 0 64s28.654 33.668 64 33.668c35.345 0 64-15.075 64-33.668S99.346 30.332 64 30.332zm-5.982 9.81h7.293v.003l-1.745 8.968h6.496c4.087 0 6.908.714 8.458 2.139 1.553 1.427 2.017 2.017 3.737 3.737 5.946 1.719 2.209-2.209 2.209-5.928 0-8.137zm-51.051 51.372c0-3.757-1.072-5.686-3.214-5.791a6.03 6.03 0 00-2.495.409c-.646.231-1.082.461-1.311.692v8.968c1.371.86 2.588 1.26 3.649 1.197 2.247-.148 3.371-1.971 3.371-5.475zm2.643.157c0 1.909-.447 3.493-1.348 4.753-1.003 1.427-2.394 2.16-4.172 2.201-1.34.043-2.721-.378-4.142-1.258v8.151l-2.298-.82V107.14c.377-.462.862-.859 1.451-1.196 1.368-.798 3.031-1.207 4.987-1.228l.033.032c1.788-.022 3.166.712 4.134 2.201.902 1.366 1.355 3.117 1.355 5.257zm14.049 5.349c0 2.56-.257 4.333-.77 5.318-.516.986-1.497 1.773-2.945 2.359-1.174.463-2.444.714-3.808.757l-.38-1.448c1.386-.188 2.362-.378 2.928-.566 1.114-.377 1.878-.955 2.298-1.73.337-.631.503-1.835.503-3.618v-.599a11.809 11.809 0 01-4.941 1.068c-1.132 0-2.13-.354-2.99-1.068-.966-.777-1.449-1.764-1.449-2.958v-9.566l2.299-.787v9.63c0 1.028.332 1.82.996 2.376s1.524.822 2.578.803c1.054-.022 2.183-.431 3.382-1.228v-11.234h2.299v12.491zm8.973 1.479a9.457 9.457 0 01-.757.032c-1.3 0-2.314-.309-3.038-.93-.722-.622-1.084-1.479-1.084-2.573v-9.054h-1.574v-1.446h1.574v-3.84l2.296-.817v4.657h2.583v1.446h-2.583v8.991c0 .862.231 1.474.694 1.83.397.295 1.029.463 1.889.506v1.198zm13.917-.189h-2.298v-8.873c0-.902-.211-1.68-.631-2.329-.485-.734-1.159-1.102-2.024-1.102-1.054 0-2.372.556-3.954 1.668v10.636h-2.298V97.637l2.298-.725v9.659c1.469-1.068 3.073-1.604 4.816-1.604 1.218 0 2.203.41 2.958 1.228.757.817 1.134 1.836 1.134 3.053v9.597h-.001zm12.218-7.157c0-1.444-.274-2.636-.82-3.579-.649-1.149-1.657-1.756-3.021-1.818-2.52.146-3.778 1.951-3.778 5.412 0 1.587.262 2.912.79 3.976.674 1.356 1.685 2.024 3.033 2.002 2.531-.02 3.796-2.017 3.796-5.993zm2.518.015c0 2.055-.526 3.765-1.575 5.131-1.154 1.528-2.749 2.296-4.783 2.296-2.017 0-3.589-.768-4.723-2.296-1.028-1.366-1.542-3.076-1.542-5.131 0-1.932.556-3.556 1.668-4.879 1.174-1.403 2.718-2.107 4.627-2.107 1.909 0 3.463.704 4.66 2.107 1.111 1.323 1.668 2.947 1.668 4.879zm13.178 7.142h-2.299v-9.376c0-1.028-.31-1.831-.928-2.409-.619-.576-1.443-.855-2.472-.833-1.091.021-2.13.378-3.116 1.069v11.549h-2.299v-11.833c1.323-.963 2.54-1.592 3.652-1.886 1.049-.274 1.974-.41 2.771-.41.545 0 1.059.053 1.542.158.903.209 1.637.596 2.203 1.164.631.629.946 1.384.946 2.267v10.54z\"></path>\n </svg>\n </>\n )\n }\n\n return\n }\n return (\n <div\n className={cn('text-muted-foreground', {\n 'text-sm flex items-center justify-center flex-row gap-2': showLabel,\n 'font-mono text-xs': !showLabel,\n })}\n >\n {renderIcon(language)}\n </div>\n )\n}\n","import { useThemeStore } from '@motiadev/ui'\nimport type React from 'react'\nimport { useRef, useState } from 'react'\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'\nimport { oneDark, oneLight } from 'react-syntax-highlighter/dist/esm/styles/prism'\nimport type { Feature } from '../../types/file'\nimport { FeatureCard } from './feature-card'\nimport { LanguageIndicator } from './language-indicator'\n\ntype CodeDisplayProps = {\n code: string\n language?: string\n features?: Feature[]\n}\n\nconst codeTagProps = {\n style: {\n fontFamily: 'DM Mono, monospace',\n fontSize: '16px',\n },\n}\n\nconst customStyle = {\n margin: 0,\n borderRadius: 0,\n padding: 0,\n}\n\nconst isHighlighted = (lines: string[], lineNumber: number) => {\n return lines.some((line) => {\n const [start, end] = line.split('-').map((num) => parseInt(num, 10))\n\n if (end !== undefined) {\n return lineNumber >= start && lineNumber <= end\n }\n\n return lineNumber == start\n })\n}\n\nconst getFirstLineNumber = (line: string) => {\n const [start] = line.split('-').map((num) => parseInt(num, 10))\n return start\n}\n\nexport const CodeDisplay: React.FC<CodeDisplayProps> = ({ code, language, features }) => {\n const theme = useThemeStore((state) => state.theme)\n const themeStyle = theme === 'dark' ? oneDark : oneLight\n const [highlightedLines, setHighlightedLines] = useState<string[]>([])\n const [selectedFeature, setSelectedFeature] = useState<Feature | null>(null)\n const ref = useRef<HTMLDivElement>(null)\n\n const handleFeatureClick = (feature: Feature) => {\n setSelectedFeature(feature)\n setHighlightedLines(feature.lines)\n const lineNumber = getFirstLineNumber(feature.lines[0])\n const line = ref.current?.querySelector(`[data-line-number=\"${lineNumber}\"]`)\n\n if (line) {\n line.scrollIntoView({ behavior: 'smooth', block: 'center' })\n }\n }\n\n return (\n <div className=\"flex flex-col h-full overflow-hidden\">\n <div className=\"flex items-center py-2 px-5 dark:bg-[#1e1e1e] gap-2 justify-center\">\n <div className=\"text-sm text-muted-foreground\">Read only</div>\n <div className=\"flex-1\" />\n <LanguageIndicator language={language} className=\"w-4 h-4\" size={16} showLabel />\n </div>\n <div className=\"flex flex-row h-[calc(100%-36px)]\">\n {features && features.length > 0 && (\n <div className=\"flex flex-col gap-2 p-2 bg-card overflow-y-auto min-w-[200px] w-[300px]\">\n {features.map((feature, index) => (\n <FeatureCard\n key={index}\n feature={feature}\n highlighted={selectedFeature === feature}\n onClick={() => handleFeatureClick(feature)}\n onHover={() => handleFeatureClick(feature)}\n />\n ))}\n </div>\n )}\n\n <div className=\"overflow-y-auto\" ref={ref}>\n <SyntaxHighlighter\n showLineNumbers\n language={language}\n style={themeStyle}\n codeTagProps={codeTagProps}\n customStyle={customStyle}\n wrapLines\n lineProps={(lineNumber) => {\n if (isHighlighted(highlightedLines, lineNumber)) {\n return {\n 'data-line-number': lineNumber,\n style: {\n borderLeft: '2px solid var(--accent-1000)',\n backgroundColor: 'rgb(from var(--accent-1000) r g b / 0.2)',\n },\n }\n }\n\n return {\n 'data-line-number': lineNumber,\n style: {\n borderLeft: '2px solid transparent',\n },\n }\n }}\n >\n {code}\n </SyntaxHighlighter>\n </div>\n </div>\n </div>\n )\n}\n","import { Sidebar } from '@motiadev/ui'\nimport { X } from 'lucide-react'\nimport type React from 'react'\nimport type { Feature } from '../../types/file'\nimport { CodeDisplay } from './code-display'\n\ntype NodeSidebarProps = {\n content: string\n features: Feature[]\n title: string\n subtitle?: string\n variant: 'event' | 'api' | 'noop' | 'cron'\n language?: string\n isOpen: boolean\n onClose: () => void\n}\n\nexport const NodeSidebar: React.FC<NodeSidebarProps> = ({\n content,\n title,\n subtitle,\n language,\n isOpen,\n onClose,\n features,\n}) => {\n if (!isOpen) return null\n\n return (\n <Sidebar\n title={title}\n subtitle={subtitle}\n initialWidth={900}\n contentClassName=\"p-0 h-full gap-0\"\n onClose={onClose}\n actions={[{ icon: <X />, onClick: onClose, label: 'Close' }]}\n >\n <CodeDisplay code={content} language={language} features={features} />\n </Sidebar>\n )\n}\n","import { Button, cn } from '@motiadev/ui'\nimport { ScanSearch } from 'lucide-react'\nimport type React from 'react'\nimport { type PropsWithChildren, useCallback, useEffect, useState } from 'react'\nimport { useHandlePositions } from '../../hooks/use-update-handle-positions'\nimport type { Feature } from '../../types/file'\nimport type { BaseNodeProps } from '../node-props'\nimport { BaseHandle } from './base-handle'\nimport { NodeHeader } from './node-header'\nimport { NodeSidebar } from './node-sidebar'\n\ntype Props = PropsWithChildren<{\n title: string\n subtitle?: string\n variant: 'event' | 'api' | 'noop' | 'cron'\n language?: string\n className?: string\n disableSourceHandle?: boolean\n disableTargetHandle?: boolean\n data: BaseNodeProps\n}>\n\nexport const BaseNode: React.FC<Props> = ({\n title,\n variant,\n children,\n disableSourceHandle,\n disableTargetHandle,\n language,\n subtitle,\n data,\n}) => {\n const [isOpen, setIsOpen] = useState(false)\n const { sourcePosition, targetPosition, toggleTargetPosition, toggleSourcePosition } = useHandlePositions(data)\n\n const [content, setContent] = useState<string | null>(null)\n const [features, setFeatures] = useState<Feature[]>([])\n\n const fetchContent = useCallback(async () => {\n const response = await fetch(`/__motia/step/${data.id}`)\n const responseData = await response.json()\n setContent(responseData.content)\n setFeatures(responseData.features)\n }, [data.id])\n\n useEffect(() => {\n if (data.id && isOpen) {\n fetchContent()\n }\n }, [data.id, isOpen, fetchContent])\n\n return (\n <div\n className={cn('p-1 rounded-lg max-w-[350px]', {\n 'bg-muted-foreground/20': isOpen,\n })}\n >\n <div\n className=\"rounded-lg dark:bg-[#101010] bg-background border-1 border-muted-foreground/30 border-solid\"\n data-testid={`node-${title?.toLowerCase().replace(/ /g, '-')}`}\n >\n <div className=\"group relative\">\n {/* Main node content */}\n <NodeHeader text={title} variant={variant} className=\"border-b-2 border-muted-foreground/10\">\n <div className=\"flex justify-end\">\n <Button\n data-testid={`open-code-preview-button-${title?.toLowerCase()}`}\n variant=\"ghost\"\n className=\"h-5 p-0.5\"\n onClick={() => setIsOpen(true)}\n >\n <ScanSearch className=\"w-4 h-4\" />\n </Button>\n </div>\n </NodeHeader>\n\n {subtitle && <div className=\"py-4 px-6 text-sm text-muted-foreground\">{subtitle}</div>}\n {children && (\n <div className=\"p-2\">\n <div\n className={cn('space-y-3 p-4 text-sm text-muted-foreground', {\n 'bg-card': variant !== 'noop',\n })}\n >\n {children}\n </div>\n </div>\n )}\n\n {/* Connection points */}\n {!disableTargetHandle && (\n <BaseHandle type=\"target\" position={targetPosition} onTogglePosition={toggleTargetPosition} />\n )}\n {!disableSourceHandle && (\n <BaseHandle type=\"source\" position={sourcePosition} onTogglePosition={toggleSourcePosition} />\n )}\n </div>\n </div>\n\n {content && (\n <NodeSidebar\n features={features}\n content={content}\n title={title}\n subtitle={subtitle}\n variant={variant}\n language={language}\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n />\n )}\n </div>\n )\n}\n","import type { PropsWithChildren } from 'react'\nimport { BaseNode } from './base-node/base-node'\nimport type { ApiNodeProps } from './node-props'\n\ntype Props = PropsWithChildren<ApiNodeProps>\n\nexport const ApiNode = ({ data, children }: Props) => {\n return (\n <BaseNode\n data={data}\n variant=\"api\"\n title={data.name}\n language={data.language}\n subtitle={data.description}\n disableSourceHandle={!data.emits?.length && !data.virtualEmits?.length}\n disableTargetHandle={!data.subscribes?.length && !data.virtualSubscribes?.length}\n >\n {data.webhookUrl && (\n <div className=\"flex gap-1 items-center text-muted-foreground\">\n <div className=\"font-mono\">{data.webhookUrl}</div>\n </div>\n )}\n {children}\n </BaseNode>\n )\n}\n","import type React from 'react'\nimport type { PropsWithChildren } from 'react'\nimport { BaseNode } from './base-node/base-node'\nimport type { EventNodeProps } from './node-props'\n\nexport const EventNode: React.FC<PropsWithChildren<EventNodeProps>> = ({ data, children }) => {\n return (\n <BaseNode\n data={data}\n variant=\"event\"\n title={data.name}\n subtitle={data.description}\n language={data.language}\n disableSourceHandle={!data.emits?.length && !data.virtualEmits?.length}\n disableTargetHandle={!data.subscribes?.length && !data.virtualSubscribes?.length}\n >\n {children}\n </BaseNode>\n )\n}\n","import type React from 'react'\nimport type { PropsWithChildren } from 'react'\nimport { BaseNode } from './base-node/base-node'\nimport type { NoopNodeProps } from './node-props'\n\nexport const NoopNode: React.FC<PropsWithChildren<NoopNodeProps>> = ({ data, children }) => {\n return (\n <BaseNode\n data={data}\n variant=\"noop\"\n title={data.name}\n subtitle={data.description}\n disableSourceHandle={!data.virtualEmits.length}\n disableTargetHandle={!data.subscribes?.length}\n >\n {children}\n </BaseNode>\n )\n}\n"],"mappings":"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"}
@@ -657,9 +657,7 @@ const applyMiddleware = async ({ app, port, workbenchBase, plugins }) => {
657
657
  },
658
658
  resolve: { alias: {
659
659
  "@": path.resolve(__dirname, "./src"),
660
- "@/assets": path.resolve(__dirname, "./src/assets"),
661
- "lucide-react/dynamic": "lucide-react/dynamic.mjs",
662
- "lucide-react": "lucide-react/dist/cjs/lucide-react.js"
660
+ "@/assets": path.resolve(__dirname, "./src/assets")
663
661
  } },
664
662
  plugins: [
665
663
  react(),
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","names":["path","normalizePath","filePath","replace","isLocalPlugin","packageName","startsWith","resolveLocalPath","join","process","cwd","resolveNpmPath","ResolvedPackage","WorkbenchPlugin","isLocalPlugin","normalizePath","resolveLocalPath","resolveNpmPath","resolvePluginPackage","plugin","packageName","local","resolvedPath","isLocal","alias","createAliasConfig","plugins","Record","uniquePackages","Array","from","Set","map","p","aliases","resolved","resolveAllPlugins","getUniquePackageNames","getUniquePackageNames","WorkbenchPlugin","generateImports","packages","map","packageName","index","join","generatePackageMap","entries","generatePluginLogic","plugins","JSON","stringify","generatePluginCode","length","imports","packageMap","logic","generateCssImports","cssImports","flatMap","plugin","filter","cssImport","trim","isValidCode","code","WorkbenchPlugin","packageName","componentName","position","label","labelIcon","cssImports","props","Record","ValidationResult","valid","errors","warnings","plugin","PluginContext","plugins","server","ResolvedPackage","resolvedPath","isLocal","alias","VirtualModuleExports","ProcessedPlugin","component","isValidPosition","CONSTANTS","VIRTUAL_MODULE_ID","RESOLVED_VIRTUAL_MODULE_ID","LOG_PREFIX","DEFAULTS","POSITION","const","LABEL","ICON","PROPS","Printer","path","HmrContext","ModuleNode","resolvePluginPackage","WorkbenchPlugin","CONSTANTS","isLocalPlugin","normalizePath","WATCHED_EXTENSIONS","isConfigFile","file","normalizedFile","endsWith","shouldInvalidatePlugins","plugins","absoluteFile","isAbsolute","resolve","process","cwd","hasWatchedExtension","some","ext","plugin","packageName","resolved","pluginAbsolutePath","resolvedPath","normalizedPluginPath","sep","startsWith","handlePluginHotUpdate","ctx","printer","server","timestamp","printPluginLog","printPluginWarn","ws","send","type","virtualModule","moduleGraph","getModuleById","RESOLVED_VIRTUAL_MODULE_ID","invalidateModule","Set","modulesToUpdateSet","processedModules","importer","importers","has","add","modulesToUpdate","Array","from","length","existsSync","z","ValidationResult","WorkbenchPlugin","CONSTANTS","isValidPosition","isLocalPlugin","resolveLocalPath","WorkbenchPluginSchema","object","packageName","string","min","refine","name","startsWith","test","message","componentName","optional","position","enum","pos","undefined","label","labelIcon","cssImports","array","props","record","any","validatePluginConfig","plugin","index","errors","warnings","valid","result","safeParse","success","error","issues","forEach","err","core","$ZodIssue","path","join","push","validatedPlugin","data","resolvedPath","DEFAULTS","LABEL","ICON","POSITION","Object","keys","length","cssImport","cssIndex","trim","validatePlugins","plugins","options","failFast","allErrors","allWarnings","validatedPlugins","Array","isArray","console","warn","i","packageNames","map","p","duplicates","filter","indexOf","uniqueDuplicates","Set","dup","log","Printer","path","Plugin","ViteDevServer","generateCssImports","generatePluginCode","isValidCode","handlePluginHotUpdate","createAliasConfig","resolvePluginPackage","WorkbenchPlugin","CONSTANTS","isLocalPlugin","normalizePath","validatePlugins","printer","process","cwd","motiaPluginsPlugin","plugins","devServer","validationResult","failFast","valid","printPluginError","err","errors","Error","warnings","length","warning","printPluginWarn","error","alias","printPluginLog","name","enforce","buildStart","config","resolve","configureServer","server","configPaths","join","configPath","watcher","add","localPlugins","filter","p","packageName","plugin","resolved","watchPath","resolvedPath","on","file","normalizedFile","resolveId","id","VIRTUAL_MODULE_ID","RESOLVED_VIRTUAL_MODULE_ID","load","code","transform","normalizedId","endsWith","cssImports","map","handleHotUpdate","ctx","modulesToUpdate","merged","Array","from","Set","modules","buildEnd","react","Express","NextFunction","Request","Response","fs","path","fileURLToPath","createServer","createViteServer","motiaPluginsPlugin","WorkbenchPlugin","workbenchBasePlugin","workbenchBase","name","transformIndexHtml","html","replace","JSON","stringify","processCwdPlugin","cwd","process","reoPlugin","isAnalyticsEnabled","env","MOTIA_ANALYTICS_DISABLED","ApplyMiddlewareParams","app","port","plugins","__dirname","dirname","import","meta","url","applyMiddleware","vite","appType","root","base","server","middlewareMode","allowedHosts","host","hmr","allow","join","resolve","alias","assetsInclude","use","middlewares","req","res","next","originalUrl","index","readFileSync","status","set","end","e"],"sources":["../motia-plugin/utils.ts","../motia-plugin/resolver.ts","../motia-plugin/generator.ts","../motia-plugin/types.ts","../motia-plugin/hmr.ts","../motia-plugin/validator.ts","../motia-plugin/index.ts","../middleware.ts"],"sourcesContent":["import path from 'path'\n\n/**\n * Normalizes a file path by replacing backslashes with forward slashes.\n * This is useful for consistent path comparisons across different operating systems.\n *\n * @param filePath - The file path to normalize\n * @returns The normalized file path with forward slashes\n *\n * @example\n * ```ts\n * normalizePath('C:\\\\Users\\\\file.ts') // Returns: 'C:/Users/file.ts'\n * normalizePath('/Users/file.ts') // Returns: '/Users/file.ts'\n * ```\n */\nexport function normalizePath(filePath: string): string {\n return filePath.replace(/\\\\/g, '/')\n}\n\n/**\n * Checks if a package name represents a local plugin (starts with ~/).\n *\n * @param packageName - The package name to check\n * @returns True if the package is a local plugin\n *\n * @example\n * ```ts\n * isLocalPlugin('~/plugins/my-plugin') // Returns: true\n * isLocalPlugin('@my-org/my-plugin') // Returns: false\n * isLocalPlugin('my-plugin') // Returns: false\n * ```\n */\nexport function isLocalPlugin(packageName: string): boolean {\n return packageName.startsWith('~/')\n}\n\n/**\n * Resolves a local plugin path to an absolute path.\n * Strips the ~/ prefix and joins with the current working directory.\n *\n * @param packageName - The local plugin package name (must start with ~/)\n * @returns The absolute path to the local plugin\n *\n * @example\n * ```ts\n * // If cwd is /Users/project\n * resolveLocalPath('~/plugins/my-plugin')\n * // Returns: '/Users/project/plugins/my-plugin'\n * ```\n */\nexport function resolveLocalPath(packageName: string): string {\n return path.join(process.cwd(), packageName.replace('~/', ''))\n}\n\n/**\n * Resolves an npm package path to the node_modules directory.\n *\n * @param packageName - The npm package name\n * @returns The absolute path to the package in node_modules\n *\n * @example\n * ```ts\n * // If cwd is /Users/project\n * resolveNpmPath('@my-org/my-plugin')\n * // Returns: '/Users/project/node_modules/@my-org/my-plugin'\n * ```\n */\nexport function resolveNpmPath(packageName: string): string {\n return path.join(process.cwd(), 'node_modules', packageName)\n}\n","import type { ResolvedPackage, WorkbenchPlugin } from './types'\nimport { isLocalPlugin, normalizePath, resolveLocalPath, resolveNpmPath } from './utils'\n\n/**\n * Resolves a plugin package to its absolute path and creates an alias.\n *\n * @param plugin - The plugin configuration to resolve\n * @returns Resolved package information including path and alias\n *\n * @example\n * ```ts\n * // Local plugin\n * resolvePluginPackage({ packageName: '~/plugins/my-plugin' })\n * // Returns: {\n * // packageName: '~/plugins/my-plugin',\n * // resolvedPath: '/Users/project/plugins/my-plugin',\n * // isLocal: true,\n * // alias: '~/plugins/my-plugin'\n * // }\n *\n * // NPM package\n * resolvePluginPackage({ packageName: '@org/plugin' })\n * // Returns: {\n * // packageName: '@org/plugin',\n * // resolvedPath: '/Users/project/node_modules/@org/plugin',\n * // isLocal: false,\n * // alias: '@org/plugin'\n * // }\n * ```\n */\nexport function resolvePluginPackage(plugin: WorkbenchPlugin): ResolvedPackage {\n const { packageName } = plugin\n const local = isLocalPlugin(packageName)\n\n const resolvedPath = local ? resolveLocalPath(packageName) : resolveNpmPath(packageName)\n\n return {\n packageName,\n resolvedPath: normalizePath(resolvedPath),\n isLocal: local,\n alias: packageName,\n }\n}\n\n/**\n * Resolves all plugin packages and creates a Vite alias configuration.\n *\n * @param plugins - Array of plugin configurations\n * @returns Vite alias configuration object\n *\n * @example\n * ```ts\n * const plugins = [\n * { packageName: '~/plugins/local' },\n * { packageName: '@org/npm-plugin' }\n * ]\n * const aliases = createAliasConfig(plugins)\n * // Returns: {\n * // '~/plugins/local': '/Users/project/plugins/local',\n * // '@org/npm-plugin': '/Users/project/node_modules/@org/npm-plugin'\n * // }\n * ```\n */\nexport function createAliasConfig(plugins: WorkbenchPlugin[]): Record<string, string> {\n // Get unique package names to avoid duplicate aliases\n const uniquePackages = Array.from(new Set(plugins.map((p) => p.packageName)))\n\n const aliases: Record<string, string> = {}\n\n for (const packageName of uniquePackages) {\n const resolved = resolvePluginPackage({ packageName } as WorkbenchPlugin)\n aliases[packageName] = resolved.resolvedPath\n }\n\n return aliases\n}\n\n/**\n * Resolves all plugins and returns their resolved package information.\n *\n * @param plugins - Array of plugin configurations\n * @returns Array of resolved package information\n */\nexport function resolveAllPlugins(plugins: WorkbenchPlugin[]): ResolvedPackage[] {\n return plugins.map((plugin) => resolvePluginPackage(plugin))\n}\n\n/**\n * Gets the unique set of package names from plugins.\n *\n * @param plugins - Array of plugin configurations\n * @returns Array of unique package names\n */\nexport function getUniquePackageNames(plugins: WorkbenchPlugin[]): string[] {\n return Array.from(new Set(plugins.map((p) => p.packageName)))\n}\n","import { getUniquePackageNames } from './resolver'\nimport type { WorkbenchPlugin } from './types'\n\n/**\n * Generates import statements for all unique plugin packages.\n *\n * @param packages - Array of unique package names\n * @returns JavaScript code string with import statements\n *\n * @example\n * ```ts\n * generateImports(['@org/plugin-1', '~/plugins/local'])\n * // Returns:\n * // import * as plugin_0 from '@org/plugin-1'\n * // import * as plugin_1 from '~/plugins/local'\n * ```\n */\nexport function generateImports(packages: string[]): string {\n return packages.map((packageName, index) => `import * as plugin_${index} from '${packageName}'`).join('\\n')\n}\n\n/**\n * Generates the package map that links package names to their imported modules.\n *\n * @param packages - Array of unique package names\n * @returns JavaScript code string defining the package map\n *\n * @example\n * ```ts\n * generatePackageMap(['@org/plugin-1', '~/plugins/local'])\n * // Returns: const packageMap = {'@org/plugin-1': plugin_0,'~/plugins/local': plugin_1}\n * ```\n */\nexport function generatePackageMap(packages: string[]): string {\n const entries = packages.map((packageName, index) => `'${packageName}': plugin_${index}`)\n return `const packageMap = {${entries.join(',')}}`\n}\n\n/**\n * Generates the plugin transformation logic that processes plugin configurations.\n *\n * @param plugins - Array of plugin configurations\n * @returns JavaScript code string with plugin processing logic\n */\nexport function generatePluginLogic(plugins: WorkbenchPlugin[]): string {\n return `\n const motiaPlugins = ${JSON.stringify(plugins)}\n\n export const plugins = motiaPlugins.map((plugin) => {\n const component = packageMap[plugin.packageName]\n const config = component.config || {}\n const componentName = config.componentName || plugin.componentName\n\n return {\n label: plugin.label || config.label || 'Plugin label',\n labelIcon: plugin.labelIcon || config.labelIcon || 'toy-brick',\n position: plugin.position || config.position || 'top',\n props: plugin.props || config.props || {},\n component: componentName ? component[componentName] : component.default,\n }\n })\n`\n}\n\n/**\n * Generates the complete virtual module code for all plugins.\n * This is the main code generation function that combines all parts.\n *\n * @param plugins - Array of plugin configurations\n * @returns Complete JavaScript code string for the virtual module\n *\n * @example\n * ```ts\n * const plugins = [\n * { packageName: '@test/plugin', label: 'Test' }\n * ]\n * const code = generatePluginCode(plugins)\n * // Returns complete module code with imports, map, and logic\n * ```\n */\nexport function generatePluginCode(plugins: WorkbenchPlugin[]): string {\n if (!plugins || plugins.length === 0) {\n return 'export const plugins = []'\n }\n\n const packages = getUniquePackageNames(plugins)\n const imports = generateImports(packages)\n const packageMap = generatePackageMap(packages)\n const logic = generatePluginLogic(plugins)\n\n return `${imports}\n${packageMap}\n${logic}`\n}\n\n/**\n * Generates CSS imports for plugins that specify cssImports.\n *\n * @param plugins - Array of plugin configurations\n * @returns CSS import statements as a string\n *\n * @example\n * ```ts\n * const plugins = [\n * { packageName: '@test/plugin', cssImports: ['styles.css', 'theme.css'] }\n * ]\n * generateCssImports(plugins)\n * // Returns:\n * // @import 'styles.css';\n * // @import 'theme.css';\n * ```\n */\nexport function generateCssImports(plugins: WorkbenchPlugin[]): string {\n const cssImports = plugins\n .flatMap((plugin) => plugin.cssImports || [])\n .filter((cssImport) => cssImport && cssImport.trim() !== '')\n .map((cssImport) => `@import '${cssImport}';`)\n\n return cssImports.join('\\n')\n}\n\n/**\n * Checks if the generated code is valid (non-empty and has content).\n *\n * @param code - The generated code to check\n * @returns True if code is valid\n */\nexport function isValidCode(code: string): boolean {\n return typeof code === 'string' && code.trim().length > 0\n}\n","/**\n * Configuration for a single workbench plugin.\n * This interface defines how plugins are registered and configured in the Motia workbench.\n */\nexport interface WorkbenchPlugin {\n /**\n * The package name or local path to the plugin.\n * - For npm packages: use the package name (e.g., '@my-org/my-plugin')\n * - For local plugins: use the tilde prefix (e.g., '~/plugins/my-plugin')\n */\n packageName: string\n\n /**\n * Optional named export to use from the plugin package.\n * If not specified, the default export will be used.\n * Can be overridden by the plugin's own config.\n */\n componentName?: string\n\n /**\n * Position where the plugin tab should appear in the workbench.\n * - 'top': Display in the top tab bar\n * - 'bottom': Display in the bottom tab bar\n * @default 'top'\n */\n position?: 'top' | 'bottom'\n\n /**\n * Display label for the plugin tab.\n * Can be overridden by the plugin's own config.\n */\n label?: string\n\n /**\n * Icon name from lucide-react to display next to the label.\n * Can be overridden by the plugin's own config.\n * @default 'toy-brick'\n */\n labelIcon?: string\n\n /**\n * Array of CSS package imports to inject into the workbench.\n * These will be added to the main index.css file.\n * Example: ['@my-org/my-plugin/styles.css']\n */\n cssImports?: string[]\n\n /**\n * Props to pass to the plugin component when it's rendered.\n * Can be overridden by the plugin's own config.\n */\n props?: Record<string, any>\n}\n\n/**\n * Result of validating a plugin configuration.\n */\nexport interface ValidationResult {\n /**\n * Whether the validation passed\n */\n valid: boolean\n\n /**\n * Array of error messages if validation failed\n */\n errors: string[]\n\n /**\n * Array of warning messages for non-critical issues\n */\n warnings: string[]\n\n /**\n * The validated and normalized plugin configuration (if valid)\n */\n plugin?: WorkbenchPlugin\n}\n\n/**\n * Context object passed to various plugin internals functions.\n * Contains shared state and configuration.\n */\nexport interface PluginContext {\n /**\n * Array of plugin configurations\n */\n plugins: WorkbenchPlugin[]\n\n /**\n * Vite dev server instance (only available in dev mode)\n */\n server?: any\n}\n\n/**\n * Package resolution result.\n */\nexport interface ResolvedPackage {\n /**\n * The original package name from the configuration\n */\n packageName: string\n\n /**\n * Resolved absolute path to the package\n */\n resolvedPath: string\n\n /**\n * Whether this is a local plugin (starts with ~/)\n */\n isLocal: boolean\n\n /**\n * Alias to use for imports\n */\n alias: string\n}\n\n/**\n * Generated virtual module exports interface.\n * This is what consumers will import from 'virtual:motia-plugins'.\n */\nexport interface VirtualModuleExports {\n /**\n * Array of processed plugin configurations ready to be registered\n */\n plugins: ProcessedPlugin[]\n}\n\n/**\n * A plugin configuration after processing and normalization.\n * This is the format used by the workbench to register tabs.\n */\nexport interface ProcessedPlugin {\n /**\n * Display label for the plugin tab\n */\n label: string\n\n /**\n * Icon name from lucide-react\n */\n labelIcon: string\n\n /**\n * Position in the workbench ('top' or 'bottom')\n */\n position: 'top' | 'bottom'\n\n /**\n * Props to pass to the component\n */\n props: Record<string, any>\n\n /**\n * The React component to render\n */\n component: any\n}\n\n/**\n * Type guard to check if position is valid.\n */\nexport function isValidPosition(position: any): position is 'top' | 'bottom' {\n return position === 'top' || position === 'bottom'\n}\n\n/**\n * Constants used throughout the plugin system.\n */\nexport const CONSTANTS = {\n /**\n * Virtual module ID for importing plugins\n */\n VIRTUAL_MODULE_ID: 'virtual:motia-plugins',\n\n /**\n * Resolved virtual module ID (with null byte prefix for Vite)\n */\n RESOLVED_VIRTUAL_MODULE_ID: '\\0virtual:motia-plugins',\n\n /**\n * Log prefix for all plugin messages\n */\n LOG_PREFIX: '[motia-plugins]',\n\n /**\n * Default values for optional plugin fields\n */\n DEFAULTS: {\n POSITION: 'top' as const,\n LABEL: 'Plugin label',\n ICON: 'toy-brick',\n PROPS: {},\n },\n} as const\n","import type { Printer } from '@motiadev/core'\nimport path from 'path'\nimport type { HmrContext, ModuleNode } from 'vite'\nimport { resolvePluginPackage } from './resolver'\nimport type { WorkbenchPlugin } from './types'\nimport { CONSTANTS } from './types'\nimport { isLocalPlugin, normalizePath } from './utils'\n\nconst WATCHED_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.css', '.scss', '.less']\n\nexport function isConfigFile(file: string): boolean {\n const normalizedFile = normalizePath(file)\n return normalizedFile.endsWith('motia.config.ts') || normalizedFile.endsWith('motia.config.js')\n}\n\n/**\n * Checks if a file change should trigger HMR for plugins.\n *\n * @param file - The file path that changed\n * @param plugins - Current plugin configurations\n * @returns True if the change affects plugins\n */\nexport function shouldInvalidatePlugins(file: string, plugins: WorkbenchPlugin[]): boolean {\n const normalizedFile = normalizePath(file)\n const absoluteFile = path.isAbsolute(normalizedFile) ? normalizedFile : path.resolve(process.cwd(), normalizedFile)\n\n if (isConfigFile(file)) {\n return true\n }\n\n const hasWatchedExtension = WATCHED_EXTENSIONS.some((ext) => absoluteFile.endsWith(ext))\n if (!hasWatchedExtension) {\n return false\n }\n\n for (const plugin of plugins) {\n if (isLocalPlugin(plugin.packageName)) {\n const resolved = resolvePluginPackage(plugin)\n const pluginAbsolutePath = path.isAbsolute(resolved.resolvedPath)\n ? resolved.resolvedPath\n : path.resolve(process.cwd(), resolved.resolvedPath)\n\n const normalizedPluginPath = pluginAbsolutePath.endsWith(path.sep)\n ? pluginAbsolutePath\n : `${pluginAbsolutePath}${path.sep}`\n\n if (absoluteFile.startsWith(normalizedPluginPath) || absoluteFile === pluginAbsolutePath) {\n return true\n }\n }\n }\n\n return false\n}\n\n/**\n * Handles hot updates for the plugin system.\n * This function is called by Vite's handleHotUpdate hook.\n *\n * @param ctx - Vite's HMR context\n * @param plugins - Current plugin configurations\n * @param printer - Printer instance for logging\n * @returns Array of modules to update, or undefined to continue with default behavior\n */\nexport function handlePluginHotUpdate(\n ctx: HmrContext,\n plugins: WorkbenchPlugin[],\n printer: Printer,\n): ModuleNode[] | undefined {\n const { file, server, timestamp } = ctx\n\n printer.printPluginLog(`HMR: File changed: ${normalizePath(file)}`)\n\n if (isConfigFile(file)) {\n printer.printPluginLog('HMR: Config file changed, triggering full page reload')\n printer.printPluginWarn(\n 'Configuration changes require a server restart for full effect. Please restart the dev server to apply all changes.',\n )\n server.ws.send({\n type: 'full-reload',\n path: '*',\n })\n return\n }\n\n if (!shouldInvalidatePlugins(file, plugins)) {\n printer.printPluginLog('HMR: Change outside plugin scope, delegating to Vite default handling')\n return\n }\n\n printer.printPluginLog('HMR: Plugin change detected, invalidating virtual module')\n\n const virtualModule = server.moduleGraph.getModuleById(CONSTANTS.RESOLVED_VIRTUAL_MODULE_ID)\n\n if (!virtualModule) {\n printer.printPluginWarn('HMR: Virtual module not found, triggering full reload as fallback')\n server.ws.send({\n type: 'full-reload',\n path: '*',\n })\n return\n }\n\n server.moduleGraph.invalidateModule(virtualModule, new Set(), timestamp)\n printer.printPluginLog('HMR: Virtual module invalidated')\n\n const modulesToUpdateSet = new Set<ModuleNode>([virtualModule])\n const processedModules = new Set<ModuleNode>([virtualModule])\n\n for (const importer of virtualModule.importers) {\n if (!processedModules.has(importer)) {\n processedModules.add(importer)\n modulesToUpdateSet.add(importer)\n server.moduleGraph.invalidateModule(importer, new Set(), timestamp)\n }\n }\n\n const modulesToUpdate = Array.from(modulesToUpdateSet)\n\n printer.printPluginLog(`HMR: Updated ${modulesToUpdate.length} module(s)`)\n\n return modulesToUpdate\n}\n","import { existsSync } from 'fs'\nimport { z } from 'zod'\nimport type { ValidationResult, WorkbenchPlugin } from './types'\nimport { CONSTANTS, isValidPosition } from './types'\nimport { isLocalPlugin, resolveLocalPath } from './utils'\n\n/**\n * Zod schema for WorkbenchPlugin configuration.\n * Provides runtime type validation with detailed error messages.\n */\nconst WorkbenchPluginSchema = z.object({\n packageName: z\n .string()\n .min(1, 'packageName is required and cannot be empty')\n .refine((name) => name.startsWith('~/') || name.startsWith('@') || /^[a-z0-9-_]+$/i.test(name), {\n message: 'packageName must be a valid npm package name or local path (starting with ~/)',\n }),\n\n componentName: z.string().optional(),\n\n position: z\n .enum(['top', 'bottom'])\n .optional()\n .refine((pos) => pos === undefined || isValidPosition(pos), {\n message: 'position must be either \"top\" or \"bottom\"',\n }),\n\n label: z.string().optional(),\n\n labelIcon: z.string().optional(),\n\n cssImports: z.array(z.string()).optional(),\n\n props: z.record(z.any(), z.any()).optional(),\n})\n\n/**\n * Validates a single plugin configuration.\n *\n * @param plugin - The plugin configuration to validate\n * @param index - The index of the plugin in the array (for error messages)\n * @returns A validation result with errors, warnings, and normalized plugin\n */\nexport function validatePluginConfig(plugin: any, index: number): ValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (typeof plugin !== 'object' || plugin === null) {\n return {\n valid: false,\n errors: [`Plugin at index ${index}: expected object, got ${typeof plugin}`],\n warnings: [],\n }\n }\n\n try {\n const result = WorkbenchPluginSchema.safeParse(plugin)\n\n if (!result.success) {\n result.error.issues.forEach((err: z.core.$ZodIssue) => {\n const path = err.path.join('.')\n errors.push(`Plugin at index ${index}, field \"${path}\": ${err.message}`)\n })\n\n return { valid: false, errors, warnings }\n }\n\n const validatedPlugin = result.data as WorkbenchPlugin\n\n if (isLocalPlugin(validatedPlugin.packageName)) {\n const resolvedPath = resolveLocalPath(validatedPlugin.packageName)\n if (!existsSync(resolvedPath)) {\n warnings.push(\n `Plugin at index ${index}: local path \"${validatedPlugin.packageName}\" does not exist at \"${resolvedPath}\". ` +\n `Make sure the path is correct relative to the project root.`,\n )\n }\n }\n\n if (!validatedPlugin.label) {\n warnings.push(`Plugin at index ${index}: \"label\" not specified, will use default \"${CONSTANTS.DEFAULTS.LABEL}\"`)\n }\n\n if (!validatedPlugin.labelIcon) {\n warnings.push(\n `Plugin at index ${index}: \"labelIcon\" not specified, will use default \"${CONSTANTS.DEFAULTS.ICON}\"`,\n )\n }\n\n if (!validatedPlugin.position) {\n warnings.push(\n `Plugin at index ${index}: \"position\" not specified, will use default \"${CONSTANTS.DEFAULTS.POSITION}\"`,\n )\n }\n\n if (validatedPlugin.props && Object.keys(validatedPlugin.props).length === 0) {\n warnings.push(`Plugin at index ${index}: \"props\" is an empty object`)\n }\n\n if (validatedPlugin.cssImports) {\n if (validatedPlugin.cssImports.length === 0) {\n warnings.push(`Plugin at index ${index}: \"cssImports\" is an empty array`)\n }\n\n validatedPlugin.cssImports.forEach((cssImport, cssIndex) => {\n if (!cssImport || cssImport.trim() === '') {\n warnings.push(`Plugin at index ${index}: cssImport at index ${cssIndex} is empty or whitespace`)\n }\n })\n }\n\n return {\n valid: true,\n errors: [],\n warnings,\n plugin: validatedPlugin,\n }\n } catch (error) {\n return {\n valid: false,\n errors: [`Plugin at index ${index}: unexpected validation error: ${error}`],\n warnings: [],\n }\n }\n}\n\n/**\n * Validates an array of plugin configurations.\n *\n * @param plugins - Array of plugin configurations to validate\n * @param options - Validation options\n * @returns Combined validation result for all plugins\n */\nexport function validatePlugins(plugins: any[], options: { failFast?: boolean } = {}): ValidationResult {\n const allErrors: string[] = []\n const allWarnings: string[] = []\n const validatedPlugins: WorkbenchPlugin[] = []\n\n if (!Array.isArray(plugins)) {\n return {\n valid: false,\n errors: [`Expected plugins to be an array, got ${typeof plugins}`],\n warnings: [],\n }\n }\n\n if (plugins.length === 0) {\n console.warn('[motia-plugins] No plugins provided to validate')\n return {\n valid: true,\n errors: [],\n warnings: ['No plugins configured'],\n }\n }\n\n for (let i = 0; i < plugins.length; i++) {\n const result = validatePluginConfig(plugins[i], i)\n\n allErrors.push(...result.errors)\n allWarnings.push(...result.warnings)\n\n if (result.valid && result.plugin) {\n validatedPlugins.push(result.plugin)\n }\n\n if (options.failFast && result.errors.length > 0) {\n break\n }\n }\n\n const packageNames = validatedPlugins.map((p) => p.packageName)\n const duplicates = packageNames.filter((name, index) => packageNames.indexOf(name) !== index)\n\n if (duplicates.length > 0) {\n const uniqueDuplicates = [...new Set(duplicates)]\n uniqueDuplicates.forEach((dup) => {\n allWarnings.push(`Duplicate package name found: \"${dup}\". This may cause conflicts.`)\n })\n }\n\n const valid = allErrors.length === 0\n\n if (valid) {\n console.log(`[motia-plugins] ✓ Validated ${validatedPlugins.length} plugin(s) successfully`)\n if (allWarnings.length > 0) {\n console.warn(`[motia-plugins] Found ${allWarnings.length} warning(s)`)\n }\n } else {\n console.error(`[motia-plugins] ✗ Validation failed with ${allErrors.length} error(s)`)\n }\n\n return {\n valid,\n errors: allErrors,\n warnings: allWarnings,\n }\n}\n","import { Printer } from '@motiadev/core'\nimport path from 'path'\nimport type { Plugin, ViteDevServer } from 'vite'\nimport { generateCssImports, generatePluginCode, isValidCode } from './generator'\nimport { handlePluginHotUpdate } from './hmr'\nimport { createAliasConfig, resolvePluginPackage } from './resolver'\nimport type { WorkbenchPlugin } from './types'\nimport { CONSTANTS } from './types'\nimport { isLocalPlugin, normalizePath } from './utils'\nimport { validatePlugins } from './validator'\n\n/**\n * Vite plugin for loading and managing Motia workbench plugins.\n *\n * Features:\n * - Hot Module Replacement (HMR) support\n * - Runtime validation with detailed error messages\n * - Verbose logging for debugging\n * - CSS injection for plugin styles\n *\n * @param plugins - Array of plugin configurations\n * @param options - Optional loader configuration\n * @returns Vite plugin instance\n *\n * @example\n * ```ts\n * export default defineConfig({\n * plugins: [\n * motiaPluginsPlugin([\n * { packageName: '@my-org/plugin', label: 'My Plugin' }\n * ])\n * ]\n * })\n * ```\n */\nconst printer = new Printer(process.cwd())\n\nexport default function motiaPluginsPlugin(plugins: WorkbenchPlugin[]): Plugin {\n let devServer: ViteDevServer | null = null\n\n try {\n const validationResult = validatePlugins(plugins, {\n failFast: false,\n })\n\n if (!validationResult.valid) {\n printer.printPluginError('Plugin configuration validation failed:')\n for (const err of validationResult.errors) {\n printer.printPluginError(` ${err}`)\n }\n throw new Error('Invalid plugin configuration. See errors above.')\n }\n\n if (validationResult.warnings.length > 0) {\n for (const warning of validationResult.warnings) {\n printer.printPluginWarn(warning)\n }\n }\n } catch (error) {\n printer.printPluginError(`Failed to validate plugins: ${error}`)\n throw error\n }\n\n const alias = createAliasConfig(plugins)\n\n printer.printPluginLog(`Initialized with ${plugins.length} plugin(s)`)\n\n return {\n name: 'vite-plugin-motia-plugins',\n enforce: 'pre',\n\n buildStart() {\n printer.printPluginLog('Build started')\n },\n\n config: () => ({\n resolve: {\n alias,\n },\n }),\n\n configureServer(server) {\n devServer = server\n printer.printPluginLog('Dev server configured, HMR enabled')\n\n const configPaths = [path.join(process.cwd(), 'motia.config.ts'), path.join(process.cwd(), 'motia.config.js')]\n\n for (const configPath of configPaths) {\n server.watcher.add(configPath)\n }\n printer.printPluginLog('Watching for config file changes')\n\n const localPlugins = plugins.filter((p) => isLocalPlugin(p.packageName))\n if (localPlugins.length > 0) {\n printer.printPluginLog(`Watching ${localPlugins.length} local plugin(s)`)\n\n for (const plugin of localPlugins) {\n const resolved = resolvePluginPackage(plugin)\n const watchPath = resolved.resolvedPath\n\n server.watcher.add(watchPath)\n printer.printPluginLog(`Watching: ${watchPath}`)\n }\n\n server.watcher.on('change', (file) => {\n const normalizedFile = normalizePath(file)\n printer.printPluginLog(`File watcher detected change: ${normalizedFile}`)\n })\n\n server.watcher.on('add', (file) => {\n const normalizedFile = normalizePath(file)\n printer.printPluginLog(`File watcher detected new file: ${normalizedFile}`)\n })\n }\n },\n\n resolveId(id) {\n if (id === CONSTANTS.VIRTUAL_MODULE_ID) {\n return CONSTANTS.RESOLVED_VIRTUAL_MODULE_ID\n }\n },\n\n load(id) {\n if (id !== CONSTANTS.RESOLVED_VIRTUAL_MODULE_ID) {\n return null\n }\n\n printer.printPluginLog('Loading plugins virtual module')\n printer.printPluginLog('Generating plugin code...')\n\n const code = generatePluginCode(plugins)\n\n if (!isValidCode(code)) {\n printer.printPluginError('Generated code is invalid or empty')\n return 'export const plugins = []'\n }\n\n printer.printPluginLog('Plugin code generated successfully')\n\n return code\n },\n\n async transform(code, id) {\n const normalizedId = normalizePath(id)\n\n if (!normalizedId.endsWith('src/index.css')) {\n return null\n }\n\n printer.printPluginLog('Injecting plugin CSS imports')\n\n const cssImports = generateCssImports(plugins)\n\n if (!cssImports) {\n return null\n }\n\n return {\n code: `${cssImports}\\n${code}`,\n map: null,\n }\n },\n\n handleHotUpdate(ctx) {\n if (!devServer) {\n printer.printPluginWarn('HMR: Dev server not available')\n return\n }\n\n const modulesToUpdate = handlePluginHotUpdate(ctx, plugins, printer)\n\n if (modulesToUpdate && modulesToUpdate.length > 0) {\n const merged = Array.from(new Set([...(ctx.modules || []), ...modulesToUpdate]))\n printer.printPluginLog(`HMR: Successfully updated ${merged.length} module(s)`)\n return merged\n }\n },\n\n buildEnd() {\n printer.printPluginLog('Build ended')\n },\n }\n}\n","import react from '@vitejs/plugin-react'\nimport type { Express, NextFunction, Request, Response } from 'express'\nimport fs from 'fs'\nimport path from 'path'\nimport { fileURLToPath } from 'url'\nimport { createServer as createViteServer } from 'vite'\nimport motiaPluginsPlugin from './motia-plugin/index.js'\nimport type { WorkbenchPlugin } from './motia-plugin/types.js'\n\nconst workbenchBasePlugin = (workbenchBase: string) => {\n return {\n name: 'html-transform',\n transformIndexHtml: (html: string) => {\n return html.replace('</head>', `<script>const workbenchBase = ${JSON.stringify(workbenchBase)};</script></head>`)\n },\n }\n}\n\nconst processCwdPlugin = () => {\n return {\n name: 'html-transform',\n transformIndexHtml: (html: string) => {\n // Normalize path for cross-platform compatibility\n const cwd = process.cwd().replace(/\\\\/g, '/')\n return html.replace('</head>', `<script>const processCwd = \"${cwd}\";</script></head>`)\n },\n }\n}\n\nconst reoPlugin = () => {\n return {\n name: 'html-transform',\n transformIndexHtml(html: string) {\n const isAnalyticsEnabled = process.env.MOTIA_ANALYTICS_DISABLED !== 'true'\n\n if (!isAnalyticsEnabled) {\n return html\n }\n\n // inject before </head>\n return html.replace(\n '</head>',\n `\n <script type=\"text/javascript\">\n !function(){var e,t,n;e=\"d8f0ce9cae8ae64\",t=function(){Reo.init({clientID:\"d8f0ce9cae8ae64\", source: \"internal\"})},(n=document.createElement(\"script\")).src=\"https://static.reo.dev/\"+e+\"/reo.js\",n.defer=!0,n.onload=t,document.head.appendChild(n)}();\n </script>\n </head>`,\n )\n },\n }\n}\n\nexport type ApplyMiddlewareParams = {\n app: Express\n port: number\n workbenchBase: string\n plugins: WorkbenchPlugin[]\n}\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nexport const applyMiddleware = async ({ app, port, workbenchBase, plugins }: ApplyMiddlewareParams) => {\n const vite = await createViteServer({\n appType: 'spa',\n root: __dirname,\n base: workbenchBase,\n server: {\n middlewareMode: true,\n allowedHosts: true,\n host: true,\n hmr: { port: 21678 + port },\n fs: {\n allow: [\n __dirname, // workbench root\n path.join(process.cwd(), './steps'), // steps directory\n path.join(process.cwd(), './src'), // src directory\n path.join(process.cwd(), './tutorial'), // tutorial directory\n path.join(process.cwd(), './node_modules'), // node_modules directory\n path.join(__dirname, './node_modules'), // node_modules directory\n ],\n },\n },\n resolve: {\n alias: {\n '@': path.resolve(__dirname, './src'),\n '@/assets': path.resolve(__dirname, './src/assets'),\n 'lucide-react/dynamic': 'lucide-react/dynamic.mjs',\n 'lucide-react': 'lucide-react/dist/cjs/lucide-react.js',\n },\n },\n plugins: [\n react(),\n processCwdPlugin(),\n reoPlugin(),\n motiaPluginsPlugin(plugins),\n workbenchBasePlugin(workbenchBase),\n ],\n assetsInclude: ['**/*.png', '**/*.jpg', '**/*.jpeg', '**/*.gif', '**/*.svg', '**/*.ico', '**/*.webp', '**/*.avif'],\n })\n\n app.use(workbenchBase, vite.middlewares)\n app.use(`${workbenchBase}/*`, async (req: Request, res: Response, next: NextFunction) => {\n const url = req.originalUrl\n\n try {\n const index = fs.readFileSync(path.resolve(__dirname, 'index.html'), 'utf-8')\n const html = await vite.transformIndexHtml(url, index)\n\n res.status(200).set({ 'Content-Type': 'text/html' }).end(html)\n } catch (e) {\n next(e)\n }\n })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"middleware.js","names":["path","normalizePath","filePath","replace","isLocalPlugin","packageName","startsWith","resolveLocalPath","join","process","cwd","resolveNpmPath","ResolvedPackage","WorkbenchPlugin","isLocalPlugin","normalizePath","resolveLocalPath","resolveNpmPath","resolvePluginPackage","plugin","packageName","local","resolvedPath","isLocal","alias","createAliasConfig","plugins","Record","uniquePackages","Array","from","Set","map","p","aliases","resolved","resolveAllPlugins","getUniquePackageNames","getUniquePackageNames","WorkbenchPlugin","generateImports","packages","map","packageName","index","join","generatePackageMap","entries","generatePluginLogic","plugins","JSON","stringify","generatePluginCode","length","imports","packageMap","logic","generateCssImports","cssImports","flatMap","plugin","filter","cssImport","trim","isValidCode","code","WorkbenchPlugin","packageName","componentName","position","label","labelIcon","cssImports","props","Record","ValidationResult","valid","errors","warnings","plugin","PluginContext","plugins","server","ResolvedPackage","resolvedPath","isLocal","alias","VirtualModuleExports","ProcessedPlugin","component","isValidPosition","CONSTANTS","VIRTUAL_MODULE_ID","RESOLVED_VIRTUAL_MODULE_ID","LOG_PREFIX","DEFAULTS","POSITION","const","LABEL","ICON","PROPS","Printer","path","HmrContext","ModuleNode","resolvePluginPackage","WorkbenchPlugin","CONSTANTS","isLocalPlugin","normalizePath","WATCHED_EXTENSIONS","isConfigFile","file","normalizedFile","endsWith","shouldInvalidatePlugins","plugins","absoluteFile","isAbsolute","resolve","process","cwd","hasWatchedExtension","some","ext","plugin","packageName","resolved","pluginAbsolutePath","resolvedPath","normalizedPluginPath","sep","startsWith","handlePluginHotUpdate","ctx","printer","server","timestamp","printPluginLog","printPluginWarn","ws","send","type","virtualModule","moduleGraph","getModuleById","RESOLVED_VIRTUAL_MODULE_ID","invalidateModule","Set","modulesToUpdateSet","processedModules","importer","importers","has","add","modulesToUpdate","Array","from","length","existsSync","z","ValidationResult","WorkbenchPlugin","CONSTANTS","isValidPosition","isLocalPlugin","resolveLocalPath","WorkbenchPluginSchema","object","packageName","string","min","refine","name","startsWith","test","message","componentName","optional","position","enum","pos","undefined","label","labelIcon","cssImports","array","props","record","any","validatePluginConfig","plugin","index","errors","warnings","valid","result","safeParse","success","error","issues","forEach","err","core","$ZodIssue","path","join","push","validatedPlugin","data","resolvedPath","DEFAULTS","LABEL","ICON","POSITION","Object","keys","length","cssImport","cssIndex","trim","validatePlugins","plugins","options","failFast","allErrors","allWarnings","validatedPlugins","Array","isArray","console","warn","i","packageNames","map","p","duplicates","filter","indexOf","uniqueDuplicates","Set","dup","log","Printer","path","Plugin","ViteDevServer","generateCssImports","generatePluginCode","isValidCode","handlePluginHotUpdate","createAliasConfig","resolvePluginPackage","WorkbenchPlugin","CONSTANTS","isLocalPlugin","normalizePath","validatePlugins","printer","process","cwd","motiaPluginsPlugin","plugins","devServer","validationResult","failFast","valid","printPluginError","err","errors","Error","warnings","length","warning","printPluginWarn","error","alias","printPluginLog","name","enforce","buildStart","config","resolve","configureServer","server","configPaths","join","configPath","watcher","add","localPlugins","filter","p","packageName","plugin","resolved","watchPath","resolvedPath","on","file","normalizedFile","resolveId","id","VIRTUAL_MODULE_ID","RESOLVED_VIRTUAL_MODULE_ID","load","code","transform","normalizedId","endsWith","cssImports","map","handleHotUpdate","ctx","modulesToUpdate","merged","Array","from","Set","modules","buildEnd","react","Express","NextFunction","Request","Response","fs","path","fileURLToPath","createServer","createViteServer","motiaPluginsPlugin","WorkbenchPlugin","workbenchBasePlugin","workbenchBase","name","transformIndexHtml","html","replace","JSON","stringify","processCwdPlugin","cwd","process","reoPlugin","isAnalyticsEnabled","env","MOTIA_ANALYTICS_DISABLED","ApplyMiddlewareParams","app","port","plugins","__dirname","dirname","import","meta","url","applyMiddleware","vite","appType","root","base","server","middlewareMode","allowedHosts","host","hmr","allow","join","resolve","alias","assetsInclude","use","middlewares","req","res","next","originalUrl","index","readFileSync","status","set","end","e"],"sources":["../motia-plugin/utils.ts","../motia-plugin/resolver.ts","../motia-plugin/generator.ts","../motia-plugin/types.ts","../motia-plugin/hmr.ts","../motia-plugin/validator.ts","../motia-plugin/index.ts","../middleware.ts"],"sourcesContent":["import path from 'path'\n\n/**\n * Normalizes a file path by replacing backslashes with forward slashes.\n * This is useful for consistent path comparisons across different operating systems.\n *\n * @param filePath - The file path to normalize\n * @returns The normalized file path with forward slashes\n *\n * @example\n * ```ts\n * normalizePath('C:\\\\Users\\\\file.ts') // Returns: 'C:/Users/file.ts'\n * normalizePath('/Users/file.ts') // Returns: '/Users/file.ts'\n * ```\n */\nexport function normalizePath(filePath: string): string {\n return filePath.replace(/\\\\/g, '/')\n}\n\n/**\n * Checks if a package name represents a local plugin (starts with ~/).\n *\n * @param packageName - The package name to check\n * @returns True if the package is a local plugin\n *\n * @example\n * ```ts\n * isLocalPlugin('~/plugins/my-plugin') // Returns: true\n * isLocalPlugin('@my-org/my-plugin') // Returns: false\n * isLocalPlugin('my-plugin') // Returns: false\n * ```\n */\nexport function isLocalPlugin(packageName: string): boolean {\n return packageName.startsWith('~/')\n}\n\n/**\n * Resolves a local plugin path to an absolute path.\n * Strips the ~/ prefix and joins with the current working directory.\n *\n * @param packageName - The local plugin package name (must start with ~/)\n * @returns The absolute path to the local plugin\n *\n * @example\n * ```ts\n * // If cwd is /Users/project\n * resolveLocalPath('~/plugins/my-plugin')\n * // Returns: '/Users/project/plugins/my-plugin'\n * ```\n */\nexport function resolveLocalPath(packageName: string): string {\n return path.join(process.cwd(), packageName.replace('~/', ''))\n}\n\n/**\n * Resolves an npm package path to the node_modules directory.\n *\n * @param packageName - The npm package name\n * @returns The absolute path to the package in node_modules\n *\n * @example\n * ```ts\n * // If cwd is /Users/project\n * resolveNpmPath('@my-org/my-plugin')\n * // Returns: '/Users/project/node_modules/@my-org/my-plugin'\n * ```\n */\nexport function resolveNpmPath(packageName: string): string {\n return path.join(process.cwd(), 'node_modules', packageName)\n}\n","import type { ResolvedPackage, WorkbenchPlugin } from './types'\nimport { isLocalPlugin, normalizePath, resolveLocalPath, resolveNpmPath } from './utils'\n\n/**\n * Resolves a plugin package to its absolute path and creates an alias.\n *\n * @param plugin - The plugin configuration to resolve\n * @returns Resolved package information including path and alias\n *\n * @example\n * ```ts\n * // Local plugin\n * resolvePluginPackage({ packageName: '~/plugins/my-plugin' })\n * // Returns: {\n * // packageName: '~/plugins/my-plugin',\n * // resolvedPath: '/Users/project/plugins/my-plugin',\n * // isLocal: true,\n * // alias: '~/plugins/my-plugin'\n * // }\n *\n * // NPM package\n * resolvePluginPackage({ packageName: '@org/plugin' })\n * // Returns: {\n * // packageName: '@org/plugin',\n * // resolvedPath: '/Users/project/node_modules/@org/plugin',\n * // isLocal: false,\n * // alias: '@org/plugin'\n * // }\n * ```\n */\nexport function resolvePluginPackage(plugin: WorkbenchPlugin): ResolvedPackage {\n const { packageName } = plugin\n const local = isLocalPlugin(packageName)\n\n const resolvedPath = local ? resolveLocalPath(packageName) : resolveNpmPath(packageName)\n\n return {\n packageName,\n resolvedPath: normalizePath(resolvedPath),\n isLocal: local,\n alias: packageName,\n }\n}\n\n/**\n * Resolves all plugin packages and creates a Vite alias configuration.\n *\n * @param plugins - Array of plugin configurations\n * @returns Vite alias configuration object\n *\n * @example\n * ```ts\n * const plugins = [\n * { packageName: '~/plugins/local' },\n * { packageName: '@org/npm-plugin' }\n * ]\n * const aliases = createAliasConfig(plugins)\n * // Returns: {\n * // '~/plugins/local': '/Users/project/plugins/local',\n * // '@org/npm-plugin': '/Users/project/node_modules/@org/npm-plugin'\n * // }\n * ```\n */\nexport function createAliasConfig(plugins: WorkbenchPlugin[]): Record<string, string> {\n // Get unique package names to avoid duplicate aliases\n const uniquePackages = Array.from(new Set(plugins.map((p) => p.packageName)))\n\n const aliases: Record<string, string> = {}\n\n for (const packageName of uniquePackages) {\n const resolved = resolvePluginPackage({ packageName } as WorkbenchPlugin)\n aliases[packageName] = resolved.resolvedPath\n }\n\n return aliases\n}\n\n/**\n * Resolves all plugins and returns their resolved package information.\n *\n * @param plugins - Array of plugin configurations\n * @returns Array of resolved package information\n */\nexport function resolveAllPlugins(plugins: WorkbenchPlugin[]): ResolvedPackage[] {\n return plugins.map((plugin) => resolvePluginPackage(plugin))\n}\n\n/**\n * Gets the unique set of package names from plugins.\n *\n * @param plugins - Array of plugin configurations\n * @returns Array of unique package names\n */\nexport function getUniquePackageNames(plugins: WorkbenchPlugin[]): string[] {\n return Array.from(new Set(plugins.map((p) => p.packageName)))\n}\n","import { getUniquePackageNames } from './resolver'\nimport type { WorkbenchPlugin } from './types'\n\n/**\n * Generates import statements for all unique plugin packages.\n *\n * @param packages - Array of unique package names\n * @returns JavaScript code string with import statements\n *\n * @example\n * ```ts\n * generateImports(['@org/plugin-1', '~/plugins/local'])\n * // Returns:\n * // import * as plugin_0 from '@org/plugin-1'\n * // import * as plugin_1 from '~/plugins/local'\n * ```\n */\nexport function generateImports(packages: string[]): string {\n return packages.map((packageName, index) => `import * as plugin_${index} from '${packageName}'`).join('\\n')\n}\n\n/**\n * Generates the package map that links package names to their imported modules.\n *\n * @param packages - Array of unique package names\n * @returns JavaScript code string defining the package map\n *\n * @example\n * ```ts\n * generatePackageMap(['@org/plugin-1', '~/plugins/local'])\n * // Returns: const packageMap = {'@org/plugin-1': plugin_0,'~/plugins/local': plugin_1}\n * ```\n */\nexport function generatePackageMap(packages: string[]): string {\n const entries = packages.map((packageName, index) => `'${packageName}': plugin_${index}`)\n return `const packageMap = {${entries.join(',')}}`\n}\n\n/**\n * Generates the plugin transformation logic that processes plugin configurations.\n *\n * @param plugins - Array of plugin configurations\n * @returns JavaScript code string with plugin processing logic\n */\nexport function generatePluginLogic(plugins: WorkbenchPlugin[]): string {\n return `\n const motiaPlugins = ${JSON.stringify(plugins)}\n\n export const plugins = motiaPlugins.map((plugin) => {\n const component = packageMap[plugin.packageName]\n const config = component.config || {}\n const componentName = config.componentName || plugin.componentName\n\n return {\n label: plugin.label || config.label || 'Plugin label',\n labelIcon: plugin.labelIcon || config.labelIcon || 'toy-brick',\n position: plugin.position || config.position || 'top',\n props: plugin.props || config.props || {},\n component: componentName ? component[componentName] : component.default,\n }\n })\n`\n}\n\n/**\n * Generates the complete virtual module code for all plugins.\n * This is the main code generation function that combines all parts.\n *\n * @param plugins - Array of plugin configurations\n * @returns Complete JavaScript code string for the virtual module\n *\n * @example\n * ```ts\n * const plugins = [\n * { packageName: '@test/plugin', label: 'Test' }\n * ]\n * const code = generatePluginCode(plugins)\n * // Returns complete module code with imports, map, and logic\n * ```\n */\nexport function generatePluginCode(plugins: WorkbenchPlugin[]): string {\n if (!plugins || plugins.length === 0) {\n return 'export const plugins = []'\n }\n\n const packages = getUniquePackageNames(plugins)\n const imports = generateImports(packages)\n const packageMap = generatePackageMap(packages)\n const logic = generatePluginLogic(plugins)\n\n return `${imports}\n${packageMap}\n${logic}`\n}\n\n/**\n * Generates CSS imports for plugins that specify cssImports.\n *\n * @param plugins - Array of plugin configurations\n * @returns CSS import statements as a string\n *\n * @example\n * ```ts\n * const plugins = [\n * { packageName: '@test/plugin', cssImports: ['styles.css', 'theme.css'] }\n * ]\n * generateCssImports(plugins)\n * // Returns:\n * // @import 'styles.css';\n * // @import 'theme.css';\n * ```\n */\nexport function generateCssImports(plugins: WorkbenchPlugin[]): string {\n const cssImports = plugins\n .flatMap((plugin) => plugin.cssImports || [])\n .filter((cssImport) => cssImport && cssImport.trim() !== '')\n .map((cssImport) => `@import '${cssImport}';`)\n\n return cssImports.join('\\n')\n}\n\n/**\n * Checks if the generated code is valid (non-empty and has content).\n *\n * @param code - The generated code to check\n * @returns True if code is valid\n */\nexport function isValidCode(code: string): boolean {\n return typeof code === 'string' && code.trim().length > 0\n}\n","/**\n * Configuration for a single workbench plugin.\n * This interface defines how plugins are registered and configured in the Motia workbench.\n */\nexport interface WorkbenchPlugin {\n /**\n * The package name or local path to the plugin.\n * - For npm packages: use the package name (e.g., '@my-org/my-plugin')\n * - For local plugins: use the tilde prefix (e.g., '~/plugins/my-plugin')\n */\n packageName: string\n\n /**\n * Optional named export to use from the plugin package.\n * If not specified, the default export will be used.\n * Can be overridden by the plugin's own config.\n */\n componentName?: string\n\n /**\n * Position where the plugin tab should appear in the workbench.\n * - 'top': Display in the top tab bar\n * - 'bottom': Display in the bottom tab bar\n * @default 'top'\n */\n position?: 'top' | 'bottom'\n\n /**\n * Display label for the plugin tab.\n * Can be overridden by the plugin's own config.\n */\n label?: string\n\n /**\n * Icon name from lucide-react to display next to the label.\n * Can be overridden by the plugin's own config.\n * @default 'toy-brick'\n */\n labelIcon?: string\n\n /**\n * Array of CSS package imports to inject into the workbench.\n * These will be added to the main index.css file.\n * Example: ['@my-org/my-plugin/styles.css']\n */\n cssImports?: string[]\n\n /**\n * Props to pass to the plugin component when it's rendered.\n * Can be overridden by the plugin's own config.\n */\n props?: Record<string, any>\n}\n\n/**\n * Result of validating a plugin configuration.\n */\nexport interface ValidationResult {\n /**\n * Whether the validation passed\n */\n valid: boolean\n\n /**\n * Array of error messages if validation failed\n */\n errors: string[]\n\n /**\n * Array of warning messages for non-critical issues\n */\n warnings: string[]\n\n /**\n * The validated and normalized plugin configuration (if valid)\n */\n plugin?: WorkbenchPlugin\n}\n\n/**\n * Context object passed to various plugin internals functions.\n * Contains shared state and configuration.\n */\nexport interface PluginContext {\n /**\n * Array of plugin configurations\n */\n plugins: WorkbenchPlugin[]\n\n /**\n * Vite dev server instance (only available in dev mode)\n */\n server?: any\n}\n\n/**\n * Package resolution result.\n */\nexport interface ResolvedPackage {\n /**\n * The original package name from the configuration\n */\n packageName: string\n\n /**\n * Resolved absolute path to the package\n */\n resolvedPath: string\n\n /**\n * Whether this is a local plugin (starts with ~/)\n */\n isLocal: boolean\n\n /**\n * Alias to use for imports\n */\n alias: string\n}\n\n/**\n * Generated virtual module exports interface.\n * This is what consumers will import from 'virtual:motia-plugins'.\n */\nexport interface VirtualModuleExports {\n /**\n * Array of processed plugin configurations ready to be registered\n */\n plugins: ProcessedPlugin[]\n}\n\n/**\n * A plugin configuration after processing and normalization.\n * This is the format used by the workbench to register tabs.\n */\nexport interface ProcessedPlugin {\n /**\n * Display label for the plugin tab\n */\n label: string\n\n /**\n * Icon name from lucide-react\n */\n labelIcon: string\n\n /**\n * Position in the workbench ('top' or 'bottom')\n */\n position: 'top' | 'bottom'\n\n /**\n * Props to pass to the component\n */\n props: Record<string, any>\n\n /**\n * The React component to render\n */\n component: any\n}\n\n/**\n * Type guard to check if position is valid.\n */\nexport function isValidPosition(position: any): position is 'top' | 'bottom' {\n return position === 'top' || position === 'bottom'\n}\n\n/**\n * Constants used throughout the plugin system.\n */\nexport const CONSTANTS = {\n /**\n * Virtual module ID for importing plugins\n */\n VIRTUAL_MODULE_ID: 'virtual:motia-plugins',\n\n /**\n * Resolved virtual module ID (with null byte prefix for Vite)\n */\n RESOLVED_VIRTUAL_MODULE_ID: '\\0virtual:motia-plugins',\n\n /**\n * Log prefix for all plugin messages\n */\n LOG_PREFIX: '[motia-plugins]',\n\n /**\n * Default values for optional plugin fields\n */\n DEFAULTS: {\n POSITION: 'top' as const,\n LABEL: 'Plugin label',\n ICON: 'toy-brick',\n PROPS: {},\n },\n} as const\n","import type { Printer } from '@motiadev/core'\nimport path from 'path'\nimport type { HmrContext, ModuleNode } from 'vite'\nimport { resolvePluginPackage } from './resolver'\nimport type { WorkbenchPlugin } from './types'\nimport { CONSTANTS } from './types'\nimport { isLocalPlugin, normalizePath } from './utils'\n\nconst WATCHED_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.css', '.scss', '.less']\n\nexport function isConfigFile(file: string): boolean {\n const normalizedFile = normalizePath(file)\n return normalizedFile.endsWith('motia.config.ts') || normalizedFile.endsWith('motia.config.js')\n}\n\n/**\n * Checks if a file change should trigger HMR for plugins.\n *\n * @param file - The file path that changed\n * @param plugins - Current plugin configurations\n * @returns True if the change affects plugins\n */\nexport function shouldInvalidatePlugins(file: string, plugins: WorkbenchPlugin[]): boolean {\n const normalizedFile = normalizePath(file)\n const absoluteFile = path.isAbsolute(normalizedFile) ? normalizedFile : path.resolve(process.cwd(), normalizedFile)\n\n if (isConfigFile(file)) {\n return true\n }\n\n const hasWatchedExtension = WATCHED_EXTENSIONS.some((ext) => absoluteFile.endsWith(ext))\n if (!hasWatchedExtension) {\n return false\n }\n\n for (const plugin of plugins) {\n if (isLocalPlugin(plugin.packageName)) {\n const resolved = resolvePluginPackage(plugin)\n const pluginAbsolutePath = path.isAbsolute(resolved.resolvedPath)\n ? resolved.resolvedPath\n : path.resolve(process.cwd(), resolved.resolvedPath)\n\n const normalizedPluginPath = pluginAbsolutePath.endsWith(path.sep)\n ? pluginAbsolutePath\n : `${pluginAbsolutePath}${path.sep}`\n\n if (absoluteFile.startsWith(normalizedPluginPath) || absoluteFile === pluginAbsolutePath) {\n return true\n }\n }\n }\n\n return false\n}\n\n/**\n * Handles hot updates for the plugin system.\n * This function is called by Vite's handleHotUpdate hook.\n *\n * @param ctx - Vite's HMR context\n * @param plugins - Current plugin configurations\n * @param printer - Printer instance for logging\n * @returns Array of modules to update, or undefined to continue with default behavior\n */\nexport function handlePluginHotUpdate(\n ctx: HmrContext,\n plugins: WorkbenchPlugin[],\n printer: Printer,\n): ModuleNode[] | undefined {\n const { file, server, timestamp } = ctx\n\n printer.printPluginLog(`HMR: File changed: ${normalizePath(file)}`)\n\n if (isConfigFile(file)) {\n printer.printPluginLog('HMR: Config file changed, triggering full page reload')\n printer.printPluginWarn(\n 'Configuration changes require a server restart for full effect. Please restart the dev server to apply all changes.',\n )\n server.ws.send({\n type: 'full-reload',\n path: '*',\n })\n return\n }\n\n if (!shouldInvalidatePlugins(file, plugins)) {\n printer.printPluginLog('HMR: Change outside plugin scope, delegating to Vite default handling')\n return\n }\n\n printer.printPluginLog('HMR: Plugin change detected, invalidating virtual module')\n\n const virtualModule = server.moduleGraph.getModuleById(CONSTANTS.RESOLVED_VIRTUAL_MODULE_ID)\n\n if (!virtualModule) {\n printer.printPluginWarn('HMR: Virtual module not found, triggering full reload as fallback')\n server.ws.send({\n type: 'full-reload',\n path: '*',\n })\n return\n }\n\n server.moduleGraph.invalidateModule(virtualModule, new Set(), timestamp)\n printer.printPluginLog('HMR: Virtual module invalidated')\n\n const modulesToUpdateSet = new Set<ModuleNode>([virtualModule])\n const processedModules = new Set<ModuleNode>([virtualModule])\n\n for (const importer of virtualModule.importers) {\n if (!processedModules.has(importer)) {\n processedModules.add(importer)\n modulesToUpdateSet.add(importer)\n server.moduleGraph.invalidateModule(importer, new Set(), timestamp)\n }\n }\n\n const modulesToUpdate = Array.from(modulesToUpdateSet)\n\n printer.printPluginLog(`HMR: Updated ${modulesToUpdate.length} module(s)`)\n\n return modulesToUpdate\n}\n","import { existsSync } from 'fs'\nimport { z } from 'zod'\nimport type { ValidationResult, WorkbenchPlugin } from './types'\nimport { CONSTANTS, isValidPosition } from './types'\nimport { isLocalPlugin, resolveLocalPath } from './utils'\n\n/**\n * Zod schema for WorkbenchPlugin configuration.\n * Provides runtime type validation with detailed error messages.\n */\nconst WorkbenchPluginSchema = z.object({\n packageName: z\n .string()\n .min(1, 'packageName is required and cannot be empty')\n .refine((name) => name.startsWith('~/') || name.startsWith('@') || /^[a-z0-9-_]+$/i.test(name), {\n message: 'packageName must be a valid npm package name or local path (starting with ~/)',\n }),\n\n componentName: z.string().optional(),\n\n position: z\n .enum(['top', 'bottom'])\n .optional()\n .refine((pos) => pos === undefined || isValidPosition(pos), {\n message: 'position must be either \"top\" or \"bottom\"',\n }),\n\n label: z.string().optional(),\n\n labelIcon: z.string().optional(),\n\n cssImports: z.array(z.string()).optional(),\n\n props: z.record(z.any(), z.any()).optional(),\n})\n\n/**\n * Validates a single plugin configuration.\n *\n * @param plugin - The plugin configuration to validate\n * @param index - The index of the plugin in the array (for error messages)\n * @returns A validation result with errors, warnings, and normalized plugin\n */\nexport function validatePluginConfig(plugin: any, index: number): ValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (typeof plugin !== 'object' || plugin === null) {\n return {\n valid: false,\n errors: [`Plugin at index ${index}: expected object, got ${typeof plugin}`],\n warnings: [],\n }\n }\n\n try {\n const result = WorkbenchPluginSchema.safeParse(plugin)\n\n if (!result.success) {\n result.error.issues.forEach((err: z.core.$ZodIssue) => {\n const path = err.path.join('.')\n errors.push(`Plugin at index ${index}, field \"${path}\": ${err.message}`)\n })\n\n return { valid: false, errors, warnings }\n }\n\n const validatedPlugin = result.data as WorkbenchPlugin\n\n if (isLocalPlugin(validatedPlugin.packageName)) {\n const resolvedPath = resolveLocalPath(validatedPlugin.packageName)\n if (!existsSync(resolvedPath)) {\n warnings.push(\n `Plugin at index ${index}: local path \"${validatedPlugin.packageName}\" does not exist at \"${resolvedPath}\". ` +\n `Make sure the path is correct relative to the project root.`,\n )\n }\n }\n\n if (!validatedPlugin.label) {\n warnings.push(`Plugin at index ${index}: \"label\" not specified, will use default \"${CONSTANTS.DEFAULTS.LABEL}\"`)\n }\n\n if (!validatedPlugin.labelIcon) {\n warnings.push(\n `Plugin at index ${index}: \"labelIcon\" not specified, will use default \"${CONSTANTS.DEFAULTS.ICON}\"`,\n )\n }\n\n if (!validatedPlugin.position) {\n warnings.push(\n `Plugin at index ${index}: \"position\" not specified, will use default \"${CONSTANTS.DEFAULTS.POSITION}\"`,\n )\n }\n\n if (validatedPlugin.props && Object.keys(validatedPlugin.props).length === 0) {\n warnings.push(`Plugin at index ${index}: \"props\" is an empty object`)\n }\n\n if (validatedPlugin.cssImports) {\n if (validatedPlugin.cssImports.length === 0) {\n warnings.push(`Plugin at index ${index}: \"cssImports\" is an empty array`)\n }\n\n validatedPlugin.cssImports.forEach((cssImport, cssIndex) => {\n if (!cssImport || cssImport.trim() === '') {\n warnings.push(`Plugin at index ${index}: cssImport at index ${cssIndex} is empty or whitespace`)\n }\n })\n }\n\n return {\n valid: true,\n errors: [],\n warnings,\n plugin: validatedPlugin,\n }\n } catch (error) {\n return {\n valid: false,\n errors: [`Plugin at index ${index}: unexpected validation error: ${error}`],\n warnings: [],\n }\n }\n}\n\n/**\n * Validates an array of plugin configurations.\n *\n * @param plugins - Array of plugin configurations to validate\n * @param options - Validation options\n * @returns Combined validation result for all plugins\n */\nexport function validatePlugins(plugins: any[], options: { failFast?: boolean } = {}): ValidationResult {\n const allErrors: string[] = []\n const allWarnings: string[] = []\n const validatedPlugins: WorkbenchPlugin[] = []\n\n if (!Array.isArray(plugins)) {\n return {\n valid: false,\n errors: [`Expected plugins to be an array, got ${typeof plugins}`],\n warnings: [],\n }\n }\n\n if (plugins.length === 0) {\n console.warn('[motia-plugins] No plugins provided to validate')\n return {\n valid: true,\n errors: [],\n warnings: ['No plugins configured'],\n }\n }\n\n for (let i = 0; i < plugins.length; i++) {\n const result = validatePluginConfig(plugins[i], i)\n\n allErrors.push(...result.errors)\n allWarnings.push(...result.warnings)\n\n if (result.valid && result.plugin) {\n validatedPlugins.push(result.plugin)\n }\n\n if (options.failFast && result.errors.length > 0) {\n break\n }\n }\n\n const packageNames = validatedPlugins.map((p) => p.packageName)\n const duplicates = packageNames.filter((name, index) => packageNames.indexOf(name) !== index)\n\n if (duplicates.length > 0) {\n const uniqueDuplicates = [...new Set(duplicates)]\n uniqueDuplicates.forEach((dup) => {\n allWarnings.push(`Duplicate package name found: \"${dup}\". This may cause conflicts.`)\n })\n }\n\n const valid = allErrors.length === 0\n\n if (valid) {\n console.log(`[motia-plugins] ✓ Validated ${validatedPlugins.length} plugin(s) successfully`)\n if (allWarnings.length > 0) {\n console.warn(`[motia-plugins] Found ${allWarnings.length} warning(s)`)\n }\n } else {\n console.error(`[motia-plugins] ✗ Validation failed with ${allErrors.length} error(s)`)\n }\n\n return {\n valid,\n errors: allErrors,\n warnings: allWarnings,\n }\n}\n","import { Printer } from '@motiadev/core'\nimport path from 'path'\nimport type { Plugin, ViteDevServer } from 'vite'\nimport { generateCssImports, generatePluginCode, isValidCode } from './generator'\nimport { handlePluginHotUpdate } from './hmr'\nimport { createAliasConfig, resolvePluginPackage } from './resolver'\nimport type { WorkbenchPlugin } from './types'\nimport { CONSTANTS } from './types'\nimport { isLocalPlugin, normalizePath } from './utils'\nimport { validatePlugins } from './validator'\n\n/**\n * Vite plugin for loading and managing Motia workbench plugins.\n *\n * Features:\n * - Hot Module Replacement (HMR) support\n * - Runtime validation with detailed error messages\n * - Verbose logging for debugging\n * - CSS injection for plugin styles\n *\n * @param plugins - Array of plugin configurations\n * @param options - Optional loader configuration\n * @returns Vite plugin instance\n *\n * @example\n * ```ts\n * export default defineConfig({\n * plugins: [\n * motiaPluginsPlugin([\n * { packageName: '@my-org/plugin', label: 'My Plugin' }\n * ])\n * ]\n * })\n * ```\n */\nconst printer = new Printer(process.cwd())\n\nexport default function motiaPluginsPlugin(plugins: WorkbenchPlugin[]): Plugin {\n let devServer: ViteDevServer | null = null\n\n try {\n const validationResult = validatePlugins(plugins, {\n failFast: false,\n })\n\n if (!validationResult.valid) {\n printer.printPluginError('Plugin configuration validation failed:')\n for (const err of validationResult.errors) {\n printer.printPluginError(` ${err}`)\n }\n throw new Error('Invalid plugin configuration. See errors above.')\n }\n\n if (validationResult.warnings.length > 0) {\n for (const warning of validationResult.warnings) {\n printer.printPluginWarn(warning)\n }\n }\n } catch (error) {\n printer.printPluginError(`Failed to validate plugins: ${error}`)\n throw error\n }\n\n const alias = createAliasConfig(plugins)\n\n printer.printPluginLog(`Initialized with ${plugins.length} plugin(s)`)\n\n return {\n name: 'vite-plugin-motia-plugins',\n enforce: 'pre',\n\n buildStart() {\n printer.printPluginLog('Build started')\n },\n\n config: () => ({\n resolve: {\n alias,\n },\n }),\n\n configureServer(server) {\n devServer = server\n printer.printPluginLog('Dev server configured, HMR enabled')\n\n const configPaths = [path.join(process.cwd(), 'motia.config.ts'), path.join(process.cwd(), 'motia.config.js')]\n\n for (const configPath of configPaths) {\n server.watcher.add(configPath)\n }\n printer.printPluginLog('Watching for config file changes')\n\n const localPlugins = plugins.filter((p) => isLocalPlugin(p.packageName))\n if (localPlugins.length > 0) {\n printer.printPluginLog(`Watching ${localPlugins.length} local plugin(s)`)\n\n for (const plugin of localPlugins) {\n const resolved = resolvePluginPackage(plugin)\n const watchPath = resolved.resolvedPath\n\n server.watcher.add(watchPath)\n printer.printPluginLog(`Watching: ${watchPath}`)\n }\n\n server.watcher.on('change', (file) => {\n const normalizedFile = normalizePath(file)\n printer.printPluginLog(`File watcher detected change: ${normalizedFile}`)\n })\n\n server.watcher.on('add', (file) => {\n const normalizedFile = normalizePath(file)\n printer.printPluginLog(`File watcher detected new file: ${normalizedFile}`)\n })\n }\n },\n\n resolveId(id) {\n if (id === CONSTANTS.VIRTUAL_MODULE_ID) {\n return CONSTANTS.RESOLVED_VIRTUAL_MODULE_ID\n }\n },\n\n load(id) {\n if (id !== CONSTANTS.RESOLVED_VIRTUAL_MODULE_ID) {\n return null\n }\n\n printer.printPluginLog('Loading plugins virtual module')\n printer.printPluginLog('Generating plugin code...')\n\n const code = generatePluginCode(plugins)\n\n if (!isValidCode(code)) {\n printer.printPluginError('Generated code is invalid or empty')\n return 'export const plugins = []'\n }\n\n printer.printPluginLog('Plugin code generated successfully')\n\n return code\n },\n\n async transform(code, id) {\n const normalizedId = normalizePath(id)\n\n if (!normalizedId.endsWith('src/index.css')) {\n return null\n }\n\n printer.printPluginLog('Injecting plugin CSS imports')\n\n const cssImports = generateCssImports(plugins)\n\n if (!cssImports) {\n return null\n }\n\n return {\n code: `${cssImports}\\n${code}`,\n map: null,\n }\n },\n\n handleHotUpdate(ctx) {\n if (!devServer) {\n printer.printPluginWarn('HMR: Dev server not available')\n return\n }\n\n const modulesToUpdate = handlePluginHotUpdate(ctx, plugins, printer)\n\n if (modulesToUpdate && modulesToUpdate.length > 0) {\n const merged = Array.from(new Set([...(ctx.modules || []), ...modulesToUpdate]))\n printer.printPluginLog(`HMR: Successfully updated ${merged.length} module(s)`)\n return merged\n }\n },\n\n buildEnd() {\n printer.printPluginLog('Build ended')\n },\n }\n}\n","import react from '@vitejs/plugin-react'\nimport type { Express, NextFunction, Request, Response } from 'express'\nimport fs from 'fs'\nimport path from 'path'\nimport { fileURLToPath } from 'url'\nimport { createServer as createViteServer } from 'vite'\nimport motiaPluginsPlugin from './motia-plugin/index.js'\nimport type { WorkbenchPlugin } from './motia-plugin/types.js'\n\nconst workbenchBasePlugin = (workbenchBase: string) => {\n return {\n name: 'html-transform',\n transformIndexHtml: (html: string) => {\n return html.replace('</head>', `<script>const workbenchBase = ${JSON.stringify(workbenchBase)};</script></head>`)\n },\n }\n}\n\nconst processCwdPlugin = () => {\n return {\n name: 'html-transform',\n transformIndexHtml: (html: string) => {\n // Normalize path for cross-platform compatibility\n const cwd = process.cwd().replace(/\\\\/g, '/')\n return html.replace('</head>', `<script>const processCwd = \"${cwd}\";</script></head>`)\n },\n }\n}\n\nconst reoPlugin = () => {\n return {\n name: 'html-transform',\n transformIndexHtml(html: string) {\n const isAnalyticsEnabled = process.env.MOTIA_ANALYTICS_DISABLED !== 'true'\n\n if (!isAnalyticsEnabled) {\n return html\n }\n\n // inject before </head>\n return html.replace(\n '</head>',\n `\n <script type=\"text/javascript\">\n !function(){var e,t,n;e=\"d8f0ce9cae8ae64\",t=function(){Reo.init({clientID:\"d8f0ce9cae8ae64\", source: \"internal\"})},(n=document.createElement(\"script\")).src=\"https://static.reo.dev/\"+e+\"/reo.js\",n.defer=!0,n.onload=t,document.head.appendChild(n)}();\n </script>\n </head>`,\n )\n },\n }\n}\n\nexport type ApplyMiddlewareParams = {\n app: Express\n port: number\n workbenchBase: string\n plugins: WorkbenchPlugin[]\n}\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nexport const applyMiddleware = async ({ app, port, workbenchBase, plugins }: ApplyMiddlewareParams) => {\n const vite = await createViteServer({\n appType: 'spa',\n root: __dirname,\n base: workbenchBase,\n server: {\n middlewareMode: true,\n allowedHosts: true,\n host: true,\n hmr: { port: 21678 + port },\n fs: {\n allow: [\n __dirname, // workbench root\n path.join(process.cwd(), './steps'), // steps directory\n path.join(process.cwd(), './src'), // src directory\n path.join(process.cwd(), './tutorial'), // tutorial directory\n path.join(process.cwd(), './node_modules'), // node_modules directory\n path.join(__dirname, './node_modules'), // node_modules directory\n ],\n },\n },\n resolve: {\n alias: {\n '@': path.resolve(__dirname, './src'),\n '@/assets': path.resolve(__dirname, './src/assets'),\n },\n },\n plugins: [\n react(),\n processCwdPlugin(),\n reoPlugin(),\n motiaPluginsPlugin(plugins),\n workbenchBasePlugin(workbenchBase),\n ],\n assetsInclude: ['**/*.png', '**/*.jpg', '**/*.jpeg', '**/*.gif', '**/*.svg', '**/*.ico', '**/*.webp', '**/*.avif'],\n })\n\n app.use(workbenchBase, vite.middlewares)\n app.use(`${workbenchBase}/*`, async (req: Request, res: Response, next: NextFunction) => {\n const url = req.originalUrl\n\n try {\n const index = fs.readFileSync(path.resolve(__dirname, 'index.html'), 'utf-8')\n const html = await vite.transformIndexHtml(url, index)\n\n res.status(200).set({ 'Content-Type': 'text/html' }).end(html)\n } catch (e) {\n next(e)\n }\n })\n}\n"],"mappings":"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"}
@@ -4,9 +4,9 @@ import { ReactFlowProvider } from '@xyflow/react'
4
4
  import { ExternalLink, Workflow } from 'lucide-react'
5
5
  import { memo, useMemo } from 'react'
6
6
  import { useShallow } from 'zustand/react/shallow'
7
- import { motiaAnalytics } from '@/lib/motia-analytics'
8
- import { useFlowStore } from '@/stores/use-flow-store'
9
- import type { FlowConfigResponse, FlowResponse } from '@/types/flow'
7
+ import { motiaAnalytics } from '../../lib/motia-analytics'
8
+ import { useFlowStore } from '../../stores/use-flow-store'
9
+ import type { FlowConfigResponse, FlowResponse } from '../../types/flow'
10
10
  import { FlowView } from './flow-view'
11
11
 
12
12
  export const FlowPage = memo(() => {
@@ -1,9 +1,9 @@
1
1
  import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@motiadev/ui'
2
2
  import { ChevronsUpDown, Workflow } from 'lucide-react'
3
3
  import { useShallow } from 'zustand/react/shallow'
4
- import { useFetchFlows } from '@/hooks/use-fetch-flows'
5
- import { motiaAnalytics } from '@/lib/motia-analytics'
6
- import { useFlowStore } from '@/stores/use-flow-store'
4
+ import { useFetchFlows } from '../../hooks/use-fetch-flows'
5
+ import { motiaAnalytics } from '../../lib/motia-analytics'
6
+ import { useFlowStore } from '../../stores/use-flow-store'
7
7
 
8
8
  export const FlowTabMenuItem = () => {
9
9
  useFetchFlows()
@@ -9,7 +9,7 @@ import {
9
9
  } from '@xyflow/react'
10
10
  import type React from 'react'
11
11
  import { useCallback, useState } from 'react'
12
- import type { EdgeData, FlowConfigResponse, FlowResponse, NodeData } from '@/types/flow'
12
+ import type { EdgeData, FlowConfigResponse, FlowResponse, NodeData } from '../../types/flow'
13
13
  import { BaseEdge } from './base-edge'
14
14
  import { FlowLoader } from './flow-loader'
15
15
  import { useGetFlowState } from './hooks/use-get-flow-state'
@@ -2,7 +2,7 @@ import { type Edge, type Node, useEdgesState, useNodesState } from '@xyflow/reac
2
2
  import isEqual from 'fast-deep-equal'
3
3
  import type React from 'react'
4
4
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
5
- import type { EdgeData, FlowConfigResponse, FlowResponse, NodeConfig, NodeData } from '@/types/flow'
5
+ import type { EdgeData, FlowConfigResponse, FlowResponse, NodeConfig, NodeData } from '../../../types/flow'
6
6
  import { ApiFlowNode } from '../nodes/api-flow-node'
7
7
  import { CronFlowNode } from '../nodes/cron-flow-node'
8
8
  import { EventFlowNode } from '../nodes/event-flow-node'
@@ -1,5 +1,5 @@
1
1
  import { useCallback } from 'react'
2
- import type { FlowConfigResponse } from '@/types/flow'
2
+ import type { FlowConfigResponse } from '../../../types/flow'
3
3
 
4
4
  export const useSaveWorkflowConfig = () => {
5
5
  return useCallback(async (body: FlowConfigResponse) => {
@@ -3,7 +3,7 @@ import dagre from 'dagre'
3
3
  import isEqual from 'fast-deep-equal'
4
4
  import type React from 'react'
5
5
  import { useEffect, useRef } from 'react'
6
- import type { EdgeData, NodeData } from '@/types/flow'
6
+ import type { EdgeData, NodeData } from '../../types/flow'
7
7
 
8
8
  const organizeNodes = (nodes: Node<NodeData>[], edges: Edge<EdgeData>[]): Node<NodeData>[] => {
9
9
  const dagreGraph = new dagre.graphlib.Graph({ directed: true, compound: false, multigraph: false })
@@ -1,5 +1,5 @@
1
- import { ApiNode } from '@/publicComponents/api-node'
2
- import type { ApiNodeProps } from '@/publicComponents/node-props'
1
+ import { ApiNode } from '../../../publicComponents/api-node'
2
+ import type { ApiNodeProps } from '../../../publicComponents/node-props'
3
3
 
4
4
  export const ApiFlowNode = ({ data }: ApiNodeProps) => {
5
5
  return <ApiNode data={data} />
@@ -1,5 +1,5 @@
1
- import { CronNode } from '@/publicComponents/cron-node'
2
- import type { CronNodeProps } from '@/publicComponents/node-props'
1
+ import { CronNode } from '../../../publicComponents/cron-node'
2
+ import type { CronNodeProps } from '../../../publicComponents/node-props'
3
3
 
4
4
  export const CronFlowNode = ({ data }: CronNodeProps) => {
5
5
  return <CronNode data={data} />
@@ -1,5 +1,5 @@
1
- import { EventNode } from '@/publicComponents/event-node'
2
- import type { EventNodeProps } from '@/publicComponents/node-props'
1
+ import { EventNode } from '../../../publicComponents/event-node'
2
+ import type { EventNodeProps } from '../../../publicComponents/node-props'
3
3
 
4
4
  export const EventFlowNode = ({ data }: EventNodeProps) => {
5
5
  return <EventNode data={data} />
@@ -1,5 +1,5 @@
1
- import type { NoopNodeProps } from '@/publicComponents/node-props'
2
- import { NoopNode } from '@/publicComponents/noop-node'
1
+ import type { NoopNodeProps } from '../../../publicComponents/node-props'
2
+ import { NoopNode } from '../../../publicComponents/noop-node'
3
3
 
4
4
  export const NoopFlowNode = ({ data }: NoopNodeProps) => {
5
5
  return <NoopNode data={data} />
@@ -1,7 +1,7 @@
1
1
  import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@motiadev/ui'
2
2
  import { Rocket } from 'lucide-react'
3
3
  import { useState } from 'react'
4
- import { motiaAnalytics } from '@/lib/motia-analytics'
4
+ import { motiaAnalytics } from '../../lib/motia-analytics'
5
5
 
6
6
  export const DeployButton = () => {
7
7
  const [isOpen, setIsOpen] = useState(false)
@@ -1,9 +1,11 @@
1
1
  import { useThemeStore } from '@motiadev/ui'
2
2
  import type React from 'react'
3
3
  import { memo, useEffect } from 'react'
4
- import motiaLogoDark from '@/assets/motia-dark.png'
5
- import motiaLogoLight from '@/assets/motia-light.png'
6
- import { useMotiaConfigStore } from '@/stores/use-motia-config-store'
4
+ // @ts-expect-error: PNG asset types
5
+ import motiaLogoDark from '../../assets/motia-dark.png'
6
+ // @ts-expect-error: PNG asset types
7
+ import motiaLogoLight from '../../assets/motia-light.png'
8
+ import { useMotiaConfigStore } from '../../stores/use-motia-config-store'
7
9
  import { Tutorial } from '../tutorial/tutorial'
8
10
  import { TutorialButton } from '../tutorial/tutorial-button'
9
11
  import { ThemeToggle } from '../ui/theme-toggle'
@@ -1,6 +1,6 @@
1
1
  import type { PropsWithChildren } from 'react'
2
2
  import { memo } from 'react'
3
- import { useAnalytics } from '@/lib/motia-analytics'
3
+ import { useAnalytics } from '../lib/motia-analytics'
4
4
 
5
5
  export const RootMotia: React.FC<PropsWithChildren> = memo(({ children }) => {
6
6
  useAnalytics()
@@ -1,7 +1,7 @@
1
1
  import { Button } from '@motiadev/ui'
2
2
  import { Book } from 'lucide-react'
3
3
  import type { FC } from 'react'
4
- import { motiaAnalytics } from '@/lib/motia-analytics'
4
+ import { motiaAnalytics } from '../../lib/motia-analytics'
5
5
  import { Tooltip } from '../ui/tooltip'
6
6
  import { useTutorial } from './hooks/use-tutorial'
7
7
 
@@ -1,4 +1,4 @@
1
- import { motiaAnalytics } from '@/lib/motia-analytics'
1
+ import { motiaAnalytics } from '../../lib/motia-analytics'
2
2
  import { useTutorialEngine } from './hooks/use-tutorial-engine'
3
3
  import { TutorialStep } from './tutorial-step'
4
4
  import './tutorial.css'
@@ -1,7 +1,7 @@
1
1
  import { useStreamGroup } from '@motiadev/stream-client-react'
2
2
  import { useEffect } from 'react'
3
- import { useFlowStore } from '@/stores/use-flow-store'
4
- import type { FlowResponse } from '@/types/flow'
3
+ import { useFlowStore } from '../stores/use-flow-store'
4
+ import type { FlowResponse } from '../types/flow'
5
5
 
6
6
  const streamGroupArgs = { streamName: '__motia.flows', groupId: 'default' }
7
7
 
@@ -1,7 +1,7 @@
1
1
  import { plugins } from 'virtual:motia-plugins'
2
2
  import { DynamicIcon, dynamicIconImports, type IconName } from 'lucide-react/dynamic'
3
3
  import { memo } from 'react'
4
- import { type AppTab, TabLocation, useAppTabsStore } from '@/stores/use-app-tabs-store'
4
+ import { type AppTab, TabLocation, useAppTabsStore } from '../stores/use-app-tabs-store'
5
5
  import { isValidTabLocation } from './utils'
6
6
 
7
7
  export const registerPluginTabs = (addTab: (position: TabLocation, tab: AppTab) => void): void => {
@@ -1,4 +1,4 @@
1
- import { TabLocation } from '@/stores/use-app-tabs-store'
1
+ import { TabLocation } from '../stores/use-app-tabs-store'
2
2
 
3
3
  export const formatDuration = (duration?: number) => {
4
4
  if (duration === undefined || duration === null) return 'N/A'
@@ -2,8 +2,8 @@ import { Button, cn } from '@motiadev/ui'
2
2
  import { ScanSearch } from 'lucide-react'
3
3
  import type React from 'react'
4
4
  import { type PropsWithChildren, useCallback, useEffect, useState } from 'react'
5
- import { useHandlePositions } from '@/hooks/use-update-handle-positions'
6
- import type { Feature } from '@/types/file'
5
+ import { useHandlePositions } from '../../hooks/use-update-handle-positions'
6
+ import type { Feature } from '../../types/file'
7
7
  import type { BaseNodeProps } from '../node-props'
8
8
  import { BaseHandle } from './base-handle'
9
9
  import { NodeHeader } from './node-header'
@@ -3,7 +3,7 @@ import type React from 'react'
3
3
  import { useRef, useState } from 'react'
4
4
  import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'
5
5
  import { oneDark, oneLight } from 'react-syntax-highlighter/dist/esm/styles/prism'
6
- import type { Feature } from '@/types/file'
6
+ import type { Feature } from '../../types/file'
7
7
  import { FeatureCard } from './feature-card'
8
8
  import { LanguageIndicator } from './language-indicator'
9
9
 
@@ -1,5 +1,5 @@
1
1
  import type React from 'react'
2
- import type { EventNodeData } from '@/types/flow'
2
+ import type { EventNodeData } from '../../types/flow'
3
3
 
4
4
  const toTopic = (emit: string | { topic: string; label?: string; conditional?: boolean }) =>
5
5
  typeof emit === 'string' ? emit : emit.topic
@@ -1,6 +1,6 @@
1
1
  import { cn } from '@motiadev/ui'
2
2
  import type React from 'react'
3
- import type { Feature } from '@/types/file'
3
+ import type { Feature } from '../../types/file'
4
4
 
5
5
  type Props = {
6
6
  feature: Feature
@@ -1,6 +1,6 @@
1
1
  import { cn } from '@motiadev/ui'
2
2
  import type { FC } from 'react'
3
- import type { EventNodeData } from '@/types/flow'
3
+ import type { EventNodeData } from '../../types/flow'
4
4
 
5
5
  type Props = { language: EventNodeData['language']; className?: string; size?: number; showLabel?: boolean }
6
6
 
@@ -1,7 +1,7 @@
1
1
  import { Sidebar } from '@motiadev/ui'
2
2
  import { X } from 'lucide-react'
3
3
  import type React from 'react'
4
- import type { Feature } from '@/types/file'
4
+ import type { Feature } from '../../types/file'
5
5
  import { CodeDisplay } from './code-display'
6
6
 
7
7
  type NodeSidebarProps = {
@@ -1,6 +1,6 @@
1
1
  import { create } from 'zustand'
2
2
  import { createJSONStorage, persist } from 'zustand/middleware'
3
- import { motiaAnalytics } from '@/lib/motia-analytics'
3
+ import { motiaAnalytics } from '../lib/motia-analytics'
4
4
 
5
5
  interface TabsState {
6
6
  tab: Record<string, string>
@@ -0,0 +1,22 @@
1
+ const config = require('../../eslint.config.js')
2
+
3
+ module.exports = [
4
+ // ignore src files
5
+ { ignores: ['**/src/**/*'] },
6
+ ...config.map((cfg) => {
7
+ if (!cfg.files) {
8
+ return cfg
9
+ }
10
+
11
+ return {
12
+ ...cfg,
13
+ languageOptions: {
14
+ ...cfg.languageOptions,
15
+ parserOptions: {
16
+ project: null,
17
+ },
18
+ },
19
+ files: ['middleware.ts', 'tailwind.config.ts', 'vite.config.ts'],
20
+ }
21
+ }),
22
+ ]
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@motiadev/workbench",
3
3
  "description": "A web-based interface for building and managing Motia workflows.",
4
- "version": "0.13.0-beta.162-439402",
4
+ "version": "0.13.0-beta.162-158257",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.js",
@@ -51,9 +51,9 @@
51
51
  "vite": "^7.2.4",
52
52
  "zod": "^4.1.13",
53
53
  "zustand": "^5.0.8",
54
- "@motiadev/core": "0.13.0-beta.162-439402",
55
- "@motiadev/ui": "0.13.0-beta.162-439402",
56
- "@motiadev/stream-client-react": "0.13.0-beta.162-439402"
54
+ "@motiadev/stream-client-react": "0.13.0-beta.162-158257",
55
+ "@motiadev/ui": "0.13.0-beta.162-158257",
56
+ "@motiadev/core": "0.13.0-beta.162-158257"
57
57
  },
58
58
  "devDependencies": {
59
59
  "@bosh-code/tsdown-plugin-inject-css": "^2.0.0",