langflower 0.1.3 → 0.2.1
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.
- package/README.md +567 -129
- package/dist/{chunk-WV2YWHOC.js → chunk-26UB55E5.js} +44 -4
- package/dist/{chunk-AO33IM2J.js → chunk-2LE3E2QP.js} +24 -23
- package/dist/{chunk-NIRPHJLO.js → chunk-3Z7Q6SQ5.js} +501 -242
- package/dist/{chunk-CVTPGIZE.js → chunk-RZUZX6PW.js} +2 -4
- package/dist/index.js +43935 -44199
- package/docs/public/extending.md +21 -3
- package/docs/public/getting-started.md +2 -1
- package/docs/public/how-it-works.md +2 -2
- package/docs/public/launcher.md +13 -12
- package/package.json +1 -1
- package/ui-dist/{chunk-EZTB7Q33.js → chunk-HEF6F5HN.js} +3 -3
- package/ui-dist/{chunk-BKIP5WRK.js → chunk-IASSR2ON.js} +1 -1
- package/ui-dist/index.html +2 -2
- package/ui-dist/main-NBS6BFBP.js +323 -0
- package/ui-dist/styles-M2URERWI.css +1 -0
- package/vendor/node-sdk/dist/node-factory/define-llm-node/default-llm-ports.js +1 -1
- package/vendor/node-sdk/dist/node-factory/define-llm-node/define-llm-node.d.ts +9 -21
- package/vendor/node-sdk/dist/node-factory/define-llm-node/define-llm-node.js +9 -3
- package/vendor/node-sdk/dist/node-factory/define-llm-node/recovery-notice.d.ts +0 -1
- package/vendor/node-sdk/dist/node-factory/define-llm-node/recovery-notice.js +0 -9
- package/vendor/node-sdk/dist/node-factory/define-node/define-node.d.ts +5 -1
- package/vendor/node-sdk/dist/node-factory/define-node/define-node.js +6 -3
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/capabilities.d.ts +128 -0
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/capabilities.js +25 -0
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/define-reactive-node.d.ts +29 -17
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/define-reactive-node.js +14 -6
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/io-helpers.d.ts +19 -5
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/io-helpers.js +4 -3
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/port-meta.d.ts +6 -1
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/types.d.ts +40 -22
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/types.js +2 -0
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/ui-schema-inference.d.ts +1 -1
- package/vendor/node-sdk/dist/node-factory/define-tool-registrations/define-tool-registrations.d.ts +13 -25
- package/vendor/node-sdk/dist/node-factory/define-tool-registrations/define-tool-registrations.js +9 -8
- package/vendor/node-sdk/dist/testing/create-node-harness.d.ts +9 -2
- package/vendor/node-sdk/dist/testing/create-node-harness.js +6 -2
- package/vendor/node-sdk/package.json +5 -0
- package/vendor/runtime/dist/bypass-ports.d.ts +0 -6
- package/vendor/runtime/dist/bypass-ports.js +0 -7
- package/vendor/runtime/dist/runtime-editor.d.ts +1 -1
- package/vendor/runtime/dist/runtime-editor.js +1 -1
- package/vendor/runtime/dist/runtime-helpers.d.ts +0 -1
- package/vendor/runtime/dist/runtime-helpers.js +0 -33
- package/vendor/runtime/dist/runtime-runner.d.ts +4 -0
- package/vendor/runtime/dist/runtime-runner.js +60 -36
- package/vendor/runtime/dist/runtime.d.ts +0 -1
- package/vendor/runtime/dist/runtime.js +0 -1
- package/vendor/runtime/dist/types.d.ts +27 -17
- package/vendor/server/skeleton/gitignore +8 -0
- package/vendor/server/skeleton/instructions.md +6 -0
- package/vendor/server/skeleton/nodes/my-nodes/README.md +19 -1
- package/vendor/server/skeleton/schemas/langflower-config.schema.json +1 -1
- package/vendor/server/skeleton/skills/langflower-helper/SKILL.md +35 -12
- package/vendor/server/skeleton/skills/langflower-helper/layout.md +6 -4
- package/vendor/server/skeleton/skills/langflower-node-writer/SKILL.md +47 -3
- package/vendor/server/skeleton/skills/langflower-workflow-writer/SKILL.md +29 -17
- package/vendor/server/skeleton/workflows/advanced-coder.json +24 -2
- package/vendor/server/skeleton/workflows/kb-create.json +24 -16
- package/vendor/server/skeleton/workflows/kb-manual-search.json +1 -1
- package/vendor/server/skeleton/workflows/kb-navigate.json +24 -2
- package/vendor/server/skeleton/workflows/kb-rag.json +1 -0
- package/vendor/server/skeleton/workflows/simple-coder.json +3 -0
- package/vendor/server/skeleton/workflows/starter.json +2 -0
- package/ui-dist/main-JJURZFKA.js +0 -318
- package/ui-dist/styles-VA3HMZK7.css +0 -1
- package/vendor/node-sdk/dist/node-factory/define-llm-node/llm-inventory-wire.d.ts +0 -5
- package/vendor/node-sdk/dist/node-factory/define-llm-node/llm-inventory-wire.js +0 -5
- package/vendor/node-sdk/dist/node-factory/define-llm-node/llm.d.ts +0 -3
- package/vendor/node-sdk/dist/node-factory/define-llm-node/llm.js +0 -2
- package/vendor/node-sdk/dist/node-factory/define-mcp/define-mcp.d.ts +0 -50
- package/vendor/node-sdk/dist/node-factory/define-mcp/define-mcp.js +0 -60
- package/vendor/node-sdk/dist/node-factory/define-mcp/mcp-handle.d.ts +0 -15
- package/vendor/node-sdk/dist/node-factory/define-mcp/mcp-handle.js +0 -2
- package/vendor/node-sdk/dist/node-factory/define-mcp/mcp-server-config.d.ts +0 -17
- package/vendor/node-sdk/dist/node-factory/define-mcp/mcp-server-config.js +0 -2
- package/vendor/node-sdk/dist/node-factory/define-mcp/mcp-transport.d.ts +0 -20
- package/vendor/node-sdk/dist/node-factory/define-mcp/mcp-transport.js +0 -2
- package/vendor/node-sdk/dist/node-factory/define-mcp/mcp.d.ts +0 -3
- package/vendor/node-sdk/dist/node-factory/define-mcp/mcp.js +0 -2
- package/vendor/node-sdk/dist/node-factory/define-node/test/samples/gate-node.d.ts +0 -20
- package/vendor/node-sdk/dist/node-factory/define-node/test/samples/gate-node.js +0 -22
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/chat-completion-stream.d.ts +0 -50
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/chat-completion-stream.js +0 -2
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/crawl-context.d.ts +0 -22
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/crawl-context.js +0 -2
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/create-embedding.d.ts +0 -6
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/create-embedding.js +0 -2
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/define-tool-registrations.d.ts +0 -52
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/define-tool-registrations.js +0 -52
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/kb-context.d.ts +0 -111
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/kb-context.js +0 -2
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/memory-context.d.ts +0 -12
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/memory-context.js +0 -2
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/project-files-context.d.ts +0 -10
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/project-files-context.js +0 -2
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/project-harness.d.ts +0 -56
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/project-harness.js +0 -2
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/test/samples/agent-node.d.ts +0 -29
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/test/samples/agent-node.js +0 -60
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/test/samples/combine-node.d.ts +0 -29
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/test/samples/combine-node.js +0 -26
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/test/samples/constant-node.d.ts +0 -29
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/test/samples/constant-node.js +0 -21
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/test/samples/delay-node.d.ts +0 -29
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/test/samples/delay-node.js +0 -27
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/test/samples/finish-node.d.ts +0 -17
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/test/samples/finish-node.js +0 -21
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/test/samples/hitl-node.d.ts +0 -21
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/test/samples/hitl-node.js +0 -43
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/test/samples/join-node.d.ts +0 -29
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/test/samples/join-node.js +0 -31
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/test/samples/preview-node.d.ts +0 -17
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/test/samples/preview-node.js +0 -19
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/test/samples/router-node.d.ts +0 -18
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/test/samples/router-node.js +0 -12
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/tool-registration.d.ts +0 -36
- package/vendor/node-sdk/dist/node-factory/define-reactive-node/tool-registration.js +0 -2
- package/vendor/node-sdk/dist/node-factory/define-tool-registrations/tool-registration.d.ts +0 -46
- package/vendor/node-sdk/dist/node-factory/define-tool-registrations/tool-registration.js +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@charset "UTF-8";@layer properties;:root{--ngd-colors-gray-100: #ffffff;--ngd-colors-gray-200: #f7f7f7;--ngd-colors-gray-300: #edeff3;--ngd-colors-gray-400: #d5d8e0;--ngd-colors-gray-450: #c2c0c0;--ngd-colors-gray-500: #6f7480;--ngd-colors-gray-600: #4d5059;--ngd-colors-gray-650: #383a40;--ngd-colors-gray-700: #27282b;--ngd-colors-gray-800: #151516;--ngd-colors-gray-900-5: rgba(7, 7, 8, .05);--ngd-colors-gray-900-20: rgba(7, 7, 8, .2);--ngd-colors-gray-900-50: rgba(7, 7, 8, .5);--ngd-colors-acc1-400: #a977ff;--ngd-colors-acc1-500: #9140ff;--ngd-colors-acc1-500-40: rgba(145, 64, 255, .4);--ngd-colors-acc1-500-50: rgba(145, 64, 255, .5);--ngd-colors-acc1-600: #891aff;--ngd-colors-acc4-500: #1096e7}:root{--ngd-shadow: var(--ngd-colors-gray-900-20);--ngd-txt-primary-default: var(--ngd-colors-gray-800);--ngd-nav-button-primary-default: var(--ngd-colors-gray-600);--ngd-nav-button-primary-pressed: var(--ngd-colors-acc1-600);--ngd-nav-button-primary-hover: var(--ngd-colors-gray-900-5);--ngd-nav-button-primary-disabled: var(--ngd-colors-gray-450);--ngd-diagram-background-color: var(--ngd-colors-gray-200);--ngd-ui-bg-primary-default: var(--ngd-colors-gray-100);--ngd-ui-bg-tertiary-default: var(--ngd-colors-gray-200);--ngd-ui-stroke-primary-focus: var(--ngd-colors-gray-500);--ngd-pt-stroke-primary-default: var(--ngd-colors-gray-600);--ngd-node-bg-primary-default: var(--ngd-colors-gray-100);--ngd-node-stroke-primary-default: var(--ngd-colors-gray-400);--ngd-node-stroke-primary-hover: var(--ngd-colors-acc1-500);--ngd-node-port-fill-default: var(--ngd-colors-gray-100);--ngd-node-port-fill-active: var(--ngd-colors-acc1-500);--ngd-node-port-stroke-default: var(--ngd-colors-gray-500);--ngd-node-port-stroke-active: var(--ngd-colors-gray-100);--ngd-transform-box: var(--ngd-colors-acc4-500);--ngd-focus-ring-node-active: var(--ngd-colors-acc1-500-40);--ngd-button-gray-bg-default: var(--ngd-colors-gray-500);--ngd-button-gray-bg-hover: var(--ngd-colors-gray-600);--ngd-button-gray-bg-active: var(--ngd-colors-gray-650);--ngd-default-edge-label-bg-primary-default: var(--ngd-colors-gray-100);--ngd-background-line-minor-color: var(--ngd-colors-gray-450);--ngd-background-line-major-color: var(--ngd-colors-gray-500);--ngd-ui-border-color: var(--ngd-colors-gray-300);--ngd-minimap-bg-primary-default: var(--ngd-colors-gray-100);--ngd-minimap-stroke-primary-default: var(--ngd-colors-gray-400)}html[data-theme=dark]{--ngd-shadow: var(--ngd-colors-gray-900-50);--ngd-txt-primary-default: var(--ngd-colors-gray-100);--ngd-nav-button-primary-default: var(--ngd-colors-gray-400);--ngd-nav-button-primary-pressed: var(--ngd-colors-acc1-500);--ngd-nav-button-primary-hover: var(--ngd-colors-gray-900-5);--ngd-nav-button-primary-disabled: var(--ngd-colors-gray-600);--ngd-diagram-background-color: var(--ngd-colors-gray-800);--ngd-ui-bg-primary-default: var(--ngd-colors-gray-700);--ngd-ui-bg-tertiary-default: var(--ngd-colors-gray-800);--ngd-ui-stroke-primary-focus: var(--ngd-colors-gray-500);--ngd-pt-stroke-primary-default: var(--ngd-colors-gray-200);--ngd-node-bg-primary-default: var(--ngd-colors-gray-700);--ngd-node-stroke-primary-default: var(--ngd-colors-gray-600);--ngd-node-stroke-primary-hover: var(--ngd-colors-acc1-400);--ngd-node-port-fill-default: var(--ngd-colors-gray-100);--ngd-node-port-fill-active: var(--ngd-colors-acc1-500);--ngd-node-port-stroke-default: var(--ngd-colors-gray-500);--ngd-node-port-stroke-active: var(--ngd-colors-gray-100);--ngd-transform-box: var(--ngd-colors-acc4-500);--ngd-focus-ring-node-active: var(--ngd-colors-acc1-500-40);--ngd-button-gray-bg-default: var(--ngd-colors-gray-650);--ngd-button-gray-bg-hover: var(--ngd-colors-gray-600);--ngd-button-gray-bg-active: var(--ngd-colors-gray-500);--ngd-default-edge-label-bg-primary-default: var(--ngd-colors-gray-700);--ngd-background-line-minor-color: var(--ngd-colors-gray-700);--ngd-background-line-major-color: var(--ngd-colors-gray-600);--ngd-ui-border-color: var(--ngd-colors-gray-700);--ngd-minimap-bg-primary-default: var(--ngd-colors-gray-700);--ngd-minimap-stroke-primary-default: var(--ngd-colors-gray-600)}:root{--ngd-node-background-color: var(--ngd-node-bg-primary-default);--ngd-node-border-color: var(--ngd-node-stroke-primary-default);--ngd-node-border-color-hover: var(--ngd-node-stroke-primary-hover);--ngd-node-border-radius: .75rem;--ngd-node-border-size: .0625rem;--ngd-group-border-color: var(--ngd-ui-stroke-primary-focus);--ngd-group-border-color-hover: var(--ngd-pt-stroke-primary-default);--ngd-group-border-color-highlight: var(--ngd-colors-acc1-500);--ngd-group-box-shadow-color-highlight: var(--ngd-colors-acc1-500-50);--ngd-group-background-color-highlight: var(--ngd-colors-gray-400);--ngd-group-border-radius: .75rem;--ngd-group-highlight-size: 1.25rem;--ngd-selected-node-box-shadow: 0 0 0 .25rem var(--ngd-focus-ring-node-active);--ngd-rotate-handle-size: 2rem;--ngd-rotate-handle-distance: 2rem;--ngd-rotate-handle-background-color: var(--ngd-button-gray-bg-default);--ngd-rotate-handle-background-color-hover: var(--ngd-button-gray-bg-hover);--ngd-rotate-handle-background-color-active: var(--ngd-button-gray-bg-active);--ngd-rotate-handle-xy: calc(-.7071 * var(--ngd-rotate-handle-distance));--ngd-rotate-handle-top: var(--ngd-rotate-handle-xy);--ngd-rotate-handle-right: var(--ngd-rotate-handle-xy);--ngd-resize-line-border-width: .0625rem;--ngd-resize-line-border-style: solid;--ngd-resize-line-border-color: var(--ngd-transform-box);--ngd-resize-handle-size: .375rem;--ngd-resize-handle-background-color: var(--ngd-ui-bg-primary-default);--ngd-resize-handle-border-size: .0625rem;--ngd-resize-handle-border-style: solid;--ngd-resize-handle-border-color: var(--ngd-transform-box);--ngd-resize-handle-border-radius: 0;--ngd-port-size: .25rem;--ngd-port-background-color: var(--ngd-node-port-fill-default);--ngd-port-border-color: var(--ngd-node-port-stroke-default);--ngd-port-border-size: .125rem;--ngd-port-border-radius: 50%;--ngd-port-background-color-hover: var(--ngd-node-port-fill-active);--ngd-port-border-color-hover: var(--ngd-node-port-stroke-active);--ngd-port-border-size-hover: .25rem;--ngd-default-edge-stroke: var(--ngd-colors-gray-500);--ngd-default-edge-stroke-hover: var(--ngd-colors-gray-700);--ngd-default-edge-stroke-selected: var(--ngd-colors-acc1-500);--ngd-box-selection-border-color: #961ce7;--ngd-box-selection-border-size: 1px;--ngd-box-selection-background: rgba(43, 91, 213, .12);--ngd-default-edge-label-background-color: var(--ngd-default-edge-label-bg-primary-default);--ngd-default-edge-label-color: var(--ngd-txt-primary-default);--ngd-default-edge-label-border-color: var(--ngd-colors-gray-500);--ngd-background-dot-color: var(--ngd-colors-gray-500);--ngd-background-line-minor-width: .5;--ngd-background-line-major-width: 1;--ngd-background-line-minor-opacity: .5;--ngd-background-line-major-opacity: .6;--ngd-minimap-background: var(--ngd-minimap-bg-primary-default);--ngd-minimap-border-color: var(--ngd-minimap-stroke-primary-default);--ngd-minimap-shadow-color: var(--ngd-shadow);--ngd-minimap-border-radius: 1rem;--ngd-minimap-padding: .5rem;--ngd-minimap-margin: 1rem;--ngd-minimap-node-color: var(--ngd-colors-gray-400);--ngd-minimap-node-opacity: .8;--ngd-minimap-diagram-bounds-opacity: .3;--ngd-minimap-diagram-bounds-color: var(--ngd-colors-gray-400);--ngd-minimap-viewport-stroke-color: var(--ngd-colors-gray-400);--ngd-minimap-viewport-stroke-width: 1;--ngd-nav-button-color: var(--ngd-nav-button-primary-default);--ngd-nav-button-size: 1.25rem;--ngd-nav-button-border-radius: .5rem;--ngd-nav-button-padding: .6875rem;--ngd-nav-button-background-color-hover: var(--ngd-nav-button-primary-hover);--ngd-nav-button-color-active: var(--ngd-nav-button-primary-pressed);--ngd-nav-button-color-disabled: var(--ngd-nav-button-primary-disabled);--ngd-zoom-controls-font-size: .8125rem;--ngd-zoom-controls-font-weight: 500;--ngd-zoom-controls-color: var(--ngd-nav-button-primary-default)}.ng-diagram-port-hoverable .ng-diagram-port:hover,.ng-diagram-port-hoverable .ng-diagram-port.custom-content:hover .content-projection,.ng-diagram-port-hoverable-over-node:hover:not(:has(.ng-diagram-rotate-handle:hover)):not(:has([data-rotating])) .ng-diagram-port.custom-content .content-projection,.ng-diagram-port-hoverable-over-node:hover:not(:has(.ng-diagram-rotate-handle:hover)):not(:has([data-rotating])) .ng-diagram-port{background-color:var(--ngd-port-background-color-hover);border-color:var(--ngd-port-background-color-hover);outline:calc(1px + var(--ngd-port-border-size)) solid var(--ngd-port-background-color-hover);outline-offset:-1px;box-shadow:0 0 0 var(--ngd-port-border-size-hover) var(--ngd-port-border-color-hover)}.ng-diagram-node-wrapper:not(.ng-diagram-node-selected){transition:box-shadow .1s ease-in-out}.ng-diagram-node-wrapper.ng-diagram-group-highlight,.ng-diagram-node-wrapper.ng-diagram-group.ng-diagram-group-highlight{border-color:var(--ngd-group-border-color-highlight);box-shadow:0 0 var(--ngd-group-highlight-size) 0 var(--ngd-group-box-shadow-color-highlight) inset}.ng-diagram-node-wrapper.ng-diagram-node-selected{box-shadow:var(--ngd-selected-node-box-shadow)}ng-diagram *,ng-diagram *:before,ng-diagram *:after{box-sizing:border-box}@layer theme,base,components,utilities;@layer theme{:root,:host{--font-sans: Inter, ui-sans-serif, system-ui, sans-serif;--font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, monospace;--color-red-300: oklch(80.8% .114 19.571);--color-red-700: oklch(50.5% .213 27.518);--color-amber-50: oklch(98.7% .022 95.277);--color-amber-100: oklch(96.2% .059 95.617);--color-amber-300: oklch(87.9% .169 91.605);--color-amber-400: oklch(82.8% .189 84.429);--color-amber-500: oklch(76.9% .188 70.08);--color-amber-600: oklch(66.6% .179 58.318);--color-amber-700: oklch(55.5% .163 48.998);--color-amber-800: oklch(47.3% .137 46.201);--color-amber-900: oklch(41.4% .112 45.904);--color-amber-950: oklch(27.9% .077 45.635);--color-emerald-50: oklch(97.9% .021 166.113);--color-emerald-100: oklch(95% .052 163.051);--color-emerald-300: oklch(84.5% .143 164.978);--color-emerald-400: oklch(76.5% .177 163.223);--color-emerald-500: oklch(69.6% .17 162.48);--color-emerald-600: oklch(59.6% .145 163.225);--color-emerald-700: oklch(50.8% .118 165.612);--color-emerald-950: oklch(26.2% .051 172.552);--color-sky-50: oklch(97.7% .013 236.62);--color-sky-100: oklch(95.1% .026 236.824);--color-sky-300: oklch(82.8% .111 230.318);--color-sky-400: oklch(74.6% .16 232.661);--color-sky-500: oklch(68.5% .169 237.323);--color-sky-700: oklch(50% .134 242.749);--color-sky-950: oklch(29.3% .066 243.157);--color-violet-400: oklch(70.2% .183 293.541);--color-rose-50: oklch(96.9% .015 12.422);--color-rose-100: oklch(94.1% .03 12.58);--color-rose-300: oklch(81% .117 11.638);--color-rose-400: oklch(71.2% .194 13.428);--color-rose-500: oklch(64.5% .246 16.439);--color-rose-600: oklch(58.6% .253 17.585);--color-rose-700: oklch(51.4% .222 16.935);--color-rose-800: oklch(45.5% .188 13.697);--color-rose-950: oklch(27.1% .105 12.094);--color-zinc-50: oklch(98.5% 0 0);--color-zinc-100: oklch(96.7% .001 286.375);--color-zinc-200: oklch(92% .004 286.32);--color-zinc-300: oklch(87.1% .006 286.286);--color-zinc-400: oklch(70.5% .015 286.067);--color-zinc-500: oklch(55.2% .016 285.938);--color-zinc-600: oklch(44.2% .017 285.786);--color-zinc-700: oklch(37% .013 285.805);--color-zinc-800: oklch(27.4% .006 286.033);--color-zinc-900: oklch(21% .006 285.885);--color-zinc-950: oklch(14.1% .005 285.823);--color-white: #fff;--spacing: .25rem;--container-md: 28rem;--text-xs: .75rem;--text-xs--line-height: calc(1 / .75);--text-sm: .875rem;--text-sm--line-height: calc(1.25 / .875);--text-base: 1rem;--text-base--line-height: 1.5 ;--text-lg: 1.125rem;--text-lg--line-height: calc(1.75 / 1.125);--font-weight-medium: 500;--font-weight-semibold: 600;--tracking-tight: -.025em;--tracking-normal: 0em;--tracking-wide: .025em;--radius-md: .375rem;--radius-lg: .5rem;--radius-xl: .75rem;--radius-2xl: 1rem;--default-transition-duration: .15s;--default-transition-timing-function: cubic-bezier(.4, 0, .2, 1);--default-font-family: var(--font-sans);--default-mono-font-family: var(--font-mono)}}@layer base{*,:after,:before,::backdrop,::file-selector-button{box-sizing:border-box;margin:0;padding:0;border:0 solid}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;tab-size:4;font-family:var(--default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings, normal);font-variation-settings:var(--default-font-variation-settings, normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings, normal);font-variation-settings:var(--default-mono-font-variation-settings, normal);font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea,::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;border-radius:0;background-color:transparent;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px){::placeholder{color:currentcolor}@supports (color: color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]),::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:0}.inset-x-0{inset-inline:0}.top-0{top:0}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-full{top:100%}.right-0{right:0}.right-full{right:100%}.bottom-0{bottom:0}.bottom-1{bottom:var(--spacing)}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-full{left:100%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[3\]{z-index:3}.container{width:100%}@media(width>=40rem){.container{max-width:40rem}}@media(width>=48rem){.container{max-width:48rem}}@media(width>=64rem){.container{max-width:64rem}}@media(width>=80rem){.container{max-width:80rem}}@media(width>=96rem){.container{max-width:96rem}}.mx-1{margin-inline:var(--spacing)}.my-1{margin-block:var(--spacing)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-auto{margin-right:auto}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-12{height:calc(var(--spacing) * 12)}.h-\[2lh\]{height:2lh}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-\[55\%\]{max-height:55%}.min-h-0{min-height:0}.min-h-12{min-height:calc(var(--spacing) * 12)}.min-h-\[calc\(var\(--lf-control-h\)\+1\.1rem\)\]{min-height:calc(var(--lf-control-h) + 1.1rem)}.min-h-\[var\(--lf-control-h\)\]{min-height:var(--lf-control-h)}.min-h-full{min-height:100%}.w-1{width:var(--spacing)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-72{width:calc(var(--spacing) * 72)}.w-80{width:calc(var(--spacing) * 80)}.w-96{width:calc(var(--spacing) * 96)}.w-full{width:100%}.w-max{width:max-content}.max-w-48{max-width:calc(var(--spacing) * 48)}.max-w-\[92\%\]{max-width:92%}.max-w-\[min\(24rem\,calc\(100vw-2rem\)\)\]{max-width:min(24rem,calc(100vw - 2rem))}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.min-w-0{min-width:0}.min-w-40{min-width:calc(var(--spacing) * 40)}.min-w-48{min-width:calc(var(--spacing) * 48)}.min-w-\[120px\]{min-width:120px}.flex-1{flex:1}.flex-shrink,.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-180{rotate:180deg}.cursor-col-resize{cursor:col-resize}.cursor-grab{cursor:grab}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.resize{resize:both}.resize-none{resize:none}.list-none{list-style-type:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}.self-center{align-self:center}.self-start{align-self:flex-start}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:calc(infinity * 1px)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-tl-md{border-top-left-radius:var(--radius-md)}.rounded-tr-md{border-top-right-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-amber-300{border-color:var(--color-amber-300)}.border-amber-300\/80{border-color:color-mix(in srgb,oklch(87.9% .169 91.605) 80%,transparent)}@supports (color: color-mix(in lab,red,red)){.border-amber-300\/80{border-color:color-mix(in oklab,var(--color-amber-300) 80%,transparent)}}.border-amber-400{border-color:var(--color-amber-400)}.border-emerald-400{border-color:var(--color-emerald-400)}.border-rose-300{border-color:var(--color-rose-300)}.border-rose-400{border-color:var(--color-rose-400)}.border-sky-400{border-color:var(--color-sky-400)}.border-zinc-200{border-color:var(--color-zinc-200)}.border-zinc-300{border-color:var(--color-zinc-300)}.border-zinc-400{border-color:var(--color-zinc-400)}.border-zinc-900{border-color:var(--color-zinc-900)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-400{background-color:var(--color-amber-400)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-400{background-color:var(--color-rose-400)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-transparent{background-color:transparent}.bg-white{background-color:var(--color-white)}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-50\/90{background-color:color-mix(in srgb,oklch(98.5% 0 0) 90%,transparent)}@supports (color: color-mix(in lab,red,red)){.bg-zinc-50\/90{background-color:color-mix(in oklab,var(--color-zinc-50) 90%,transparent)}}.bg-zinc-100{background-color:var(--color-zinc-100)}.bg-zinc-200{background-color:var(--color-zinc-200)}.bg-zinc-400{background-color:var(--color-zinc-400)}.bg-zinc-900{background-color:var(--color-zinc-900)}.bg-gradient-to-b{--tw-gradient-position: to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-t{--tw-gradient-position: to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-white{--tw-gradient-from: var(--color-white);--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-40\%{--tw-gradient-from-position: 40%}.from-45\%{--tw-gradient-from-position: 45%}.to-transparent{--tw-gradient-to: transparent;--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.pt-1{padding-top:var(--spacing)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-11{padding-top:calc(var(--spacing) * 11)}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-14{padding-bottom:calc(var(--spacing) * 14)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading, var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading, var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading, var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.leading-4{--tw-leading: calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-5{--tw-leading: calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading: calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.font-medium{--tw-font-weight: var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight: var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-normal{--tw-tracking: var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking: var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking: var(--tracking-wide);letter-spacing:var(--tracking-wide)}.\[overflow-wrap\:anywhere\]{overflow-wrap:anywhere}.break-words{overflow-wrap:break-word}.wrap-anywhere{overflow-wrap:anywhere}.break-all{word-break:break-all}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-amber-950{color:var(--color-amber-950)}.text-emerald-600{color:var(--color-emerald-600)}.text-emerald-700{color:var(--color-emerald-700)}.text-red-700{color:var(--color-red-700)}.text-rose-600{color:var(--color-rose-600)}.text-rose-700{color:var(--color-rose-700)}.text-rose-800{color:var(--color-rose-800)}.text-sky-700{color:var(--color-sky-700)}.text-white{color:var(--color-white)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-800{color:var(--color-zinc-800)}.text-zinc-900{color:var(--color-zinc-900)}.text-zinc-950{color:var(--color-zinc-950)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.opacity-50{opacity:50%}.opacity-60{opacity:60%}.opacity-70{opacity:70%}.shadow-lg{--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-violet-400{--tw-ring-color: var(--color-violet-400)}.ring-zinc-400\/20{--tw-ring-color: color-mix(in srgb, oklch(70.5% .015 286.067) 20%, transparent)}@supports (color: color-mix(in lab,red,red)){.ring-zinc-400\/20{--tw-ring-color: color-mix(in oklab, var(--color-zinc-400) 20%, transparent)}}.blur{--tw-blur: blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.outline-none{--tw-outline-style: none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[--lf-node-chrome-padding-x\:1\.25rem\]{--lf-node-chrome-padding-x: 1.25rem}.group-focus-within\:block:is(:where(.group):focus-within *){display:block}@media(hover:hover){.group-hover\:block:is(:where(.group):hover *){display:block}}.placeholder\:text-zinc-400::placeholder{color:var(--color-zinc-400)}@media(hover:hover){.hover\:border-zinc-400:hover{border-color:var(--color-zinc-400)}}@media(hover:hover){.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}}@media(hover:hover){.hover\:bg-emerald-100:hover{background-color:var(--color-emerald-100)}}@media(hover:hover){.hover\:bg-rose-50:hover{background-color:var(--color-rose-50)}}@media(hover:hover){.hover\:bg-rose-100:hover{background-color:var(--color-rose-100)}}@media(hover:hover){.hover\:bg-sky-100:hover{background-color:var(--color-sky-100)}}@media(hover:hover){.hover\:bg-zinc-50:hover{background-color:var(--color-zinc-50)}}@media(hover:hover){.hover\:bg-zinc-100:hover{background-color:var(--color-zinc-100)}}@media(hover:hover){.hover\:bg-zinc-400:hover{background-color:var(--color-zinc-400)}}@media(hover:hover){.hover\:bg-zinc-800:hover{background-color:var(--color-zinc-800)}}@media(hover:hover){.hover\:text-zinc-700:hover{color:var(--color-zinc-700)}}@media(hover:hover){.hover\:underline:hover{text-decoration-line:underline}}.focus\:border-zinc-400:focus{border-color:var(--color-zinc-400)}.focus\:ring-2:focus{--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:outline-none:focus{--tw-outline-style: none;outline-style:none}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:50%}.dark\:border-amber-500:where([data-theme=dark],[data-theme=dark] *){border-color:var(--color-amber-500)}.dark\:border-amber-700:where([data-theme=dark],[data-theme=dark] *){border-color:var(--color-amber-700)}.dark\:border-amber-700\/60:where([data-theme=dark],[data-theme=dark] *){border-color:color-mix(in srgb,oklch(55.5% .163 48.998) 60%,transparent)}@supports (color: color-mix(in lab,red,red)){.dark\:border-amber-700\/60:where([data-theme=dark],[data-theme=dark] *){border-color:color-mix(in oklab,var(--color-amber-700) 60%,transparent)}}.dark\:border-amber-800:where([data-theme=dark],[data-theme=dark] *){border-color:var(--color-amber-800)}.dark\:border-emerald-500:where([data-theme=dark],[data-theme=dark] *){border-color:var(--color-emerald-500)}.dark\:border-rose-500:where([data-theme=dark],[data-theme=dark] *){border-color:var(--color-rose-500)}.dark\:border-rose-700:where([data-theme=dark],[data-theme=dark] *){border-color:var(--color-rose-700)}.dark\:border-rose-800:where([data-theme=dark],[data-theme=dark] *){border-color:var(--color-rose-800)}.dark\:border-sky-500:where([data-theme=dark],[data-theme=dark] *){border-color:var(--color-sky-500)}.dark\:border-zinc-100:where([data-theme=dark],[data-theme=dark] *){border-color:var(--color-zinc-100)}.dark\:border-zinc-500:where([data-theme=dark],[data-theme=dark] *){border-color:var(--color-zinc-500)}.dark\:border-zinc-600:where([data-theme=dark],[data-theme=dark] *){border-color:var(--color-zinc-600)}.dark\:border-zinc-700:where([data-theme=dark],[data-theme=dark] *){border-color:var(--color-zinc-700)}.dark\:border-zinc-800:where([data-theme=dark],[data-theme=dark] *){border-color:var(--color-zinc-800)}.dark\:bg-amber-950\/40:where([data-theme=dark],[data-theme=dark] *){background-color:color-mix(in srgb,oklch(27.9% .077 45.635) 40%,transparent)}@supports (color: color-mix(in lab,red,red)){.dark\:bg-amber-950\/40:where([data-theme=dark],[data-theme=dark] *){background-color:color-mix(in oklab,var(--color-amber-950) 40%,transparent)}}.dark\:bg-emerald-950\/40:where([data-theme=dark],[data-theme=dark] *){background-color:color-mix(in srgb,oklch(26.2% .051 172.552) 40%,transparent)}@supports (color: color-mix(in lab,red,red)){.dark\:bg-emerald-950\/40:where([data-theme=dark],[data-theme=dark] *){background-color:color-mix(in oklab,var(--color-emerald-950) 40%,transparent)}}.dark\:bg-rose-950\/30:where([data-theme=dark],[data-theme=dark] *){background-color:color-mix(in srgb,oklch(27.1% .105 12.094) 30%,transparent)}@supports (color: color-mix(in lab,red,red)){.dark\:bg-rose-950\/30:where([data-theme=dark],[data-theme=dark] *){background-color:color-mix(in oklab,var(--color-rose-950) 30%,transparent)}}.dark\:bg-rose-950\/40:where([data-theme=dark],[data-theme=dark] *){background-color:color-mix(in srgb,oklch(27.1% .105 12.094) 40%,transparent)}@supports (color: color-mix(in lab,red,red)){.dark\:bg-rose-950\/40:where([data-theme=dark],[data-theme=dark] *){background-color:color-mix(in oklab,var(--color-rose-950) 40%,transparent)}}.dark\:bg-sky-950\/40:where([data-theme=dark],[data-theme=dark] *){background-color:color-mix(in srgb,oklch(29.3% .066 243.157) 40%,transparent)}@supports (color: color-mix(in lab,red,red)){.dark\:bg-sky-950\/40:where([data-theme=dark],[data-theme=dark] *){background-color:color-mix(in oklab,var(--color-sky-950) 40%,transparent)}}.dark\:bg-zinc-100:where([data-theme=dark],[data-theme=dark] *){background-color:var(--color-zinc-100)}.dark\:bg-zinc-800:where([data-theme=dark],[data-theme=dark] *){background-color:var(--color-zinc-800)}.dark\:bg-zinc-900:where([data-theme=dark],[data-theme=dark] *){background-color:var(--color-zinc-900)}.dark\:bg-zinc-950:where([data-theme=dark],[data-theme=dark] *){background-color:var(--color-zinc-950)}.dark\:bg-zinc-950\/40:where([data-theme=dark],[data-theme=dark] *){background-color:color-mix(in srgb,oklch(14.1% .005 285.823) 40%,transparent)}@supports (color: color-mix(in lab,red,red)){.dark\:bg-zinc-950\/40:where([data-theme=dark],[data-theme=dark] *){background-color:color-mix(in oklab,var(--color-zinc-950) 40%,transparent)}}.dark\:bg-zinc-950\/60:where([data-theme=dark],[data-theme=dark] *){background-color:color-mix(in srgb,oklch(14.1% .005 285.823) 60%,transparent)}@supports (color: color-mix(in lab,red,red)){.dark\:bg-zinc-950\/60:where([data-theme=dark],[data-theme=dark] *){background-color:color-mix(in oklab,var(--color-zinc-950) 60%,transparent)}}.dark\:bg-zinc-950\/90:where([data-theme=dark],[data-theme=dark] *){background-color:color-mix(in srgb,oklch(14.1% .005 285.823) 90%,transparent)}@supports (color: color-mix(in lab,red,red)){.dark\:bg-zinc-950\/90:where([data-theme=dark],[data-theme=dark] *){background-color:color-mix(in oklab,var(--color-zinc-950) 90%,transparent)}}.dark\:from-zinc-900:where([data-theme=dark],[data-theme=dark] *){--tw-gradient-from: var(--color-zinc-900);--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.dark\:text-amber-100:where([data-theme=dark],[data-theme=dark] *){color:var(--color-amber-100)}.dark\:text-amber-300:where([data-theme=dark],[data-theme=dark] *){color:var(--color-amber-300)}.dark\:text-amber-400:where([data-theme=dark],[data-theme=dark] *){color:var(--color-amber-400)}.dark\:text-emerald-300:where([data-theme=dark],[data-theme=dark] *){color:var(--color-emerald-300)}.dark\:text-emerald-400:where([data-theme=dark],[data-theme=dark] *){color:var(--color-emerald-400)}.dark\:text-red-300:where([data-theme=dark],[data-theme=dark] *){color:var(--color-red-300)}.dark\:text-rose-300:where([data-theme=dark],[data-theme=dark] *){color:var(--color-rose-300)}.dark\:text-rose-400:where([data-theme=dark],[data-theme=dark] *){color:var(--color-rose-400)}.dark\:text-sky-300:where([data-theme=dark],[data-theme=dark] *){color:var(--color-sky-300)}.dark\:text-zinc-100:where([data-theme=dark],[data-theme=dark] *){color:var(--color-zinc-100)}.dark\:text-zinc-200:where([data-theme=dark],[data-theme=dark] *){color:var(--color-zinc-200)}.dark\:text-zinc-300:where([data-theme=dark],[data-theme=dark] *){color:var(--color-zinc-300)}.dark\:text-zinc-400:where([data-theme=dark],[data-theme=dark] *){color:var(--color-zinc-400)}.dark\:text-zinc-500:where([data-theme=dark],[data-theme=dark] *){color:var(--color-zinc-500)}.dark\:text-zinc-900:where([data-theme=dark],[data-theme=dark] *){color:var(--color-zinc-900)}.dark\:placeholder\:text-zinc-500:where([data-theme=dark],[data-theme=dark] *)::placeholder{color:var(--color-zinc-500)}@media(hover:hover){.dark\:hover\:border-zinc-500:where([data-theme=dark],[data-theme=dark] *):hover{border-color:var(--color-zinc-500)}}@media(hover:hover){.dark\:hover\:bg-amber-900\/50:where([data-theme=dark],[data-theme=dark] *):hover{background-color:color-mix(in srgb,oklch(41.4% .112 45.904) 50%,transparent)}@supports (color: color-mix(in lab,red,red)){.dark\:hover\:bg-amber-900\/50:where([data-theme=dark],[data-theme=dark] *):hover{background-color:color-mix(in oklab,var(--color-amber-900) 50%,transparent)}}}@media(hover:hover){.dark\:hover\:bg-amber-950\/60:where([data-theme=dark],[data-theme=dark] *):hover{background-color:color-mix(in srgb,oklch(27.9% .077 45.635) 60%,transparent)}@supports (color: color-mix(in lab,red,red)){.dark\:hover\:bg-amber-950\/60:where([data-theme=dark],[data-theme=dark] *):hover{background-color:color-mix(in oklab,var(--color-amber-950) 60%,transparent)}}}@media(hover:hover){.dark\:hover\:bg-emerald-950\/60:where([data-theme=dark],[data-theme=dark] *):hover{background-color:color-mix(in srgb,oklch(26.2% .051 172.552) 60%,transparent)}@supports (color: color-mix(in lab,red,red)){.dark\:hover\:bg-emerald-950\/60:where([data-theme=dark],[data-theme=dark] *):hover{background-color:color-mix(in oklab,var(--color-emerald-950) 60%,transparent)}}}@media(hover:hover){.dark\:hover\:bg-rose-950\/30:where([data-theme=dark],[data-theme=dark] *):hover{background-color:color-mix(in srgb,oklch(27.1% .105 12.094) 30%,transparent)}@supports (color: color-mix(in lab,red,red)){.dark\:hover\:bg-rose-950\/30:where([data-theme=dark],[data-theme=dark] *):hover{background-color:color-mix(in oklab,var(--color-rose-950) 30%,transparent)}}}@media(hover:hover){.dark\:hover\:bg-rose-950\/40:where([data-theme=dark],[data-theme=dark] *):hover{background-color:color-mix(in srgb,oklch(27.1% .105 12.094) 40%,transparent)}@supports (color: color-mix(in lab,red,red)){.dark\:hover\:bg-rose-950\/40:where([data-theme=dark],[data-theme=dark] *):hover{background-color:color-mix(in oklab,var(--color-rose-950) 40%,transparent)}}}@media(hover:hover){.dark\:hover\:bg-rose-950\/60:where([data-theme=dark],[data-theme=dark] *):hover{background-color:color-mix(in srgb,oklch(27.1% .105 12.094) 60%,transparent)}@supports (color: color-mix(in lab,red,red)){.dark\:hover\:bg-rose-950\/60:where([data-theme=dark],[data-theme=dark] *):hover{background-color:color-mix(in oklab,var(--color-rose-950) 60%,transparent)}}}@media(hover:hover){.dark\:hover\:bg-sky-950\/60:where([data-theme=dark],[data-theme=dark] *):hover{background-color:color-mix(in srgb,oklch(29.3% .066 243.157) 60%,transparent)}@supports (color: color-mix(in lab,red,red)){.dark\:hover\:bg-sky-950\/60:where([data-theme=dark],[data-theme=dark] *):hover{background-color:color-mix(in oklab,var(--color-sky-950) 60%,transparent)}}}@media(hover:hover){.dark\:hover\:bg-white:where([data-theme=dark],[data-theme=dark] *):hover{background-color:var(--color-white)}}@media(hover:hover){.dark\:hover\:bg-zinc-200:where([data-theme=dark],[data-theme=dark] *):hover{background-color:var(--color-zinc-200)}}@media(hover:hover){.dark\:hover\:bg-zinc-500:where([data-theme=dark],[data-theme=dark] *):hover{background-color:var(--color-zinc-500)}}@media(hover:hover){.dark\:hover\:bg-zinc-700:where([data-theme=dark],[data-theme=dark] *):hover{background-color:var(--color-zinc-700)}}@media(hover:hover){.dark\:hover\:bg-zinc-800:where([data-theme=dark],[data-theme=dark] *):hover{background-color:var(--color-zinc-800)}}@media(hover:hover){.dark\:hover\:text-zinc-200:where([data-theme=dark],[data-theme=dark] *):hover{color:var(--color-zinc-200)}}.dark\:focus\:border-zinc-500:where([data-theme=dark],[data-theme=dark] *):focus{border-color:var(--color-zinc-500)}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}}:root{--lf-control-h: 2rem;--lf-btn-pad: calc(var(--lf-control-h) / 2)}@layer components{.lf-composer-pill{display:inline-flex;align-items:center;justify-content:center;height:var(--lf-control-h);padding:0 var(--lf-btn-pad);border-radius:9999px;font-size:.75rem;line-height:1;font-weight:500;transition-property:color,background-color,border-color,opacity;transition-duration:.15s}.lf-composer-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:var(--lf-control-h);height:var(--lf-control-h);padding:0;border-radius:9999px;transition-property:color,background-color,border-color,opacity;transition-duration:.15s}}html,body{height:100%;margin:0}body{background-color:var(--color-zinc-50);font-family:var(--font-sans);font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height));color:var(--color-zinc-950);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body:where([data-theme=dark],[data-theme=dark] *){background-color:var(--color-zinc-950)}body:where([data-theme=dark],[data-theme=dark] *){color:var(--color-zinc-100)}button,textarea{font:inherit}@layer base{button:not(:disabled):not([aria-disabled=true]){cursor:pointer}button:disabled,button[aria-disabled=true]{cursor:not-allowed}}.lf-feed-viewport lf-feed-row.lf-feed-row--hovered{border-radius:.5rem;background-color:#8b5cf61a}.lf-feed-viewport lf-feed-row.lf-feed-row--hovered+lf-feed-row.lf-feed-row--hovered{border-top-left-radius:0;border-top-right-radius:0}.lf-feed-viewport lf-feed-row.lf-feed-row--hovered:has(+lf-feed-row.lf-feed-row--hovered){border-bottom-left-radius:0;border-bottom-right-radius:0}html[data-theme=dark] .lf-feed-viewport lf-feed-row.lf-feed-row--hovered{background-color:#a78bfa1f}.lf-feed-viewport{min-height:0;overflow-x:hidden;overflow-y:auto;overflow-anchor:none;scroll-behavior:auto}@layer components{.lf-feed-viewport .lf-feed-window{box-sizing:border-box;width:100%;max-width:100%;min-height:min-content}.lf-feed-md{min-width:0;max-width:100%;overflow-wrap:anywhere;word-break:break-word}.lf-feed-md img,.lf-feed-md svg,.lf-feed-md video{height:auto;max-width:100%}.lf-feed-md pre,.lf-feed-md code{overflow-wrap:anywhere;white-space:pre-wrap;word-break:break-word}.lf-feed-md table{display:block;max-width:100%;overflow-x:auto}}lf-edge:hover:not(.lf-edge--selected){--edge-stroke: rgb(74 108 182)}html[data-theme=dark] lf-edge:hover:not(.lf-edge--selected){--edge-stroke: rgb(120 160 220)}lf-edge.lf-edge--pulse ng-diagram-base-edge path{animation:lf-edge-pulse .3s ease-out}@keyframes lf-edge-pulse{0%{stroke:#10b981;stroke-width:3;filter:drop-shadow(0 0 6px rgba(16,185,129,.9))}to{stroke:var(--edge-stroke, var(--ngd-default-edge-stroke));stroke-width:2;filter:none}}.lf-port-anchor.lf-port-anchor--pulse{--ngd-port-border-color: rgb(16 185 129);--ngd-port-background-color: rgb(167 243 208);--ngd-port-size: .45rem;animation:lf-port-pulse .45s ease-in-out infinite}html[data-theme=dark] .lf-port-anchor.lf-port-anchor--pulse{--ngd-port-border-color: rgb(52 211 153);--ngd-port-background-color: rgb(6 78 59);animation-name:lf-port-pulse-dark}@keyframes lf-port-pulse{0%,to{box-shadow:0 0 #10b98100}50%{box-shadow:0 0 0 4px #10b981b3}}@keyframes lf-port-pulse-dark{0%,to{box-shadow:0 0 #34d39900}50%{box-shadow:0 0 0 4px #34d399b3}}lf-edge.lf-edge--pending ng-diagram-base-edge path{stroke:#ca8a04;stroke-width:3}lf-edge.lf-edge--error ng-diagram-base-edge path{stroke:#f43f5e;stroke-width:3}lf-edge.lf-edge--value ng-diagram-base-edge path{stroke:#10b981;stroke-width:3}html[data-theme=dark] lf-edge.lf-edge--value ng-diagram-base-edge path{stroke:#34d399}html[data-theme=dark] lf-edge.lf-edge--pending ng-diagram-base-edge path{stroke:#facc15}html[data-theme=dark] lf-edge.lf-edge--error ng-diagram-base-edge path{stroke:#fb7185}.lf-scroll{scrollbar-width:thin;scrollbar-color:rgb(212,212,216) transparent}.lf-scroll::-webkit-scrollbar{width:8px;height:8px}.lf-scroll::-webkit-scrollbar-button{display:none;width:0;height:0}.lf-scroll::-webkit-scrollbar-track{background:transparent}.lf-scroll::-webkit-scrollbar-thumb{background-color:#d4d4d8;border-radius:9999px;border:2px solid transparent;background-clip:content-box}.lf-scroll::-webkit-scrollbar-thumb:hover{background-color:#a1a1aa}.lf-scroll::-webkit-scrollbar-corner{background:transparent}html[data-theme=dark] .lf-scroll{scrollbar-color:rgb(63,63,70) transparent}html[data-theme=dark] .lf-scroll::-webkit-scrollbar-thumb{background-color:#3f3f46}html[data-theme=dark] .lf-scroll::-webkit-scrollbar-thumb:hover{background-color:#52525b}@property --tw-translate-x{syntax: "*"; inherits: false; initial-value: 0;}@property --tw-translate-y{syntax: "*"; inherits: false; initial-value: 0;}@property --tw-translate-z{syntax: "*"; inherits: false; initial-value: 0;}@property --tw-space-y-reverse{syntax: "*"; inherits: false; initial-value: 0;}@property --tw-border-style{syntax: "*"; inherits: false; initial-value: solid;}@property --tw-gradient-position{syntax: "*"; inherits: false;}@property --tw-gradient-from{syntax: "<color>"; inherits: false; initial-value: #0000;}@property --tw-gradient-via{syntax: "<color>"; inherits: false; initial-value: #0000;}@property --tw-gradient-to{syntax: "<color>"; inherits: false; initial-value: #0000;}@property --tw-gradient-stops{syntax: "*"; inherits: false;}@property --tw-gradient-via-stops{syntax: "*"; inherits: false;}@property --tw-gradient-from-position{syntax: "<length-percentage>"; inherits: false; initial-value: 0%;}@property --tw-gradient-via-position{syntax: "<length-percentage>"; inherits: false; initial-value: 50%;}@property --tw-gradient-to-position{syntax: "<length-percentage>"; inherits: false; initial-value: 100%;}@property --tw-leading{syntax: "*"; inherits: false;}@property --tw-font-weight{syntax: "*"; inherits: false;}@property --tw-tracking{syntax: "*"; inherits: false;}@property --tw-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: "*"; inherits: false;}@property --tw-shadow-alpha{syntax: "<percentage>"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: "*"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: "<percentage>"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: "*"; inherits: false;}@property --tw-ring-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: "*"; inherits: false;}@property --tw-inset-ring-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: "*"; inherits: false;}@property --tw-ring-offset-width{syntax: "<length>"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: "*"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: "*"; inherits: false; initial-value: 0 0 #0000;}@property --tw-blur{syntax: "*"; inherits: false;}@property --tw-brightness{syntax: "*"; inherits: false;}@property --tw-contrast{syntax: "*"; inherits: false;}@property --tw-grayscale{syntax: "*"; inherits: false;}@property --tw-hue-rotate{syntax: "*"; inherits: false;}@property --tw-invert{syntax: "*"; inherits: false;}@property --tw-opacity{syntax: "*"; inherits: false;}@property --tw-saturate{syntax: "*"; inherits: false;}@property --tw-sepia{syntax: "*"; inherits: false;}@property --tw-drop-shadow{syntax: "*"; inherits: false;}@property --tw-drop-shadow-color{syntax: "*"; inherits: false;}@property --tw-drop-shadow-alpha{syntax: "<percentage>"; inherits: false; initial-value: 100%;}@property --tw-drop-shadow-size{syntax: "*"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x: 0;--tw-translate-y: 0;--tw-translate-z: 0;--tw-space-y-reverse: 0;--tw-border-style: solid;--tw-gradient-position: initial;--tw-gradient-from: #0000;--tw-gradient-via: #0000;--tw-gradient-to: #0000;--tw-gradient-stops: initial;--tw-gradient-via-stops: initial;--tw-gradient-from-position: 0%;--tw-gradient-via-position: 50%;--tw-gradient-to-position: 100%;--tw-leading: initial;--tw-font-weight: initial;--tw-tracking: initial;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-blur: initial;--tw-brightness: initial;--tw-contrast: initial;--tw-grayscale: initial;--tw-hue-rotate: initial;--tw-invert: initial;--tw-opacity: initial;--tw-saturate: initial;--tw-sepia: initial;--tw-drop-shadow: initial;--tw-drop-shadow-color: initial;--tw-drop-shadow-alpha: 100%;--tw-drop-shadow-size: initial}}}
|
|
@@ -19,7 +19,7 @@ export const defaultLlmInventoryInputs = (make) => {
|
|
|
19
19
|
defaultValue: [],
|
|
20
20
|
});
|
|
21
21
|
const steerControl = make(STEER_CONTROL_PORT_ID, {
|
|
22
|
-
name: '
|
|
22
|
+
name: 'steer',
|
|
23
23
|
wireType: 'any',
|
|
24
24
|
hidden: true,
|
|
25
25
|
// Must stay `single` (default): `RuntimeRunner.pushIntoInput` rejects
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { combineStatefulObservables } from '@rx-evo/stateful-observable';
|
|
2
|
-
import { configureOutput, makeInput, type DefinedReactiveNodeConfig, type InputConfig, type OutputConfig } from '../define-reactive-node/define-reactive-node.js';
|
|
2
|
+
import { configureOutput, LLM_REQUIRED_CAPABILITIES, makeInput, type CapsFor, type DefinedReactiveNodeConfig, type InputConfig, type NodeCapabilityId, type OutputConfig } from '../define-reactive-node/define-reactive-node.js';
|
|
3
3
|
import type { LlmExecutionCaps } from '../define-reactive-node/types.js';
|
|
4
4
|
import type { UISchemaConstItem } from '../define-reactive-node/ui-schema-inference.js';
|
|
5
5
|
import { type LlmInventoryInputs, type LlmInventoryOutputStreams } from './default-llm-ports.js';
|
|
@@ -13,32 +13,20 @@ type LlmBindResult = {
|
|
|
13
13
|
readonly outputs: readonly OutputConfig[];
|
|
14
14
|
readonly inventoryOutputs: LlmInventoryOutputStreams;
|
|
15
15
|
};
|
|
16
|
-
type
|
|
16
|
+
type LlmMergedRequires<Extra extends readonly NodeCapabilityId[] = []> = readonly [...typeof LLM_REQUIRED_CAPABILITIES, ...Extra];
|
|
17
|
+
type LlmCtx<UI extends readonly UISchemaConstItem[], Extra extends readonly NodeCapabilityId[] = []> = Parameters<DefinedReactiveNodeConfig<UI, CapsFor<LlmMergedRequires<Extra>>>['bind']>[0];
|
|
17
18
|
export type { LlmExecutionCaps };
|
|
19
|
+
export { LLM_REQUIRED_CAPABILITIES };
|
|
18
20
|
/**
|
|
19
21
|
* Purpose factory atop {@link defineReactiveNode}: every LLM-class node gets
|
|
20
22
|
* the shared inventory / observability ports (`tools`, `steerControl`,
|
|
21
23
|
* `toolLog`, `recovery`). Authors may extend with role ports but cannot omit
|
|
22
24
|
* the inventory set.
|
|
23
25
|
*/
|
|
24
|
-
export declare const defineLlmNode: <UI extends readonly UISchemaConstItem[]>(config: Omit<DefinedReactiveNodeConfig<UI,
|
|
25
|
-
readonly
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
readonly stopsRun: boolean;
|
|
29
|
-
readonly chatEntry: boolean;
|
|
30
|
-
readonly uiSchema: import("../define-reactive-node/ui-schema-inference.js").AssertConstUISchema<UI>;
|
|
31
|
-
readonly bypassPorts: Record<string, import("../define-reactive-node/port-meta.js").WireType>;
|
|
32
|
-
readonly inputsConfigs: readonly [import("../define-reactive-node/io-helpers.js").InputPortMeta<import("../define-reactive-node/types.js").ExecutionContext<UI, LlmExecutionCaps>>, ...import("../define-reactive-node/io-helpers.js").InputPortMeta<unknown>[]];
|
|
33
|
-
readonly outputsConfigs: (import("../define-reactive-node/io-helpers.js").OutputParams & import("../define-reactive-node/port-meta.js").PortMeta)[];
|
|
34
|
-
readonly getInstance: () => import("../define-reactive-node/types.js").ReactiveNodeInstance<UI, LlmExecutionCaps>;
|
|
35
|
-
readonly paletteSecondary?: true;
|
|
36
|
-
readonly description?: string;
|
|
37
|
-
readonly type: string;
|
|
38
|
-
readonly displayName: string;
|
|
39
|
-
readonly category: string | undefined;
|
|
40
|
-
readonly icon: string | undefined;
|
|
41
|
-
};
|
|
26
|
+
export declare const defineLlmNode: <UI extends readonly UISchemaConstItem[], const Extra extends readonly NodeCapabilityId[] = []>(config: Omit<DefinedReactiveNodeConfig<UI, CapsFor<LlmMergedRequires<Extra>>>, "bind" | "requires"> & {
|
|
27
|
+
readonly requires?: Extra;
|
|
28
|
+
readonly bind: (ctx: LlmCtx<UI, Extra>, helpers: ReactiveBindHelpers, inventory: LlmInventoryInputs) => LlmBindResult;
|
|
29
|
+
}) => import("../define-reactive-node/define-reactive-node.js").ReactiveNodeDefinition;
|
|
42
30
|
export { LLM_INVENTORY_INPUT_PORT_IDS, LLM_INVENTORY_OUTPUT_PORT_IDS, type LlmInventoryInputs, type LlmInventoryOutputStreams, } from './default-llm-ports.js';
|
|
43
31
|
export { STEER_CONTROL_PORT_ID, isSteerControlContinue, isSteerControlPause, isSteerControlPayload, type SteerControlPayload, type SteerControlPause, type SteerControlResume, type SteerControlSteer, } from './steer-control.js';
|
|
44
|
-
export { RECOVERY_PORT_ID, isLlmRecoveryNotice, isLlmRecoverySuspended,
|
|
32
|
+
export { RECOVERY_PORT_ID, isLlmRecoveryNotice, isLlmRecoverySuspended, toLlmRecoveryPortValue, type LlmRecoveryNotice, type LlmRecoveryNoticeCode, type LlmRecoveryRetryReason, } from './recovery-notice.js';
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { defineReactiveNode, } from '../define-reactive-node/define-reactive-node.js';
|
|
1
|
+
import { defineReactiveNode, LLM_REQUIRED_CAPABILITIES, uniqueCapabilityIds, } from '../define-reactive-node/define-reactive-node.js';
|
|
2
2
|
import { defaultLlmInventoryInputs, defaultLlmInventoryOutputs, LLM_INVENTORY_INPUT_PORT_IDS, LLM_INVENTORY_OUTPUT_PORT_IDS, } from './default-llm-ports.js';
|
|
3
|
+
export { LLM_REQUIRED_CAPABILITIES };
|
|
3
4
|
const portIdOf = (config) => String(config.meta.portId);
|
|
4
5
|
const assertNoInventoryInputs = (inputs) => {
|
|
5
6
|
const inventoryIds = new Set(LLM_INVENTORY_INPUT_PORT_IDS);
|
|
@@ -26,9 +27,14 @@ const assertNoInventoryOutputs = (outputs) => {
|
|
|
26
27
|
* the inventory set.
|
|
27
28
|
*/
|
|
28
29
|
export const defineLlmNode = (config) => {
|
|
29
|
-
const { bind: authorBind, ...rest } = config;
|
|
30
|
+
const { bind: authorBind, requires: extraRequires, ...rest } = config;
|
|
31
|
+
const requires = uniqueCapabilityIds([
|
|
32
|
+
...LLM_REQUIRED_CAPABILITIES,
|
|
33
|
+
...(extraRequires ?? []),
|
|
34
|
+
]);
|
|
30
35
|
return defineReactiveNode({
|
|
31
36
|
...rest,
|
|
37
|
+
requires,
|
|
32
38
|
bind(ctx, helpers) {
|
|
33
39
|
const inventory = defaultLlmInventoryInputs(helpers.makeInput);
|
|
34
40
|
const result = authorBind(ctx, helpers, inventory);
|
|
@@ -46,4 +52,4 @@ export const defineLlmNode = (config) => {
|
|
|
46
52
|
};
|
|
47
53
|
export { LLM_INVENTORY_INPUT_PORT_IDS, LLM_INVENTORY_OUTPUT_PORT_IDS, } from './default-llm-ports.js';
|
|
48
54
|
export { STEER_CONTROL_PORT_ID, isSteerControlContinue, isSteerControlPause, isSteerControlPayload, } from './steer-control.js';
|
|
49
|
-
export { RECOVERY_PORT_ID, isLlmRecoveryNotice, isLlmRecoverySuspended,
|
|
55
|
+
export { RECOVERY_PORT_ID, isLlmRecoveryNotice, isLlmRecoverySuspended, toLlmRecoveryPortValue, } from './recovery-notice.js';
|
|
@@ -17,6 +17,5 @@ export type LlmRecoveryNotice = {
|
|
|
17
17
|
};
|
|
18
18
|
export declare const isLlmRecoveryNotice: (value: unknown) => value is LlmRecoveryNotice;
|
|
19
19
|
export declare const isLlmRecoverySuspended: (value: unknown) => boolean;
|
|
20
|
-
export declare const recoveryNoticeText: (value: unknown) => string;
|
|
21
20
|
/** Port payload: `code` + `text` plus any additive timing fields. */
|
|
22
21
|
export declare const toLlmRecoveryPortValue: (notice: LlmRecoveryNotice) => LlmRecoveryNotice;
|
|
@@ -13,15 +13,6 @@ export const isLlmRecoveryNotice = (value) => {
|
|
|
13
13
|
typeof record['text'] === 'string');
|
|
14
14
|
};
|
|
15
15
|
export const isLlmRecoverySuspended = (value) => isLlmRecoveryNotice(value) && value.code === 'suspended';
|
|
16
|
-
export const recoveryNoticeText = (value) => {
|
|
17
|
-
if (isLlmRecoveryNotice(value)) {
|
|
18
|
-
return value.text;
|
|
19
|
-
}
|
|
20
|
-
if (typeof value === 'string') {
|
|
21
|
-
return value;
|
|
22
|
-
}
|
|
23
|
-
return '';
|
|
24
|
-
};
|
|
25
16
|
/** Port payload: `code` + `text` plus any additive timing fields. */
|
|
26
17
|
export const toLlmRecoveryPortValue = (notice) => ({
|
|
27
18
|
code: notice.code,
|
|
@@ -18,10 +18,14 @@ export type DefineNodeConfig<UI extends readonly UISchemaConstItem[] = readonly
|
|
|
18
18
|
readonly category?: string;
|
|
19
19
|
readonly paletteSecondary?: boolean;
|
|
20
20
|
readonly description?: string;
|
|
21
|
-
readonly icon?: string;
|
|
22
21
|
readonly stopsRun?: boolean;
|
|
23
22
|
readonly emitOncePerActivation?: boolean;
|
|
24
23
|
readonly chatEntry?: boolean;
|
|
24
|
+
readonly defaultCanvasSize?: {
|
|
25
|
+
readonly width: number;
|
|
26
|
+
readonly height: number;
|
|
27
|
+
};
|
|
28
|
+
readonly feedVisitBoundary?: boolean;
|
|
25
29
|
readonly uiSchema: AssertConstUISchema<UI>;
|
|
26
30
|
readonly inputs?: Readonly<Record<string, DefineNodePortMeta>>;
|
|
27
31
|
readonly outputs?: Readonly<Record<string, DefineNodePortMeta>>;
|
|
@@ -40,11 +40,16 @@ export const defineNode = (config) => {
|
|
|
40
40
|
...(config.description !== undefined
|
|
41
41
|
? { description: config.description }
|
|
42
42
|
: {}),
|
|
43
|
-
...(config.icon !== undefined ? { icon: config.icon } : {}),
|
|
44
43
|
...(config.stopsRun !== undefined ? { stopsRun: config.stopsRun } : {}),
|
|
45
44
|
...(config.chatEntry !== undefined
|
|
46
45
|
? { chatEntry: config.chatEntry }
|
|
47
46
|
: {}),
|
|
47
|
+
...(config.defaultCanvasSize !== undefined
|
|
48
|
+
? { defaultCanvasSize: config.defaultCanvasSize }
|
|
49
|
+
: {}),
|
|
50
|
+
...(config.feedVisitBoundary === true
|
|
51
|
+
? { feedVisitBoundary: true }
|
|
52
|
+
: {}),
|
|
48
53
|
bind(ctx, { makeInput: mk, configureOutput: cfgOut, combineInputs, }) {
|
|
49
54
|
const inputPorts = inputEntries.map(([portId, meta]) => mk(portId, inputParamsFromMeta(portId, meta)));
|
|
50
55
|
const sources = [ctx, ...inputPorts];
|
|
@@ -96,7 +101,5 @@ export const defineNode = (config) => {
|
|
|
96
101
|
};
|
|
97
102
|
},
|
|
98
103
|
};
|
|
99
|
-
// `AssertConstUISchema` collapses to `never` under the unconstrained UI
|
|
100
|
-
// default on `DefinedReactiveNodeConfig`; call sites still pass `as const`.
|
|
101
104
|
return defineReactiveNode(reactiveConfig);
|
|
102
105
|
};
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import type { ToolHandle } from '../define-tool-registrations/tool-handle.js';
|
|
2
|
+
export declare const NODE_CAPABILITY_IDS: readonly ["chat", "embed", "tools", "paths", "hosts", "secrets", "promptContext", "permissionAsk", "liveTools", "editorBus", "authorize"];
|
|
3
|
+
export type NodeCapabilityId = (typeof NODE_CAPABILITY_IDS)[number];
|
|
4
|
+
export declare const LLM_REQUIRED_CAPABILITIES: readonly ["chat", "tools", "promptContext", "permissionAsk", "liveTools", "paths", "hosts", "authorize"];
|
|
5
|
+
export type LlmRequiredCapabilityId = (typeof LLM_REQUIRED_CAPABILITIES)[number];
|
|
6
|
+
type UnionToIntersection<U> = (U extends unknown ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
|
|
7
|
+
/**
|
|
8
|
+
* Capability-field contracts for {@link CapsFor}. Structural so host
|
|
9
|
+
* factories (common-nodes chat / embed) assign without relocating those
|
|
10
|
+
* implementations into this package.
|
|
11
|
+
*/
|
|
12
|
+
export type CapabilityFields = {
|
|
13
|
+
readonly chat: {
|
|
14
|
+
readonly chat: CapabilityChat;
|
|
15
|
+
};
|
|
16
|
+
readonly embed: {
|
|
17
|
+
readonly embed: CapabilityEmbed;
|
|
18
|
+
readonly defaultEmbedding?: {
|
|
19
|
+
readonly providerId: string;
|
|
20
|
+
readonly model: string;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
readonly tools: {
|
|
24
|
+
readonly toolHandles: readonly ToolHandle[];
|
|
25
|
+
};
|
|
26
|
+
readonly paths: {
|
|
27
|
+
readonly denyPaths: readonly string[];
|
|
28
|
+
};
|
|
29
|
+
readonly hosts: {
|
|
30
|
+
readonly allowedHosts: readonly string[];
|
|
31
|
+
};
|
|
32
|
+
readonly secrets: {
|
|
33
|
+
readonly secrets: Readonly<Record<string, string>>;
|
|
34
|
+
};
|
|
35
|
+
readonly promptContext: {
|
|
36
|
+
readonly skillMarkdown: string;
|
|
37
|
+
readonly agentsMarkdown: string;
|
|
38
|
+
readonly defaultChat?: {
|
|
39
|
+
readonly providerId: string;
|
|
40
|
+
readonly model: string;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
readonly permissionAsk: {
|
|
44
|
+
readonly requestPermission: CapabilityPermissionAsk;
|
|
45
|
+
};
|
|
46
|
+
readonly liveTools: {
|
|
47
|
+
readonly getLiveWiredTools: (agentNodeId: string) => readonly ToolHandle[];
|
|
48
|
+
};
|
|
49
|
+
readonly editorBus: {
|
|
50
|
+
readonly requestLangflowerBus: CapabilityEditorBus;
|
|
51
|
+
};
|
|
52
|
+
readonly authorize: {
|
|
53
|
+
readonly authorize: CapabilityAuthorize;
|
|
54
|
+
};
|
|
55
|
+
};
|
|
56
|
+
export type CapabilityChat = (args: CapabilityChatArgs) => Promise<AsyncIterable<CapabilityChatChunk>>;
|
|
57
|
+
type CapabilityChatArgs = {
|
|
58
|
+
readonly providerId: string;
|
|
59
|
+
readonly model: string;
|
|
60
|
+
readonly messages: readonly CapabilityChatMessage[];
|
|
61
|
+
readonly tools?: readonly CapabilityChatToolDefinition[];
|
|
62
|
+
readonly signal?: {
|
|
63
|
+
readonly aborted: boolean;
|
|
64
|
+
};
|
|
65
|
+
readonly frequency_penalty?: number;
|
|
66
|
+
readonly presence_penalty?: number;
|
|
67
|
+
};
|
|
68
|
+
type CapabilityChatMessage = {
|
|
69
|
+
readonly role: 'system' | 'user';
|
|
70
|
+
readonly content: string;
|
|
71
|
+
} | {
|
|
72
|
+
readonly role: 'assistant';
|
|
73
|
+
readonly content: string;
|
|
74
|
+
readonly tool_calls?: readonly CapabilityChatToolCall[];
|
|
75
|
+
} | {
|
|
76
|
+
readonly role: 'tool';
|
|
77
|
+
readonly content: string;
|
|
78
|
+
readonly tool_call_id: string;
|
|
79
|
+
};
|
|
80
|
+
type CapabilityChatToolCall = {
|
|
81
|
+
readonly id: string;
|
|
82
|
+
readonly name: string;
|
|
83
|
+
readonly arguments: string;
|
|
84
|
+
};
|
|
85
|
+
type CapabilityChatToolDefinition = {
|
|
86
|
+
readonly type: 'function';
|
|
87
|
+
readonly function: {
|
|
88
|
+
readonly name: string;
|
|
89
|
+
readonly description?: string;
|
|
90
|
+
readonly parameters?: object;
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
type CapabilityChatChunk = {
|
|
94
|
+
readonly kind: 'reasoning';
|
|
95
|
+
readonly text: string;
|
|
96
|
+
} | {
|
|
97
|
+
readonly kind: 'draft';
|
|
98
|
+
readonly text: string;
|
|
99
|
+
} | {
|
|
100
|
+
readonly kind: 'done';
|
|
101
|
+
readonly text: string;
|
|
102
|
+
readonly tool_calls?: readonly CapabilityChatToolCall[];
|
|
103
|
+
readonly finishReason?: 'stop' | 'length' | 'tool_calls' | 'content_filter' | 'unknown';
|
|
104
|
+
};
|
|
105
|
+
export type CapabilityEmbed = (args: {
|
|
106
|
+
readonly providerId: string;
|
|
107
|
+
readonly model: string;
|
|
108
|
+
readonly texts: readonly string[];
|
|
109
|
+
readonly signal?: AbortSignal;
|
|
110
|
+
}) => Promise<{
|
|
111
|
+
readonly dim: number;
|
|
112
|
+
readonly vectors: readonly Float32Array[];
|
|
113
|
+
}>;
|
|
114
|
+
export type CapabilityPermissionAsk = (request: {
|
|
115
|
+
readonly toolId: string;
|
|
116
|
+
readonly detail: string;
|
|
117
|
+
readonly summary: string;
|
|
118
|
+
}) => Promise<'allow' | 'deny'>;
|
|
119
|
+
export type CapabilityEditorBus = (intent: string, payload: unknown) => Promise<unknown>;
|
|
120
|
+
export type CapabilityAuthorize = (call: {
|
|
121
|
+
readonly toolId: string;
|
|
122
|
+
readonly args: Readonly<Record<string, unknown>>;
|
|
123
|
+
readonly signal?: AbortSignal;
|
|
124
|
+
}) => Promise<'allow' | 'deny'>;
|
|
125
|
+
export type CapsFor<Ids extends readonly NodeCapabilityId[]> = object & ([Ids[number]] extends [never] ? Record<string, never> : UnionToIntersection<CapabilityFields[Ids[number]]>);
|
|
126
|
+
export declare const isNodeCapabilityId: (value: string) => value is NodeCapabilityId;
|
|
127
|
+
export declare const uniqueCapabilityIds: (ids: readonly NodeCapabilityId[]) => readonly NodeCapabilityId[];
|
|
128
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export const NODE_CAPABILITY_IDS = [
|
|
2
|
+
'chat',
|
|
3
|
+
'embed',
|
|
4
|
+
'tools',
|
|
5
|
+
'paths',
|
|
6
|
+
'hosts',
|
|
7
|
+
'secrets',
|
|
8
|
+
'promptContext',
|
|
9
|
+
'permissionAsk',
|
|
10
|
+
'liveTools',
|
|
11
|
+
'editorBus',
|
|
12
|
+
'authorize',
|
|
13
|
+
];
|
|
14
|
+
export const LLM_REQUIRED_CAPABILITIES = [
|
|
15
|
+
'chat',
|
|
16
|
+
'tools',
|
|
17
|
+
'promptContext',
|
|
18
|
+
'permissionAsk',
|
|
19
|
+
'liveTools',
|
|
20
|
+
'paths',
|
|
21
|
+
'hosts',
|
|
22
|
+
'authorize',
|
|
23
|
+
];
|
|
24
|
+
export const isNodeCapabilityId = (value) => NODE_CAPABILITY_IDS.includes(value);
|
|
25
|
+
export const uniqueCapabilityIds = (ids) => [...new Set(ids)];
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { InputPortMeta } from './io-helpers.js';
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
1
|
+
import { InputPortMeta, type OutputPortMeta } from './io-helpers.js';
|
|
2
|
+
import type { CapsFor, NodeCapabilityId } from './capabilities.js';
|
|
3
|
+
import type { WireType } from './port-meta.js';
|
|
4
|
+
import type { DefinedReactiveNodeConfig, ReactiveNodeInstance } from './types.js';
|
|
4
5
|
import type { UISchemaConstItem } from './ui-schema-inference.js';
|
|
5
6
|
export type { CtxError } from './ctx-error.js';
|
|
7
|
+
export { LLM_REQUIRED_CAPABILITIES, NODE_CAPABILITY_IDS, isNodeCapabilityId, uniqueCapabilityIds, type CapabilityAuthorize, type CapabilityChat, type CapabilityEditorBus, type CapabilityEmbed, type CapabilityFields, type CapabilityPermissionAsk, type CapsFor, type LlmRequiredCapabilityId, type NodeCapabilityId, } from './capabilities.js';
|
|
6
8
|
export type { HitlButtonControl, HitlControl, HitlFileControl, HitlFileValue, HitlInputConfig, HitlPayloadTemplate, HitlTextareaControl, HitlTextValue, HitlUploadedFile, } from './hitl-config.js';
|
|
7
|
-
export { withLoading, configureOutput, DEFAULT_MULTILINE_MIN_HEIGHT_PX, InlineConfig, InlineSelectOption, InlineTextMultilineConfig, InputConfig, InputParams, InputPortMeta, makeInput, OutputConfig, OutputParams, OutputPortMeta, resolveMultilineInlineLayout, ResolvedMultilineInlineLayout, } from './io-helpers.js';
|
|
9
|
+
export { withLoading, configureOutput, DEFAULT_MULTILINE_MIN_HEIGHT_PX, InlineConfig, InlineMarkdownConfig, InlineSelectOption, InlineTextMultilineConfig, InputConfig, InputParams, InputPortMeta, makeInput, OutputConfig, OutputParams, OutputPortMeta, resolveMultilineInlineLayout, ResolvedMultilineInlineLayout, } from './io-helpers.js';
|
|
8
10
|
export type { FeedPortMeta, FeedRole } from './io-helpers.js';
|
|
9
11
|
export type { InputPortMode, MetaFromStatefulObservable, PortMeta, WireType, } from './port-meta.js';
|
|
10
12
|
export type { ToolHandle, ToolHandler, ToolHandlerContext, } from '../define-tool-registrations/tool-handle.js';
|
|
@@ -12,6 +14,7 @@ export { TOOL_HANDLE_WIRE_TYPE } from '../define-tool-registrations/tool-handle.
|
|
|
12
14
|
export type { EmbedHandle, EmbedTextRole, EmbedTextsOptions, } from '../define-embed/embed-handle.js';
|
|
13
15
|
export { EMBED_HANDLE_WIRE_TYPE, isEmbedHandle, } from '../define-embed/embed-handle.js';
|
|
14
16
|
export type { DefinedReactiveNodeConfig, ExecutionContext, ReactiveNodeInstance, } from './types.js';
|
|
17
|
+
export type { UISchemaConstItem } from './ui-schema-inference.js';
|
|
15
18
|
export declare const contextSymbol: unique symbol;
|
|
16
19
|
/**
|
|
17
20
|
* Define a reactive node: probe `bind()` once for port metas (discarded
|
|
@@ -19,24 +22,33 @@ export declare const contextSymbol: unique symbol;
|
|
|
19
22
|
* again for each live runtime graph. Keep `bind` free of module-level side
|
|
20
23
|
* effects — probe wiring is never used at run time.
|
|
21
24
|
*/
|
|
22
|
-
export declare const defineReactiveNode: <UI extends readonly UISchemaConstItem[], Caps extends object =
|
|
25
|
+
export declare const defineReactiveNode: <UI extends readonly UISchemaConstItem[], const Requires extends readonly NodeCapabilityId[] = [], Caps extends object = CapsFor<Requires>>(config: DefinedReactiveNodeConfig<UI, Caps> & {
|
|
26
|
+
readonly requires?: Requires;
|
|
27
|
+
}) => ReactiveNodeDefinition;
|
|
28
|
+
export type ReactiveNodeDefinition = {
|
|
29
|
+
readonly type: string;
|
|
30
|
+
readonly displayName: string;
|
|
31
|
+
readonly category?: string;
|
|
32
|
+
readonly description?: string;
|
|
33
|
+
readonly paletteSecondary?: true;
|
|
34
|
+
/** Canvas box for a node without persisted width (see config docs). */
|
|
35
|
+
readonly defaultCanvasSize?: {
|
|
36
|
+
readonly width: number;
|
|
37
|
+
readonly height: number;
|
|
38
|
+
};
|
|
39
|
+
/** First work-log frame closes the previous visit (see config docs). */
|
|
40
|
+
readonly feedVisitBoundary?: true;
|
|
23
41
|
readonly emitOncePerActivation: boolean;
|
|
24
42
|
readonly stopsRun: boolean;
|
|
25
43
|
readonly chatEntry: boolean;
|
|
26
|
-
readonly
|
|
44
|
+
readonly requires: readonly NodeCapabilityId[];
|
|
45
|
+
readonly uiSchema: readonly UISchemaConstItem[];
|
|
27
46
|
readonly bypassPorts: Record<string, WireType>;
|
|
28
|
-
readonly inputsConfigs: readonly
|
|
29
|
-
readonly outputsConfigs:
|
|
30
|
-
readonly getInstance: () => ReactiveNodeInstance<
|
|
31
|
-
readonly paletteSecondary?: true;
|
|
32
|
-
readonly description?: string;
|
|
33
|
-
readonly type: string;
|
|
34
|
-
readonly displayName: string;
|
|
35
|
-
readonly category: string | undefined;
|
|
36
|
-
readonly icon: string | undefined;
|
|
47
|
+
readonly inputsConfigs: readonly InputPortMeta<unknown>[];
|
|
48
|
+
readonly outputsConfigs: readonly OutputPortMeta[];
|
|
49
|
+
readonly getInstance: () => ReactiveNodeInstance<readonly UISchemaConstItem[], object>;
|
|
37
50
|
};
|
|
38
|
-
export type ReactiveNodeDefinition = ReturnType<typeof defineReactiveNode>;
|
|
39
51
|
export { createResolveSecret, emptyResolveSecret, type CreateResolveSecretDeps, type ResolveSecret, type ResolveSecretResult, } from './resolve-secret.js';
|
|
40
|
-
export { defineToolRegistrations } from '../define-tool-registrations/define-tool-registrations.js';
|
|
52
|
+
export { defineToolRegistrations, toToolHandles, } from '../define-tool-registrations/define-tool-registrations.js';
|
|
41
53
|
export { defineNode } from '../define-node/define-node.js';
|
|
42
54
|
export type { DefineNodeConfig, DefineNodePortMeta, } from '../define-node/define-node.js';
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { combineStatefulObservables, statefulConnection, } from '@rx-evo/stateful-observable';
|
|
2
|
-
import { configureOutput, makeInput } from './io-helpers.js';
|
|
2
|
+
import { configureOutput, makeInput, } from './io-helpers.js';
|
|
3
|
+
export { LLM_REQUIRED_CAPABILITIES, NODE_CAPABILITY_IDS, isNodeCapabilityId, uniqueCapabilityIds, } from './capabilities.js';
|
|
3
4
|
export { withLoading, configureOutput, DEFAULT_MULTILINE_MIN_HEIGHT_PX, makeInput, resolveMultilineInlineLayout, } from './io-helpers.js';
|
|
4
5
|
export { TOOL_HANDLE_WIRE_TYPE } from '../define-tool-registrations/tool-handle.js';
|
|
5
6
|
export { EMBED_HANDLE_WIRE_TYPE, isEmbedHandle, } from '../define-embed/embed-handle.js';
|
|
6
|
-
export const contextSymbol = Symbol('node
|
|
7
|
+
export const contextSymbol = Symbol.for('langflower.node.context');
|
|
7
8
|
const bindHelpers = {
|
|
8
9
|
makeInput,
|
|
9
10
|
configureOutput,
|
|
@@ -16,7 +17,7 @@ const bindHelpers = {
|
|
|
16
17
|
* effects — probe wiring is never used at run time.
|
|
17
18
|
*/
|
|
18
19
|
export const defineReactiveNode = (config) => {
|
|
19
|
-
const { bypassPorts, type, category, paletteSecondary,
|
|
20
|
+
const { bypassPorts, type, category, paletteSecondary, displayName, description, defaultCanvasSize, feedVisitBoundary, uiSchema, emitOncePerActivation, stopsRun, chatEntry, requires, } = config;
|
|
20
21
|
const probeCtx = statefulConnection();
|
|
21
22
|
const { inputs: inputsConfigs, outputs: outputsConfigs } = config.bind(probeCtx, bindHelpers);
|
|
22
23
|
const contextConfig = {
|
|
@@ -30,15 +31,19 @@ export const defineReactiveNode = (config) => {
|
|
|
30
31
|
const res = {
|
|
31
32
|
type,
|
|
32
33
|
displayName,
|
|
33
|
-
category,
|
|
34
|
-
icon,
|
|
34
|
+
...(category !== undefined ? { category } : {}),
|
|
35
35
|
...(description !== undefined ? { description } : {}),
|
|
36
36
|
...(paletteSecondary === true
|
|
37
37
|
? { paletteSecondary: true }
|
|
38
38
|
: {}),
|
|
39
|
+
...(defaultCanvasSize !== undefined ? { defaultCanvasSize } : {}),
|
|
40
|
+
...(feedVisitBoundary === true
|
|
41
|
+
? { feedVisitBoundary: true }
|
|
42
|
+
: {}),
|
|
39
43
|
emitOncePerActivation: emitOncePerActivation ?? false,
|
|
40
44
|
stopsRun: stopsRun ?? false,
|
|
41
45
|
chatEntry: chatEntry ?? false,
|
|
46
|
+
requires: requires ?? [],
|
|
42
47
|
uiSchema,
|
|
43
48
|
bypassPorts: bypassPorts ?? {},
|
|
44
49
|
inputsConfigs: [contextConfig, ...inputsConfigs.map((x) => x.meta)],
|
|
@@ -60,6 +65,9 @@ export const defineReactiveNode = (config) => {
|
|
|
60
65
|
emitOncePerActivation: emitOncePerActivation ?? false,
|
|
61
66
|
stopsRun: stopsRun ?? false,
|
|
62
67
|
chatEntry: chatEntry ?? false,
|
|
68
|
+
...(feedVisitBoundary === true
|
|
69
|
+
? { feedVisitBoundary: true }
|
|
70
|
+
: {}),
|
|
63
71
|
bypassPorts: bypassPorts ?? {},
|
|
64
72
|
inputs,
|
|
65
73
|
outputs,
|
|
@@ -69,5 +77,5 @@ export const defineReactiveNode = (config) => {
|
|
|
69
77
|
return res;
|
|
70
78
|
};
|
|
71
79
|
export { createResolveSecret, emptyResolveSecret, } from './resolve-secret.js';
|
|
72
|
-
export { defineToolRegistrations } from '../define-tool-registrations/define-tool-registrations.js';
|
|
80
|
+
export { defineToolRegistrations, toToolHandles, } from '../define-tool-registrations/define-tool-registrations.js';
|
|
73
81
|
export { defineNode } from '../define-node/define-node.js';
|
|
@@ -23,6 +23,20 @@ export type InlineTextMultilineConfig = {
|
|
|
23
23
|
/** Min height in px (default {@link DEFAULT_MULTILINE_MIN_HEIGHT_PX}). */
|
|
24
24
|
readonly minHeightPx?: number;
|
|
25
25
|
};
|
|
26
|
+
/**
|
|
27
|
+
* Object form of `'markdown'`: same grow contract as
|
|
28
|
+
* {@link InlineTextMultilineConfig}. Shorthand `'markdown'` equals
|
|
29
|
+
* `{ type: 'markdown', flex: 1 }`. Author-time editable field — idle view
|
|
30
|
+
* is rendered markdown; focus opens a textarea. Do not prefix with
|
|
31
|
+
* `preview` (that family is read-only live).
|
|
32
|
+
*/
|
|
33
|
+
export type InlineMarkdownConfig = {
|
|
34
|
+
readonly type: 'markdown';
|
|
35
|
+
/** Flex grow weight when the node is taller than content; `0` = no grow. */
|
|
36
|
+
readonly flex?: number;
|
|
37
|
+
/** Min height in px (default {@link DEFAULT_MULTILINE_MIN_HEIGHT_PX}). */
|
|
38
|
+
readonly minHeightPx?: number;
|
|
39
|
+
};
|
|
26
40
|
export type ResolvedMultilineInlineLayout = {
|
|
27
41
|
readonly flex: number;
|
|
28
42
|
readonly minHeightPx: number;
|
|
@@ -30,14 +44,14 @@ export type ResolvedMultilineInlineLayout = {
|
|
|
30
44
|
/**
|
|
31
45
|
* On-node editor kind for an input port.
|
|
32
46
|
*
|
|
33
|
-
* `'text'` / `'text-multiline'` / `'boolean'` / `'number'` /
|
|
34
|
-
* kinds edit the design-time literal (`node.inputs[portId]`)
|
|
35
|
-
* disabled once an edge is wired into the port. `'preview'` /
|
|
47
|
+
* `'text'` / `'text-multiline'` / `'markdown'` / `'boolean'` / `'number'` /
|
|
48
|
+
* select-family kinds edit the design-time literal (`node.inputs[portId]`)
|
|
49
|
+
* and are disabled once an edge is wired into the port. `'preview'` /
|
|
36
50
|
* `'preview-markdown'` / `'preview-code'` are read-only displays of the
|
|
37
51
|
* **live** value received during execution (never disabled — there is no
|
|
38
52
|
* editable state to disable).
|
|
39
53
|
*/
|
|
40
|
-
export type InlineConfig = 'text' | 'text-multiline' | 'boolean' | 'preview' | 'preview-markdown' | 'preview-code' | InlineTextMultilineConfig | {
|
|
54
|
+
export type InlineConfig = 'text' | 'text-multiline' | 'markdown' | 'boolean' | 'preview' | 'preview-markdown' | 'preview-code' | InlineTextMultilineConfig | InlineMarkdownConfig | {
|
|
41
55
|
readonly type: 'select' | 'multiselect' | 'radio';
|
|
42
56
|
readonly options: readonly InlineSelectOption[];
|
|
43
57
|
} | {
|
|
@@ -46,7 +60,7 @@ export type InlineConfig = 'text' | 'text-multiline' | 'boolean' | 'preview' | '
|
|
|
46
60
|
readonly max?: number;
|
|
47
61
|
readonly step?: number;
|
|
48
62
|
};
|
|
49
|
-
/** Resolve multiline layout; `null` when `config` is not
|
|
63
|
+
/** Resolve multiline layout; `null` when `config` is not a grow multiline. */
|
|
50
64
|
export declare const resolveMultilineInlineLayout: (config: InlineConfig) => ResolvedMultilineInlineLayout | null;
|
|
51
65
|
/**
|
|
52
66
|
* User-facing input configuration.
|
|
@@ -2,12 +2,13 @@ import { isSuccess, statefulConnection, } from '@rx-evo/stateful-observable';
|
|
|
2
2
|
import { concat, concatMap, of } from 'rxjs';
|
|
3
3
|
/** Default floor for canvas/inspector multiline textareas (px). */
|
|
4
4
|
export const DEFAULT_MULTILINE_MIN_HEIGHT_PX = 100;
|
|
5
|
-
/** Resolve multiline layout; `null` when `config` is not
|
|
5
|
+
/** Resolve multiline layout; `null` when `config` is not a grow multiline. */
|
|
6
6
|
export const resolveMultilineInlineLayout = (config) => {
|
|
7
|
-
if (config === 'text-multiline') {
|
|
7
|
+
if (config === 'text-multiline' || config === 'markdown') {
|
|
8
8
|
return { flex: 1, minHeightPx: DEFAULT_MULTILINE_MIN_HEIGHT_PX };
|
|
9
9
|
}
|
|
10
|
-
if (typeof config === 'object' &&
|
|
10
|
+
if (typeof config === 'object' &&
|
|
11
|
+
(config.type === 'text-multiline' || config.type === 'markdown')) {
|
|
11
12
|
return {
|
|
12
13
|
flex: config.flex ?? 1,
|
|
13
14
|
minHeightPx: config.minHeightPx ?? DEFAULT_MULTILINE_MIN_HEIGHT_PX,
|