langflower 0.0.4 → 0.0.6

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 (98) hide show
  1. package/README.md +20 -15
  2. package/docs/public/README.md +15 -0
  3. package/docs/public/configuration.md +56 -0
  4. package/docs/public/extending.md +58 -0
  5. package/docs/public/getting-started.md +61 -0
  6. package/docs/public/how-it-works.md +39 -0
  7. package/docs/public/product.md +43 -0
  8. package/docs/public/using-the-editor.md +53 -0
  9. package/docs/public/workflows.md +49 -0
  10. package/package.json +3 -2
  11. package/ui-dist/chunk-6DQ2XSRW.js +4 -0
  12. package/ui-dist/{chunk-2AICAC67.js → chunk-Y6VMBLSJ.js} +1 -1
  13. package/ui-dist/index.html +2 -2
  14. package/ui-dist/main-RCFTD5AZ.js +311 -0
  15. package/ui-dist/styles-EOXODOI7.css +1 -0
  16. package/vendor/common-nodes/dist/ai/critique/node.d.ts +141 -23
  17. package/vendor/common-nodes/dist/ai/critique/node.js +33 -31
  18. package/vendor/common-nodes/dist/ai/fake-llm/node.d.ts +6 -6
  19. package/vendor/common-nodes/dist/ai/llm-compaction-ui-schema.d.ts +1 -1
  20. package/vendor/common-nodes/dist/ai/llm-compaction-ui-schema.js +2 -1
  21. package/vendor/common-nodes/dist/ai/llm-panel-ui-schema.d.ts +7 -21
  22. package/vendor/common-nodes/dist/ai/llm-panel-ui-schema.js +8 -4
  23. package/vendor/common-nodes/dist/ai/llm-session-shell.d.ts +2 -0
  24. package/vendor/common-nodes/dist/ai/llm-session-shell.js +3 -3
  25. package/vendor/common-nodes/dist/ai/normalize-max-iterations.d.ts +4 -3
  26. package/vendor/common-nodes/dist/ai/normalize-max-iterations.js +4 -3
  27. package/vendor/common-nodes/dist/ai/openai/normalize-compaction-params.d.ts +2 -2
  28. package/vendor/common-nodes/dist/ai/openai/normalize-compaction-params.js +1 -1
  29. package/vendor/common-nodes/dist/ai/openai-llm/node.d.ts +9 -9
  30. package/vendor/common-nodes/dist/ai/resolve-chat-provider-model.d.ts +10 -0
  31. package/vendor/common-nodes/dist/ai/resolve-chat-provider-model.js +8 -0
  32. package/vendor/common-nodes/dist/ai/review/node.d.ts +138 -15
  33. package/vendor/common-nodes/dist/ai/review/node.js +29 -22
  34. package/vendor/common-nodes/dist/ai/run-host-services.d.ts +8 -0
  35. package/vendor/common-nodes/dist/ai/sub-agent/node.d.ts +9 -9
  36. package/vendor/common-nodes/dist/ai/sub-agent/node.js +4 -3
  37. package/vendor/common-nodes/dist/hitl/chat-input/node.js +1 -0
  38. package/vendor/common-nodes/dist/hitl/review-gate/node.js +5 -0
  39. package/vendor/node-sdk/dist/node-factory/define-llm-node/default-llm-ports.js +2 -0
  40. package/vendor/node-sdk/dist/node-factory/define-reactive-node/define-reactive-node.d.ts +1 -1
  41. package/vendor/node-sdk/dist/node-factory/define-reactive-node/io-helpers.d.ts +5 -12
  42. package/vendor/node-sdk/dist/node-factory/define-reactive-node/port-meta.d.ts +13 -0
  43. package/vendor/runtime/dist/runtime-runner.js +7 -4
  44. package/vendor/runtime/dist/runtime.d.ts +1 -1
  45. package/vendor/runtime/dist/types.d.ts +12 -0
  46. package/vendor/server/dist/bridge/attach-langflower-bridge.d.ts +4 -1
  47. package/vendor/server/dist/bridge/attach-langflower-bridge.js +16 -5
  48. package/vendor/server/dist/bridge/bridge-event-log.d.ts +12 -0
  49. package/vendor/server/dist/bridge/bridge-event-log.js +199 -0
  50. package/vendor/server/dist/bridge/build-execution-context.d.ts +1 -1
  51. package/vendor/server/dist/bridge/build-execution-context.js +3 -0
  52. package/vendor/server/dist/bridge/emit-bootstrap.d.ts +4 -2
  53. package/vendor/server/dist/bridge/emit-bootstrap.js +6 -2
  54. package/vendor/server/dist/bridge/settings-draft-controller.d.ts +14 -0
  55. package/vendor/server/dist/bridge/settings-draft-controller.js +178 -0
  56. package/vendor/server/dist/bridge/wire-config-handlers.d.ts +8 -1
  57. package/vendor/server/dist/bridge/wire-config-handlers.js +44 -16
  58. package/vendor/server/dist/bridge/wire-editor-handlers.d.ts +8 -1
  59. package/vendor/server/dist/bridge/wire-editor-handlers.js +40 -1
  60. package/vendor/server/dist/bridge/wire-runner-handlers.js +3 -1
  61. package/vendor/server/dist/config/langflower-config.service.d.ts +2 -0
  62. package/vendor/server/dist/config/langflower-config.service.js +24 -1
  63. package/vendor/server/dist/config/resolve-draft-provider-credentials.d.ts +18 -0
  64. package/vendor/server/dist/config/resolve-draft-provider-credentials.js +60 -0
  65. package/vendor/server/dist/create-server.js +5 -3
  66. package/vendor/server/dist/session/build-session-bootstrap.d.ts +3 -1
  67. package/vendor/server/dist/session/build-session-bootstrap.js +9 -0
  68. package/vendor/server/dist/session/langflower-session.d.ts +7 -2
  69. package/vendor/server/dist/session/langflower-session.js +9 -1
  70. package/vendor/server/dist/session/settings-draft-session.d.ts +24 -0
  71. package/vendor/server/dist/session/settings-draft-session.js +82 -0
  72. package/vendor/server/skeleton/schemas/langflower-config.schema.json +4 -0
  73. package/vendor/server/skeleton/skills/langflower-helper/SKILL.md +20 -8
  74. package/vendor/server/skeleton/skills/langflower-helper/architecture.md +5 -0
  75. package/vendor/server/skeleton/skills/langflower-helper/layout.md +18 -16
  76. package/vendor/server/skeleton/workflows/simple-coder.json +249 -19
  77. package/vendor/server/skeleton/workflows/starter.json +31 -20
  78. package/vendor/shared/dist/langflower-bus-config.d.ts +50 -10
  79. package/vendor/shared/dist/langflower-bus-config.js +52 -11
  80. package/vendor/shared/dist/langflower-config/merge-langflower-config-layers.test.js +4 -0
  81. package/vendor/shared/dist/langflower-config/parse-default-chat-model.d.ts +14 -0
  82. package/vendor/shared/dist/langflower-config/parse-default-chat-model.js +38 -0
  83. package/vendor/shared/dist/langflower-config/parse-default-chat-model.test.d.ts +1 -0
  84. package/vendor/shared/dist/langflower-config/parse-default-chat-model.test.js +41 -0
  85. package/vendor/shared/dist/langflower-config/resolve-server-logs-enabled.d.ts +6 -0
  86. package/vendor/shared/dist/langflower-config/resolve-server-logs-enabled.js +5 -0
  87. package/vendor/shared/dist/langflower-config/resolve-server-logs-enabled.test.d.ts +1 -0
  88. package/vendor/shared/dist/langflower-config/resolve-server-logs-enabled.test.js +11 -0
  89. package/vendor/shared/dist/langflower-config/settings-draft.d.ts +44 -0
  90. package/vendor/shared/dist/langflower-config/settings-draft.js +143 -0
  91. package/vendor/shared/dist/langflower.d.ts +7 -2
  92. package/vendor/shared/dist/langflower.js +3 -0
  93. package/vendor/shared/dist/types/langflower-bootstrap.d.ts +6 -1
  94. package/vendor/shared/dist/types/langflower-config.d.ts +65 -0
  95. package/vendor/shared/dist/types/langflower-editor.d.ts +19 -0
  96. package/ui-dist/chunk-6ZABW4JL.js +0 -4
  97. package/ui-dist/main-XI7IOZKZ.js +0 -311
  98. package/ui-dist/styles-TQGRAC7Q.css +0 -1
@@ -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-full{top:100%}.right-0{right:0}.right-3{right:calc(var(--spacing) * 3)}.right-full{right:100%}.bottom-0{bottom:0}.bottom-2{bottom:calc(var(--spacing) * 2)}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.left-full{left:100%}.z-0{z-index:0}.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}.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-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)}.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)}.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}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-col-resize{cursor:col-resize}.cursor-grab{cursor:grab}.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-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-2{border-style:var(--tw-border-style);border-width:2px}.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-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)}.py-4{padding-block:calc(var(--spacing) * 4)}.pt-1{padding-top:var(--spacing)}.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-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}.text-right{text-align:right}.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)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.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}.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\: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-row--hovered{border-radius:.5rem;background-color:#8b5cf61a}html[data-theme=dark] .lf-feed-row--hovered{background-color:#a78bfa1f}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:#a1a1aa;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-rotate-x{syntax: "*"; inherits: false;}@property --tw-rotate-y{syntax: "*"; inherits: false;}@property --tw-rotate-z{syntax: "*"; inherits: false;}@property --tw-skew-x{syntax: "*"; inherits: false;}@property --tw-skew-y{syntax: "*"; inherits: false;}@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-rotate-x: initial;--tw-rotate-y: initial;--tw-rotate-z: initial;--tw-skew-x: initial;--tw-skew-y: initial;--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}}}
@@ -1,37 +1,73 @@
1
1
  /**
2
- * Dedicated Critique node: path choice via **Review-private** control tools
3
- * (`accept` / `feedback` in `path-choice/control-tools.ts`). Those chat tools are
4
- * ephemeral on completion calls only they must not leak into shared
5
- * inventory / other LLM nodes. Tool payloads demux to `response` / `feedback`
6
- * ports; free-form replies get a reminder. Optional inventory / MCP /
7
- * Sub-Agents use shared LLM inventory ports.
2
+ * Adversarial Critique: path choice via the same Review-private control tools
3
+ * (`accept` / `feedback`). First input is the original assignment; second is
4
+ * the packet under attack. Optional inventory / MCP / Sub-Agents may run first.
8
5
  *
9
6
  * Session history uses the shared {@link createLlmSessionCycle$} (ADR-016):
10
7
  * init = assignment / system / inventory; turn driver = `packet`.
11
- * @see docs/use-cases/adversarial-red-team.md
12
- * @see docs/DONE/EPICS/MECHANICS-tool-execution.md
13
8
  */
14
9
  export declare const critiqueNode: {
15
10
  readonly emitOncePerActivation: boolean;
16
11
  readonly stopsRun: boolean;
17
12
  readonly chatEntry: boolean;
18
- readonly uiSchema: readonly [{
13
+ readonly uiSchema: readonly [...({
19
14
  readonly field: "providerId";
20
15
  readonly type: "select";
21
16
  readonly label: "Provider";
22
17
  readonly optionsSource: "langflower.providers";
23
- }, {
18
+ } | {
24
19
  readonly field: "model";
25
20
  readonly type: "select";
26
21
  readonly label: "Model";
27
22
  readonly optionsSource: "langflower.models";
28
23
  readonly dependsOn: "providerId";
29
- }, {
24
+ } | {
30
25
  readonly field: "skillId";
31
26
  readonly type: "select";
32
27
  readonly label: "Skill";
33
28
  readonly optionsSource: "langflower.skills";
34
- }, {
29
+ } | {
30
+ readonly field: "rolePreset";
31
+ readonly type: "select";
32
+ readonly label: "Role preset";
33
+ readonly default: "custom";
34
+ readonly options: readonly [{
35
+ readonly value: "custom";
36
+ readonly title: "Custom";
37
+ }, {
38
+ readonly value: "plan";
39
+ readonly title: "Plan";
40
+ }, {
41
+ readonly value: "coder";
42
+ readonly title: "Coder";
43
+ }, {
44
+ readonly value: "explorer";
45
+ readonly title: "Explorer";
46
+ }];
47
+ } | {
48
+ readonly field: "includeAgentsMd";
49
+ readonly type: "boolean";
50
+ readonly label: "Include root AGENTS.md";
51
+ readonly default: false;
52
+ } | {
53
+ readonly field: "toolPermissions";
54
+ readonly type: "tool-permission-table";
55
+ readonly label: "Tool permissions";
56
+ readonly optionsSource: "node.wiredTools";
57
+ } | {
58
+ readonly field: "enabledMcpIds";
59
+ readonly type: "tool-id-list";
60
+ readonly label: "Enabled MCP";
61
+ readonly optionsSource: "langflower.mcpServers";
62
+ } | {
63
+ readonly field: "maxFeedbackTurns";
64
+ readonly type: "number";
65
+ readonly label: "Max feedback turns (0 = unlimited)";
66
+ readonly default: 50;
67
+ readonly min: 0;
68
+ readonly max: number;
69
+ readonly step: 1;
70
+ })[], {
35
71
  readonly field: "maxIterations";
36
72
  readonly type: "number";
37
73
  readonly label: "Tool-loop max iterations per feedback turn (0 = unlimited)";
@@ -43,7 +79,7 @@ export declare const critiqueNode: {
43
79
  readonly field: "contextSize";
44
80
  readonly type: "number";
45
81
  readonly label: "Context size (approx tokens)";
46
- readonly default: 32768;
82
+ readonly default: 200000;
47
83
  readonly min: 0;
48
84
  readonly step: 1;
49
85
  }, {
@@ -82,23 +118,64 @@ export declare const critiqueNode: {
82
118
  readonly step: 1;
83
119
  }];
84
120
  readonly bypassPorts: Record<string, import("@langflower/node-sdk").WireType>;
85
- readonly inputsConfigs: readonly [import("@langflower/node-sdk").InputPortMeta<import("@langflower/node-sdk").ExecutionContext<readonly [{
121
+ readonly inputsConfigs: readonly [import("@langflower/node-sdk").InputPortMeta<import("@langflower/node-sdk").ExecutionContext<readonly [...({
86
122
  readonly field: "providerId";
87
123
  readonly type: "select";
88
124
  readonly label: "Provider";
89
125
  readonly optionsSource: "langflower.providers";
90
- }, {
126
+ } | {
91
127
  readonly field: "model";
92
128
  readonly type: "select";
93
129
  readonly label: "Model";
94
130
  readonly optionsSource: "langflower.models";
95
131
  readonly dependsOn: "providerId";
96
- }, {
132
+ } | {
97
133
  readonly field: "skillId";
98
134
  readonly type: "select";
99
135
  readonly label: "Skill";
100
136
  readonly optionsSource: "langflower.skills";
101
- }, {
137
+ } | {
138
+ readonly field: "rolePreset";
139
+ readonly type: "select";
140
+ readonly label: "Role preset";
141
+ readonly default: "custom";
142
+ readonly options: readonly [{
143
+ readonly value: "custom";
144
+ readonly title: "Custom";
145
+ }, {
146
+ readonly value: "plan";
147
+ readonly title: "Plan";
148
+ }, {
149
+ readonly value: "coder";
150
+ readonly title: "Coder";
151
+ }, {
152
+ readonly value: "explorer";
153
+ readonly title: "Explorer";
154
+ }];
155
+ } | {
156
+ readonly field: "includeAgentsMd";
157
+ readonly type: "boolean";
158
+ readonly label: "Include root AGENTS.md";
159
+ readonly default: false;
160
+ } | {
161
+ readonly field: "toolPermissions";
162
+ readonly type: "tool-permission-table";
163
+ readonly label: "Tool permissions";
164
+ readonly optionsSource: "node.wiredTools";
165
+ } | {
166
+ readonly field: "enabledMcpIds";
167
+ readonly type: "tool-id-list";
168
+ readonly label: "Enabled MCP";
169
+ readonly optionsSource: "langflower.mcpServers";
170
+ } | {
171
+ readonly field: "maxFeedbackTurns";
172
+ readonly type: "number";
173
+ readonly label: "Max feedback turns (0 = unlimited)";
174
+ readonly default: 50;
175
+ readonly min: 0;
176
+ readonly max: number;
177
+ readonly step: 1;
178
+ })[], {
102
179
  readonly field: "maxIterations";
103
180
  readonly type: "number";
104
181
  readonly label: "Tool-loop max iterations per feedback turn (0 = unlimited)";
@@ -110,7 +187,7 @@ export declare const critiqueNode: {
110
187
  readonly field: "contextSize";
111
188
  readonly type: "number";
112
189
  readonly label: "Context size (approx tokens)";
113
- readonly default: 32768;
190
+ readonly default: 200000;
114
191
  readonly min: 0;
115
192
  readonly step: 1;
116
193
  }, {
@@ -149,23 +226,64 @@ export declare const critiqueNode: {
149
226
  readonly step: 1;
150
227
  }], import("@langflower/node-sdk/llm").LlmExecutionCaps>>, ...import("@langflower/node-sdk").InputPortMeta<unknown>[]];
151
228
  readonly outputsConfigs: (import("@langflower/node-sdk").OutputParams & import("@langflower/node-sdk").PortMeta)[];
152
- readonly getInstance: () => import("@langflower/node-sdk").ReactiveNodeInstance<readonly [{
229
+ readonly getInstance: () => import("@langflower/node-sdk").ReactiveNodeInstance<readonly [...({
153
230
  readonly field: "providerId";
154
231
  readonly type: "select";
155
232
  readonly label: "Provider";
156
233
  readonly optionsSource: "langflower.providers";
157
- }, {
234
+ } | {
158
235
  readonly field: "model";
159
236
  readonly type: "select";
160
237
  readonly label: "Model";
161
238
  readonly optionsSource: "langflower.models";
162
239
  readonly dependsOn: "providerId";
163
- }, {
240
+ } | {
164
241
  readonly field: "skillId";
165
242
  readonly type: "select";
166
243
  readonly label: "Skill";
167
244
  readonly optionsSource: "langflower.skills";
168
- }, {
245
+ } | {
246
+ readonly field: "rolePreset";
247
+ readonly type: "select";
248
+ readonly label: "Role preset";
249
+ readonly default: "custom";
250
+ readonly options: readonly [{
251
+ readonly value: "custom";
252
+ readonly title: "Custom";
253
+ }, {
254
+ readonly value: "plan";
255
+ readonly title: "Plan";
256
+ }, {
257
+ readonly value: "coder";
258
+ readonly title: "Coder";
259
+ }, {
260
+ readonly value: "explorer";
261
+ readonly title: "Explorer";
262
+ }];
263
+ } | {
264
+ readonly field: "includeAgentsMd";
265
+ readonly type: "boolean";
266
+ readonly label: "Include root AGENTS.md";
267
+ readonly default: false;
268
+ } | {
269
+ readonly field: "toolPermissions";
270
+ readonly type: "tool-permission-table";
271
+ readonly label: "Tool permissions";
272
+ readonly optionsSource: "node.wiredTools";
273
+ } | {
274
+ readonly field: "enabledMcpIds";
275
+ readonly type: "tool-id-list";
276
+ readonly label: "Enabled MCP";
277
+ readonly optionsSource: "langflower.mcpServers";
278
+ } | {
279
+ readonly field: "maxFeedbackTurns";
280
+ readonly type: "number";
281
+ readonly label: "Max feedback turns (0 = unlimited)";
282
+ readonly default: 50;
283
+ readonly min: 0;
284
+ readonly max: number;
285
+ readonly step: 1;
286
+ })[], {
169
287
  readonly field: "maxIterations";
170
288
  readonly type: "number";
171
289
  readonly label: "Tool-loop max iterations per feedback turn (0 = unlimited)";
@@ -177,7 +295,7 @@ export declare const critiqueNode: {
177
295
  readonly field: "contextSize";
178
296
  readonly type: "number";
179
297
  readonly label: "Context size (approx tokens)";
180
- readonly default: 32768;
298
+ readonly default: 200000;
181
299
  readonly min: 0;
182
300
  readonly step: 1;
183
301
  }, {
@@ -1,10 +1,13 @@
1
1
  import { filter, map, Observable } from 'rxjs';
2
2
  import { defineLlmNode, isSteerControlPayload, } from '@langflower/node-sdk/llm';
3
3
  import { collectAgentToolHandles } from '../../tools/collect-agent-tool-handles.js';
4
- import { createLlmSessionCycle$, demuxByKind } from '../llm-session-shell.js';
4
+ import { buildEffectiveSystemPrompt } from '../build-effective-system-prompt.js';
5
+ import { resolveChatProviderModel } from '../resolve-chat-provider-model.js';
6
+ import { createLlmSessionCycle$, demuxByKind, normalizeMaxFeedbackTurns, } from '../llm-session-shell.js';
5
7
  import { llmCompactionUiSchema } from '../llm-compaction-ui-schema.js';
6
8
  import { llmRecoveryUiSchema } from '../llm-recovery-ui-schema.js';
7
- import { llmMaxIterationsUiField, llmProviderModelSkillUiSchema, } from '../llm-panel-ui-schema.js';
9
+ import { llmMaxIterationsUiField, llmPanelUiSchema, } from '../llm-panel-ui-schema.js';
10
+ import { parseLlmRolePreset, resolveEffectiveSkillId, } from '../llm-role-preset.js';
8
11
  import { DEFAULT_PATH_CHOICE_MAX_ITERATIONS, PATH_CHOICE_MAX_ITERATIONS_CAP, normalizeMaxIterations, } from '../normalize-max-iterations.js';
9
12
  import { normalizeLlmRecoveryPolicy } from '../llm-loop/normalize-llm-recovery-policy.js';
10
13
  import { normalizeCompactionConfig } from '../openai/normalize-compaction-params.js';
@@ -23,12 +26,6 @@ const FORCED_TOOL_SYSTEM = [
23
26
  `Call ${REVIEW_FEEDBACK_TOOL} with concrete findings when the packet is not yet defensible.`,
24
27
  `Call ${REVIEW_ACCEPT_TOOL} only when further attack is non-blocking — agreed enough to stop critiquing.`,
25
28
  ].join(' ');
26
- const critiquePanelUiSchema = [
27
- ...llmProviderModelSkillUiSchema,
28
- llmMaxIterationsUiField(DEFAULT_PATH_CHOICE_MAX_ITERATIONS, PATH_CHOICE_MAX_ITERATIONS_CAP),
29
- ...llmCompactionUiSchema,
30
- ...llmRecoveryUiSchema,
31
- ];
32
29
  const requireChatConfig = (providerId, model) => {
33
30
  if (providerId.trim().length === 0) {
34
31
  throw new Error('Provider is required for Critique chat');
@@ -37,15 +34,11 @@ const requireChatConfig = (providerId, model) => {
37
34
  throw new Error('Model is required for Critique chat');
38
35
  }
39
36
  };
40
- const buildEffectiveCritiqueSystem = (systemPromptInput, skillMarkdown) => {
37
+ const buildEffectiveCritiqueSystem = (input) => {
38
+ const merged = buildEffectiveSystemPrompt(input);
41
39
  const parts = [FORCED_TOOL_SYSTEM];
42
- const author = systemPromptInput.trim();
43
- if (author.length > 0) {
44
- parts.push(author);
45
- }
46
- const skill = skillMarkdown.trim();
47
- if (skill.length > 0) {
48
- parts.push(skill);
40
+ if (merged.trim().length > 0) {
41
+ parts.push(merged);
49
42
  }
50
43
  return parts.join('\n\n---\n\n');
51
44
  };
@@ -65,7 +58,7 @@ const runCritiqueTurn = (context, packet, history, subagentResult$) => {
65
58
  const factory = context.factory;
66
59
  if (factory === undefined) {
67
60
  return new Observable((subscriber) => {
68
- subscriber.error(new Error('Review chat is only available during server workflow runs'));
61
+ subscriber.error(new Error('Critique chat is only available during server workflow runs'));
69
62
  });
70
63
  }
71
64
  requireChatConfig(context.providerId, context.model);
@@ -105,24 +98,24 @@ const runCritiqueTurn = (context, packet, history, subagentResult$) => {
105
98
  }));
106
99
  };
107
100
  /**
108
- * Dedicated Critique node: path choice via **Review-private** control tools
109
- * (`accept` / `feedback` in `path-choice/control-tools.ts`). Those chat tools are
110
- * ephemeral on completion calls only they must not leak into shared
111
- * inventory / other LLM nodes. Tool payloads demux to `response` / `feedback`
112
- * ports; free-form replies get a reminder. Optional inventory / MCP /
113
- * Sub-Agents use shared LLM inventory ports.
101
+ * Adversarial Critique: path choice via the same Review-private control tools
102
+ * (`accept` / `feedback`). First input is the original assignment; second is
103
+ * the packet under attack. Optional inventory / MCP / Sub-Agents may run first.
114
104
  *
115
105
  * Session history uses the shared {@link createLlmSessionCycle$} (ADR-016):
116
106
  * init = assignment / system / inventory; turn driver = `packet`.
117
- * @see docs/use-cases/adversarial-red-team.md
118
- * @see docs/DONE/EPICS/MECHANICS-tool-execution.md
119
107
  */
120
108
  export const critiqueNode = defineLlmNode({
121
109
  type: 'common-critique',
122
110
  displayName: 'Critique',
123
111
  category: 'AI',
124
112
  description: 'Adversarial Critique: first input is the original assignment/topic; second is the packet to attack. Finish with accept (agreed enough) or feedback (findings). Requires native tool / function calling. Optional wired tools / MCP / Sub-Agents may run via harness first.',
125
- uiSchema: critiquePanelUiSchema,
113
+ uiSchema: [
114
+ ...llmPanelUiSchema.filter((item) => item.field !== 'maxIterations'),
115
+ llmMaxIterationsUiField(DEFAULT_PATH_CHOICE_MAX_ITERATIONS, PATH_CHOICE_MAX_ITERATIONS_CAP),
116
+ ...llmCompactionUiSchema,
117
+ ...llmRecoveryUiSchema,
118
+ ],
126
119
  bind(ctx, { makeInput, configureOutput, combineInputs }, inventory) {
127
120
  const { tools, mcp, subagentRegistration, subagentResult, steerControl, } = inventory;
128
121
  const assignment = makeInput('assignment', {
@@ -145,22 +138,31 @@ export const critiqueNode = defineLlmNode({
145
138
  });
146
139
  // Init peers only — packet is the session turn driver (ADR-016).
147
140
  const context$ = combineInputs([assignment, systemPrompt, tools, subagentRegistration, mcp, ctx], ([assignmentValue, systemPromptValue, toolList, subagentList, mcpList, ec,]) => {
148
- const skillId = String(ec.params.skillId ?? '');
141
+ const rolePreset = parseLlmRolePreset(ec.params.rolePreset);
142
+ const skillId = resolveEffectiveSkillId(rolePreset, ec.params.skillId);
149
143
  const hostServices = getRunHostServices(ec);
150
144
  const skillMarkdown = hostServices?.skillMarkdown ?? '';
145
+ const agentsMarkdown = hostServices?.agentsMarkdown ?? '';
151
146
  return {
152
147
  assignment: String(assignmentValue ?? ''),
153
- providerId: String(ec.params.providerId ?? ''),
154
- model: String(ec.params.model ?? ''),
148
+ ...resolveChatProviderModel(ec.params, hostServices),
155
149
  skillId,
156
150
  skillMarkdown,
157
- effectiveSystemPrompt: buildEffectiveCritiqueSystem(String(systemPromptValue ?? ''), skillMarkdown),
151
+ effectiveSystemPrompt: buildEffectiveCritiqueSystem({
152
+ rolePreset,
153
+ systemPromptInput: String(systemPromptValue ?? ''),
154
+ agentsMarkdown,
155
+ skillMarkdown,
156
+ }),
158
157
  factory: hostServices?.createChatCompletionStream,
159
158
  maxIterations: normalizeMaxIterations(ec.params.maxIterations, {
160
159
  fallback: DEFAULT_PATH_CHOICE_MAX_ITERATIONS,
161
160
  maxCap: PATH_CHOICE_MAX_ITERATIONS_CAP,
162
161
  }),
163
- maxFeedbackTurns: 0,
162
+ maxFeedbackTurns: normalizeMaxFeedbackTurns(ec.params.maxFeedbackTurns),
163
+ ...(hostServices?.requestPermission !== undefined
164
+ ? { requestPermission: hostServices.requestPermission }
165
+ : {}),
164
166
  compaction: normalizeCompactionConfig(ec.params),
165
167
  recovery: normalizeLlmRecoveryPolicy(ec.params),
166
168
  steerControl$: steerControl.value$.pipe(filter(isSteerControlPayload)),
@@ -69,9 +69,9 @@ export declare const fakeLlmNode: {
69
69
  readonly field: "maxFeedbackTurns";
70
70
  readonly type: "number";
71
71
  readonly label: "Max feedback turns (0 = unlimited)";
72
- readonly default: 0;
72
+ readonly default: 50;
73
73
  readonly min: 0;
74
- readonly max: 64;
74
+ readonly max: number;
75
75
  readonly step: 1;
76
76
  }, {
77
77
  readonly field: "streamIdleTimeoutMs";
@@ -172,9 +172,9 @@ export declare const fakeLlmNode: {
172
172
  readonly field: "maxFeedbackTurns";
173
173
  readonly type: "number";
174
174
  readonly label: "Max feedback turns (0 = unlimited)";
175
- readonly default: 0;
175
+ readonly default: 50;
176
176
  readonly min: 0;
177
- readonly max: 64;
177
+ readonly max: number;
178
178
  readonly step: 1;
179
179
  }, {
180
180
  readonly field: "streamIdleTimeoutMs";
@@ -275,9 +275,9 @@ export declare const fakeLlmNode: {
275
275
  readonly field: "maxFeedbackTurns";
276
276
  readonly type: "number";
277
277
  readonly label: "Max feedback turns (0 = unlimited)";
278
- readonly default: 0;
278
+ readonly default: 50;
279
279
  readonly min: 0;
280
- readonly max: 64;
280
+ readonly max: number;
281
281
  readonly step: 1;
282
282
  }, {
283
283
  readonly field: "streamIdleTimeoutMs";
@@ -3,7 +3,7 @@ export declare const llmCompactionUiSchema: readonly [{
3
3
  readonly field: "contextSize";
4
4
  readonly type: "number";
5
5
  readonly label: "Context size (approx tokens)";
6
- readonly default: 32768;
6
+ readonly default: 200000;
7
7
  readonly min: 0;
8
8
  readonly step: 1;
9
9
  }, {
@@ -1,10 +1,11 @@
1
+ import { DEFAULT_CONTEXT_SIZE } from './openai/normalize-compaction-params.js';
1
2
  /** Shared Inspector fields for OpenAI-compatible chat compaction. */
2
3
  export const llmCompactionUiSchema = [
3
4
  {
4
5
  field: 'contextSize',
5
6
  type: 'number',
6
7
  label: 'Context size (approx tokens)',
7
- default: 32768,
8
+ default: DEFAULT_CONTEXT_SIZE,
8
9
  min: 0,
9
10
  step: 1,
10
11
  },
@@ -1,21 +1,3 @@
1
- /** Provider / Model / Skill — shared by agent and path-choice LLM nodes. */
2
- export declare const llmProviderModelSkillUiSchema: readonly [{
3
- readonly field: "providerId";
4
- readonly type: "select";
5
- readonly label: "Provider";
6
- readonly optionsSource: "langflower.providers";
7
- }, {
8
- readonly field: "model";
9
- readonly type: "select";
10
- readonly label: "Model";
11
- readonly optionsSource: "langflower.models";
12
- readonly dependsOn: "providerId";
13
- }, {
14
- readonly field: "skillId";
15
- readonly type: "select";
16
- readonly label: "Skill";
17
- readonly optionsSource: "langflower.skills";
18
- }];
19
1
  export declare const llmMaxIterationsUiField: (defaultValue: number, maxCap: number) => {
20
2
  readonly field: "maxIterations";
21
3
  readonly type: "number";
@@ -25,7 +7,11 @@ export declare const llmMaxIterationsUiField: (defaultValue: number, maxCap: num
25
7
  readonly max: number;
26
8
  readonly step: 1;
27
9
  };
28
- /** Shared Inspector panel fields for agent LLM nodes (fake + OpenAI + Sub-Agent). */
10
+ /**
11
+ * Shared Inspector panel floor for all LLM-family nodes (OpenAI, Fake,
12
+ * Sub-Agent, Review, Critique). Nodes may expand after this list; they must
13
+ * not omit these fields.
14
+ */
29
15
  export declare const llmPanelUiSchema: readonly [{
30
16
  readonly field: "rolePreset";
31
17
  readonly type: "select";
@@ -87,8 +73,8 @@ export declare const llmPanelUiSchema: readonly [{
87
73
  readonly field: "maxFeedbackTurns";
88
74
  readonly type: "number";
89
75
  readonly label: "Max feedback turns (0 = unlimited)";
90
- readonly default: 0;
76
+ readonly default: 50;
91
77
  readonly min: 0;
92
- readonly max: 64;
78
+ readonly max: number;
93
79
  readonly step: 1;
94
80
  }];
@@ -1,7 +1,7 @@
1
1
  import { LLM_ROLE_PRESET_OPTIONS } from './llm-role-preset.js';
2
2
  import { AGENT_MAX_ITERATIONS_CAP, DEFAULT_AGENT_MAX_ITERATIONS, } from './normalize-max-iterations.js';
3
- /** Provider / Model / Skill — shared by agent and path-choice LLM nodes. */
4
- export const llmProviderModelSkillUiSchema = [
3
+ /** Provider / Model / Skill — folded into {@link llmPanelUiSchema}. */
4
+ const llmProviderModelSkillUiSchema = [
5
5
  {
6
6
  field: 'providerId',
7
7
  type: 'select',
@@ -31,7 +31,11 @@ export const llmMaxIterationsUiField = (defaultValue, maxCap) => ({
31
31
  max: maxCap,
32
32
  step: 1,
33
33
  });
34
- /** Shared Inspector panel fields for agent LLM nodes (fake + OpenAI + Sub-Agent). */
34
+ /**
35
+ * Shared Inspector panel floor for all LLM-family nodes (OpenAI, Fake,
36
+ * Sub-Agent, Review, Critique). Nodes may expand after this list; they must
37
+ * not omit these fields.
38
+ */
35
39
  export const llmPanelUiSchema = [
36
40
  {
37
41
  field: 'rolePreset',
@@ -64,7 +68,7 @@ export const llmPanelUiSchema = [
64
68
  field: 'maxFeedbackTurns',
65
69
  type: 'number',
66
70
  label: 'Max feedback turns (0 = unlimited)',
67
- default: 0,
71
+ default: 50,
68
72
  min: 0,
69
73
  max: AGENT_MAX_ITERATIONS_CAP,
70
74
  step: 1,
@@ -94,6 +94,8 @@ type ReactiveBindHelpers = {
94
94
  readonly configureOutput: typeof configureOutput;
95
95
  readonly combineInputs: typeof combineStatefulObservables;
96
96
  };
97
+ /** 0 = unlimited; positive = max feedback turns after turn 0. */
98
+ export declare const normalizeMaxFeedbackTurns: (value: unknown) => number;
97
99
  export declare const appendToolInventory: (systemPrompt: string, tools: readonly ToolHandle[]) => string;
98
100
  /**
99
101
  * RxJS operator: filter session chunks by `kind` and project the payload.