@ykurilov/agent-chat-skin-tandem 0.65.1 → 0.67.0
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/CHANGELOG.md +32 -0
- package/dist/flows/index.js +60 -12
- package/dist/flows/index.js.map +1 -1
- package/package.json +14 -14
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,37 @@
|
|
|
1
1
|
# @ykurilov/agent-chat-skin-tandem
|
|
2
2
|
|
|
3
|
+
## 0.67.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 12c0dd8: Потолок «пишет первым» по дням программы: `schedule.firstMessages.maxPerDayByDay` (`[3, 2]` — день 1 три, со дня 2 по
|
|
8
|
+
два; главнее `maxPerDay`; ответ человека счёт не обнуляет). Свои касания ноды до N-го дня программы:
|
|
9
|
+
`nudges.untilProgramDay` (дошёл до ноды позже — сразу общий ряд). `checkFlow`: `nudges_until_day_invalid`,
|
|
10
|
+
`nudges_until_day_after_end`, `max_per_day_by_day_after_end`. Доска: поле «по дням программы» и режим «до дня программы»
|
|
11
|
+
(ru/en); `FlowStateTimingProps` + `nudgesUntilProgramDay`, `onNudgesUntilProgramDayChange`; выгружены `parseCapsByDay`,
|
|
12
|
+
`capsByDayText`.
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- Updated dependencies [12c0dd8]
|
|
17
|
+
- @ykurilov/agent-chat-flows@0.67.0
|
|
18
|
+
- @ykurilov/agent-chat-mcp@0.67.0
|
|
19
|
+
- @ykurilov/agent-chat-messengers@0.67.0
|
|
20
|
+
- @ykurilov/agent-chat-react@0.67.0
|
|
21
|
+
- @ykurilov/agent-chat-sandbox@0.67.0
|
|
22
|
+
- @ykurilov/agent-chat-skills@0.67.0
|
|
23
|
+
|
|
24
|
+
## 0.66.0
|
|
25
|
+
|
|
26
|
+
### Patch Changes
|
|
27
|
+
|
|
28
|
+
- @ykurilov/agent-chat-flows@0.66.0
|
|
29
|
+
- @ykurilov/agent-chat-mcp@0.66.0
|
|
30
|
+
- @ykurilov/agent-chat-messengers@0.66.0
|
|
31
|
+
- @ykurilov/agent-chat-sandbox@0.66.0
|
|
32
|
+
- @ykurilov/agent-chat-skills@0.66.0
|
|
33
|
+
- @ykurilov/agent-chat-react@0.66.0
|
|
34
|
+
|
|
3
35
|
## 0.65.1
|
|
4
36
|
|
|
5
37
|
### Patch Changes
|
package/dist/flows/index.js
CHANGED
|
@@ -1170,8 +1170,9 @@ function TandemFlowCheckPanel({ issues }) {
|
|
|
1170
1170
|
|
|
1171
1171
|
// src/flows/flow-days.tsx
|
|
1172
1172
|
import { Button as Button6, Input as Input4, Switch as Switch2, Textarea as Textarea3, cn as cn6 } from "@tandem/ui";
|
|
1173
|
-
import { DEFAULT_NUDGES, useFlowLabels as useFlowLabels8 } from "@ykurilov/agent-chat-flows/react";
|
|
1173
|
+
import { capsByDayText, DEFAULT_NUDGES, parseCapsByDay, useFlowLabels as useFlowLabels8 } from "@ykurilov/agent-chat-flows/react";
|
|
1174
1174
|
import { ChevronDown as ChevronDown3, Clock as Clock4, Plus as Plus4, Trash2 as Trash23, X as X2 } from "lucide-react";
|
|
1175
|
+
import { useState as useState5 } from "react";
|
|
1175
1176
|
import { Fragment as Fragment2, jsx as jsx9, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
1176
1177
|
var TIMER_UNITS = ["min", "h", "d"];
|
|
1177
1178
|
var NUDGES_MODES = ["inherit", "own", "off"];
|
|
@@ -1339,6 +1340,13 @@ function TandemFlowScheduleSection(props) {
|
|
|
1339
1340
|
onChange: (event) => onChange({ firstMessages: { ...schedule.firstMessages, maxPerDay: numberOrNone(event.target.value) } })
|
|
1340
1341
|
}
|
|
1341
1342
|
) }),
|
|
1343
|
+
/* @__PURE__ */ jsx9(Labeled, { label: text.maxPerDayByDay, hint: text.maxPerDayByDayHint, children: /* @__PURE__ */ jsx9(
|
|
1344
|
+
CapsByDayInput,
|
|
1345
|
+
{
|
|
1346
|
+
caps: schedule.firstMessages?.maxPerDayByDay,
|
|
1347
|
+
onChange: (maxPerDayByDay) => onChange({ firstMessages: { ...schedule.firstMessages, maxPerDayByDay } })
|
|
1348
|
+
}
|
|
1349
|
+
) }),
|
|
1342
1350
|
/* @__PURE__ */ jsx9(
|
|
1343
1351
|
SwitchRow,
|
|
1344
1352
|
{
|
|
@@ -1524,44 +1532,84 @@ function TandemFlowStateTiming(props) {
|
|
|
1524
1532
|
)) }),
|
|
1525
1533
|
/* @__PURE__ */ jsx9("span", { className: "text-xs text-[var(--foreground-muted)]", children: labels.nudgesHint }),
|
|
1526
1534
|
props.nudges,
|
|
1527
|
-
props.nudgesMode === "own" && /* @__PURE__ */ jsx9(
|
|
1535
|
+
props.nudgesMode === "own" && /* @__PURE__ */ jsx9(
|
|
1536
|
+
NudgesDays,
|
|
1537
|
+
{
|
|
1538
|
+
days: props.nudgesDays,
|
|
1539
|
+
untilProgramDay: props.nudgesUntilProgramDay,
|
|
1540
|
+
onDaysChange: props.onNudgesDaysChange,
|
|
1541
|
+
onUntilProgramDayChange: props.onNudgesUntilProgramDayChange
|
|
1542
|
+
}
|
|
1543
|
+
)
|
|
1528
1544
|
] })
|
|
1529
1545
|
] });
|
|
1530
1546
|
}
|
|
1531
|
-
function NudgesDays(
|
|
1547
|
+
function NudgesDays(props) {
|
|
1532
1548
|
const labels = useFlowLabels8().editor.statePanel;
|
|
1549
|
+
const mode = props.untilProgramDay !== null ? "untilProgramDay" : props.days !== null ? "days" : "always";
|
|
1550
|
+
const value = mode === "untilProgramDay" ? props.untilProgramDay : props.days;
|
|
1551
|
+
const setValue = mode === "untilProgramDay" ? props.onUntilProgramDayChange : props.onDaysChange;
|
|
1552
|
+
const setMode = (next) => {
|
|
1553
|
+
props.onDaysChange(next === "days" ? 1 : null);
|
|
1554
|
+
props.onUntilProgramDayChange(next === "untilProgramDay" ? 1 : null);
|
|
1555
|
+
};
|
|
1533
1556
|
return /* @__PURE__ */ jsxs9("div", { "data-flow-nudges-days": "", className: "flex flex-col gap-1.5", children: [
|
|
1534
1557
|
/* @__PURE__ */ jsx9("span", { className: "text-sm font-medium text-[var(--foreground)]", children: labels.nudgesDays }),
|
|
1535
1558
|
/* @__PURE__ */ jsxs9("div", { className: "flex items-center gap-1.5", children: [
|
|
1536
|
-
|
|
1559
|
+
value !== null && mode !== "always" && /* @__PURE__ */ jsx9(
|
|
1537
1560
|
Input4,
|
|
1538
1561
|
{
|
|
1539
|
-
"aria-label": `${labels.nudgesDays}: ${labels.nudgesDaysModes
|
|
1562
|
+
"aria-label": `${labels.nudgesDays}: ${labels.nudgesDaysModes[mode]}`,
|
|
1540
1563
|
type: "number",
|
|
1541
1564
|
min: 1,
|
|
1542
1565
|
inputMode: "numeric",
|
|
1543
1566
|
className: "w-20",
|
|
1544
|
-
value
|
|
1545
|
-
onChange: (event) => Number(event.target.value) > 0 &&
|
|
1567
|
+
value,
|
|
1568
|
+
onChange: (event) => Number(event.target.value) > 0 && setValue(Number(event.target.value))
|
|
1546
1569
|
}
|
|
1547
1570
|
),
|
|
1548
|
-
/* @__PURE__ */ jsxs9(Select, { "aria-label": labels.nudgesDays, value:
|
|
1571
|
+
/* @__PURE__ */ jsxs9(Select, { "aria-label": labels.nudgesDays, value: mode, onChange: (event) => setMode(event.target.value), children: [
|
|
1549
1572
|
/* @__PURE__ */ jsx9("option", { value: "always", children: labels.nudgesDaysModes.always }),
|
|
1550
|
-
/* @__PURE__ */ jsx9("option", { value: "days", children: labels.nudgesDaysModes.days })
|
|
1573
|
+
/* @__PURE__ */ jsx9("option", { value: "days", children: labels.nudgesDaysModes.days }),
|
|
1574
|
+
/* @__PURE__ */ jsx9("option", { value: "untilProgramDay", children: labels.nudgesDaysModes.untilProgramDay })
|
|
1551
1575
|
] })
|
|
1552
1576
|
] }),
|
|
1553
|
-
|
|
1577
|
+
mode === "days" && /* @__PURE__ */ jsx9("span", { className: "text-xs text-[var(--foreground-muted)]", children: labels.nudgesDaysHint }),
|
|
1578
|
+
mode === "untilProgramDay" && /* @__PURE__ */ jsxs9("span", { className: "text-xs text-[var(--foreground-muted)]", children: [
|
|
1579
|
+
labels.nudgesUntilProgramDayHint,
|
|
1580
|
+
" ",
|
|
1581
|
+
labels.nudgesDaysHint
|
|
1582
|
+
] })
|
|
1554
1583
|
] });
|
|
1555
1584
|
}
|
|
1585
|
+
function CapsByDayInput({ caps, onChange }) {
|
|
1586
|
+
const [draft, setDraft] = useState5(null);
|
|
1587
|
+
const shown = draft ?? capsByDayText(caps);
|
|
1588
|
+
return /* @__PURE__ */ jsx9(
|
|
1589
|
+
Input4,
|
|
1590
|
+
{
|
|
1591
|
+
inputMode: "numeric",
|
|
1592
|
+
placeholder: "3, 2",
|
|
1593
|
+
value: shown,
|
|
1594
|
+
"aria-invalid": draft !== null && parseCapsByDay(draft) === null,
|
|
1595
|
+
onChange: (event) => {
|
|
1596
|
+
setDraft(event.target.value);
|
|
1597
|
+
const parsed = parseCapsByDay(event.target.value);
|
|
1598
|
+
if (parsed !== null) onChange(parsed);
|
|
1599
|
+
},
|
|
1600
|
+
onBlur: () => setDraft(null)
|
|
1601
|
+
}
|
|
1602
|
+
);
|
|
1603
|
+
}
|
|
1556
1604
|
|
|
1557
1605
|
// src/flows/flow-run-panel.tsx
|
|
1558
1606
|
import { Button as Button7, Input as Input5, cn as cn7 } from "@tandem/ui";
|
|
1559
1607
|
import { useFlowLabels as useFlowLabels9 } from "@ykurilov/agent-chat-flows/react";
|
|
1560
1608
|
import { ArrowRight, MessageCircleQuestion, RotateCcw as RotateCcw2, Undo2 as Undo22 } from "lucide-react";
|
|
1561
|
-
import { useEffect as useEffect3, useState as
|
|
1609
|
+
import { useEffect as useEffect3, useState as useState6 } from "react";
|
|
1562
1610
|
import { Fragment as Fragment3, jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
1563
1611
|
function KnownInput({ value, label, placeholder, onChange }) {
|
|
1564
|
-
const [draft, setDraft] =
|
|
1612
|
+
const [draft, setDraft] = useState6(value ?? "");
|
|
1565
1613
|
useEffect3(() => setDraft(value ?? ""), [value]);
|
|
1566
1614
|
return /* @__PURE__ */ jsx10(
|
|
1567
1615
|
Input5,
|
package/dist/flows/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/flows/flow-board-parts.tsx","../../src/flows/flow-parts.tsx","../../src/flows/flow-dialogs.tsx","../../src/flows/test-chat.tsx","../../src/flows/flow-exit-card.tsx","../../src/flows/flow-frame.tsx","../../src/flows/flow-header-menu.tsx","../../src/flows/flow-panels.tsx","../../src/flows/flow-days.tsx","../../src/flows/flow-run-panel.tsx","../../src/flows/migrate-dialog.tsx","../../src/flows/flow-editor-skin.ts"],"sourcesContent":["import { cn } from \"@tandem/ui\";\nimport type {\n FlowAnyStateNodeProps,\n FlowEdgeProps,\n FlowExitRowView,\n FlowBoardToggleProps,\n FlowLegendProps,\n FlowStateNodeProps,\n FlowZoomControlsProps,\n} from \"@ykurilov/agent-chat-flows/react\";\nimport { useFlowLabels } from \"@ykurilov/agent-chat-flows/react\";\nimport { CircleHelp, Clock, Flag, Map as MapIcon, Maximize, Minus, MoonStar, PanelRightClose, PanelRightOpen, Plus, Shuffle, Tag } from \"lucide-react\";\nimport type { KeyboardEvent, ReactNode } from \"react\";\nimport { IssueBadge, KIND_COLOR, KIND_DASH, KindIcon } from \"./flow-parts\";\n\n// Доска: узлы, стрелки, легенда, масштаб. Ручки и пути стрелок приходят от слоя поведения готовыми.\n\nconst activate = (handler: () => void) => (event: KeyboardEvent) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n handler();\n }\n};\n\nfunction ExitRow({ exit, index, handle }: { exit: FlowExitRowView; index: number; handle: ReactNode }) {\n const labels = useFlowLabels().editor;\n const broken = exit.issues.errors > 0;\n return (\n <li className=\"relative flex min-w-0 items-start gap-1.5 py-1 pl-3 pr-4 text-[11px] leading-snug\" data-exit={exit.exitId}>\n <span className=\"w-3 shrink-0 tabular-nums text-[var(--foreground-subtle)]\">{index + 1}</span>\n <KindIcon kind={exit.kind} className=\"mt-px size-3\" />\n <span className={cn(\"min-w-0 flex-1 break-words\", broken ? \"text-[var(--destructive-text)]\" : \"text-[var(--foreground)]\")}>\n {exit.text}\n {exit.target === null ? (\n <span className=\"ml-1 italic text-[var(--destructive-text)]\">· {labels.board.noTarget}</span>\n ) : exit.kind === \"return\" ? (\n <span className=\"ml-1 text-[var(--foreground-subtle)]\">↩ {labels.returnKind.toLocaleLowerCase()}</span>\n ) : null}\n </span>\n {handle}\n </li>\n );\n}\n\nfunction NodeCard({\n selected,\n dimmed,\n run,\n muted,\n onSelect,\n label,\n children,\n}: {\n selected: boolean;\n dimmed: boolean;\n run: FlowStateNodeProps[\"run\"];\n muted?: boolean;\n onSelect(): void;\n label: string;\n children: ReactNode;\n}) {\n return (\n <div\n role=\"button\"\n tabIndex={0}\n aria-label={label}\n aria-pressed={selected}\n data-run={run ?? undefined}\n onClick={onSelect}\n onKeyDown={activate(onSelect)}\n className={cn(\n \"relative w-[264px] rounded-[var(--radius-panel)] border bg-[var(--surface)] text-left shadow-[var(--shadow-sm)] outline-none transition-[opacity,box-shadow] duration-150\",\n muted && \"border-dashed bg-[var(--surface-muted)]\",\n selected ? \"border-[var(--action)] ring-2 ring-[var(--focus-ring)]\" : \"border-[var(--border)]\",\n run === \"current\" && \"border-[var(--warm)] ring-2 ring-[var(--warm-border)] shadow-[var(--shadow-warm)]\",\n run === \"visited\" && \"bg-[var(--cool-soft)]\",\n dimmed && \"opacity-35\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]\",\n )}\n >\n {children}\n </div>\n );\n}\n\nexport function TandemFlowStateNode(props: FlowStateNodeProps) {\n const labels = useFlowLabels().editor;\n return (\n <NodeCard selected={props.selected} dimmed={props.dimmed} run={props.run} onSelect={props.onSelect} label={props.title}>\n {props.renderInputHandle()}\n <div className=\"flex flex-col gap-1 px-3 pb-2 pt-2.5\">\n {(props.start || props.final || props.tags.length > 0) && (\n <div className=\"flex flex-wrap items-center gap-1\">\n {props.start && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-[var(--cool-soft)] px-1.5 py-px text-[10px] font-medium text-[var(--cool-text)]\">\n <Flag aria-hidden=\"true\" className=\"size-2.5\" />\n {labels.board.start}\n </span>\n )}\n {props.final && (\n <span className=\"rounded-full bg-[var(--surface-muted)] px-1.5 py-px text-[10px] font-medium text-[var(--foreground-muted)]\">{labels.board.final}</span>\n )}\n {props.tags.map((tag) => (\n <span key={tag} className=\"inline-flex items-center gap-1 rounded-full bg-[var(--warm-soft)] px-1.5 py-px text-[10px] text-[var(--warm-text)]\">\n <Tag aria-hidden=\"true\" className=\"size-2.5\" />\n {tag}\n </span>\n ))}\n </div>\n )}\n <p className=\"break-words text-[13px] font-semibold leading-tight text-[var(--foreground)]\">{props.title}</p>\n {props.goal && <p className=\"line-clamp-2 break-words text-[11px] leading-snug text-[var(--foreground-muted)]\">{props.goal}</p>}\n {props.timing && (\n <p data-flow-node-timing=\"\" className=\"inline-flex items-center gap-1 text-[10px] text-[var(--warm-text)]\">\n <Clock aria-hidden=\"true\" className=\"size-2.5 shrink-0\" />\n <span className=\"truncate\">{props.timing}</span>\n </p>\n )}\n {(props.noSideQuestions || props.issues.errors + props.issues.warnings > 0) && (\n <div className=\"flex flex-wrap items-center gap-2 text-[10px] text-[var(--foreground-subtle)]\">\n {props.noSideQuestions && (\n <span className=\"inline-flex items-center gap-1\">\n <MoonStar aria-hidden=\"true\" className=\"size-2.5\" />\n {labels.board.noSideQuestions}\n </span>\n )}\n <IssueBadge issues={props.issues} className=\"text-[10px]\" />\n </div>\n )}\n </div>\n {props.exits.length > 0 && (\n <ul className=\"border-t border-[var(--border)] py-1\">\n {props.exits.map((exit, index) => (\n <ExitRow key={exit.exitId} exit={exit} index={index} handle={props.renderExitHandle(exit.exitId)} />\n ))}\n </ul>\n )}\n </NodeCard>\n );\n}\n\nexport function TandemFlowAnyStateNode(props: FlowAnyStateNodeProps) {\n const labels = useFlowLabels().editor;\n return (\n <NodeCard selected={props.selected} dimmed={props.dimmed} run={null} muted onSelect={props.onSelect} label={labels.board.anyState}>\n <div className=\"flex flex-col gap-1 px-3 pb-2 pt-2.5\">\n <span className=\"inline-flex items-center gap-1 text-[10px] font-medium text-[var(--foreground-subtle)]\">\n <Shuffle aria-hidden=\"true\" className=\"size-2.5\" />\n {labels.anyStatePanel.title}\n </span>\n <p className=\"text-[13px] font-semibold leading-tight text-[var(--foreground)]\">{labels.board.anyState}</p>\n {props.except.length > 0 && (\n <p className=\"break-words text-[11px] leading-snug text-[var(--foreground-muted)]\">\n {labels.anyStatePanel.except}: {props.except.join(\", \")}\n </p>\n )}\n <IssueBadge issues={props.issues} className=\"text-[10px]\" />\n </div>\n {props.exits.length > 0 && (\n <ul className=\"border-t border-[var(--border)] py-1\">\n {props.exits.map((exit, index) => (\n <ExitRow key={exit.exitId} exit={exit} index={index} handle={props.renderExitHandle(exit.exitId)} />\n ))}\n </ul>\n )}\n </NodeCard>\n );\n}\n\n/** Стрелка: цвет и пунктир по виду; широкая невидимая линия ловит щелчок и касание. */\nexport function TandemFlowEdge(props: FlowEdgeProps) {\n const color = KIND_COLOR[props.kind];\n const width = props.selected ? 3 : props.traversed ? 2.75 : 1.6;\n return (\n <g data-edge={props.edgeId} data-kind={props.kind} data-traversed={props.traversed || undefined} style={{ opacity: props.dimmed ? 0.18 : 1 }}>\n <path d={props.path} fill=\"none\" stroke={color} strokeWidth={width} strokeDasharray={KIND_DASH[props.kind]} strokeLinecap=\"round\" />\n <path\n d={props.path}\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={18}\n style={{ pointerEvents: \"stroke\", cursor: \"pointer\" }}\n onClick={props.onSelect}\n >\n <title>{props.label}</title>\n </path>\n </g>\n );\n}\n\nexport function TandemFlowLegend({ kinds }: FlowLegendProps) {\n const labels = useFlowLabels().editor;\n return (\n <div className=\"w-[320px] rounded-[var(--radius-panel)] border border-[var(--border)] bg-[var(--surface)] p-3 text-xs shadow-[var(--shadow-sm)]\">\n <p className=\"mb-1.5 font-semibold text-[var(--foreground)]\">{labels.overview.exits}</p>\n <ul className=\"flex flex-col gap-1\">\n {kinds.map((kind) => (\n <li key={kind} className=\"flex items-center gap-2 text-[var(--foreground-muted)]\">\n <svg aria-hidden=\"true\" width=\"28\" height=\"6\" className=\"shrink-0\">\n <line x1=\"1\" y1=\"3\" x2=\"27\" y2=\"3\" stroke={KIND_COLOR[kind]} strokeWidth=\"2\" strokeDasharray={KIND_DASH[kind]} />\n </svg>\n {kind === \"return\" ? `${labels.returnKind} — ${labels.returnTarget}` : labels.conditionKindHints[kind]}\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\nexport function TandemFlowZoomControls({ zoom, onZoomIn, onZoomOut, onFit }: FlowZoomControlsProps) {\n const labels = useFlowLabels().editor;\n const button =\n \"inline-flex size-9 items-center justify-center rounded-[var(--radius-small)] text-[var(--foreground-muted)] hover:bg-[var(--surface-hover)] hover:text-[var(--foreground)]\";\n return (\n <div className=\"flex items-center gap-0.5 rounded-[var(--radius-control)] border border-[var(--border)] bg-[var(--surface)] p-1 shadow-[var(--shadow-sm)]\">\n <button type=\"button\" className={button} onClick={onZoomOut} aria-label={labels.board.zoomOut} title={labels.board.zoomOut}>\n <Minus aria-hidden=\"true\" className=\"size-4\" />\n </button>\n <span className=\"w-12 text-center text-xs tabular-nums text-[var(--foreground)]\">{Math.round(zoom * 100)}%</span>\n <button type=\"button\" className={button} onClick={onZoomIn} aria-label={labels.board.zoomIn} title={labels.board.zoomIn}>\n <Plus aria-hidden=\"true\" className=\"size-4\" />\n </button>\n <button type=\"button\" className={button} onClick={onFit} aria-label={labels.board.fit} title={labels.board.fit}>\n <Maximize aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </div>\n );\n}\n\n/** Кнопка места на доске: легенда, мини-карта, панель «Сценарий». */\nexport function TandemFlowBoardToggle({ kind, label, expanded, showText, onClick }: FlowBoardToggleProps) {\n const Icon = kind === \"legend\" ? CircleHelp : kind === \"minimap\" ? MapIcon : expanded ? PanelRightClose : PanelRightOpen;\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={label}\n title={label}\n aria-expanded={expanded}\n data-flow-board-toggle={kind}\n className={cn(\n \"inline-flex h-9 items-center justify-center gap-1.5 rounded-[var(--radius-control)] border border-[var(--border)] bg-[var(--surface)] text-xs text-[var(--foreground-muted)] shadow-[var(--shadow-sm)] hover:bg-[var(--surface-hover)] hover:text-[var(--foreground)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]\",\n showText ? \"px-3\" : \"w-9\",\n expanded && \"text-[var(--foreground)]\",\n )}\n >\n <Icon aria-hidden=\"true\" className=\"size-4\" />\n {showText && <span>{label}</span>}\n </button>\n );\n}\n","import { cn } from \"@tandem/ui\";\nimport type { FlowEdgeKind, FlowIssueCount } from \"@ykurilov/agent-chat-flows/react\";\nimport { useFlowLabels } from \"@ykurilov/agent-chat-flows/react\";\nimport { Clock, Database, MessageSquareText, Undo2, Zap, type LucideIcon } from \"lucide-react\";\nimport type { ReactNode, SelectHTMLAttributes } from \"react\";\n\n// Общие мелочи скина редактора: цвета и значки видов условий, подписи разделов, выпадающий список, счётчик ошибок.\n\n/** Цвет вида стрелки: словами — действие, данные — приглушённый, событие — успех, таймер — тёплый пунктиром. */\nexport const KIND_COLOR: Record<FlowEdgeKind, string> = {\n judge: \"var(--action)\",\n data: \"var(--foreground-subtle)\",\n event: \"var(--success)\",\n timer: \"var(--warm)\",\n return: \"var(--foreground-subtle)\",\n};\n\nexport const KIND_DASH: Record<FlowEdgeKind, string | undefined> = {\n judge: undefined,\n data: undefined,\n event: undefined,\n timer: \"6 5\",\n return: \"2 4\",\n};\n\nexport const KIND_ICON: Record<FlowEdgeKind, LucideIcon> = {\n judge: MessageSquareText,\n data: Database,\n event: Zap,\n timer: Clock,\n return: Undo2,\n};\n\nexport function KindIcon({ kind, className }: { kind: FlowEdgeKind; className?: string }) {\n const Icon = KIND_ICON[kind];\n return <Icon aria-hidden=\"true\" className={cn(\"size-3.5 shrink-0\", className)} style={{ color: KIND_COLOR[kind] }} />;\n}\n\nexport function SectionTitle({ children, className }: { children: ReactNode; className?: string }) {\n return <h3 className={cn(\"text-xs font-semibold uppercase tracking-wide text-[var(--foreground-subtle)]\", className)}>{children}</h3>;\n}\n\n/** Обычный `select` в оформлении полей Тандема. */\nexport function Select({ className, children, ...props }: SelectHTMLAttributes<HTMLSelectElement>) {\n return (\n <select\n {...props}\n className={cn(\n \"h-[var(--control-height-md)] w-full min-w-0 rounded-[var(--radius-control)] border border-[var(--border)] bg-[var(--surface)] px-3 text-sm text-[var(--foreground)] outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)] disabled:opacity-60\",\n className,\n )}\n >\n {children}\n </select>\n );\n}\n\n/** Подпись над полем ввода. */\nexport function Labeled({ label, hint, children, className }: { label: string; hint?: string; children: ReactNode; className?: string }) {\n return (\n <label className={cn(\"flex min-w-0 flex-col gap-1.5\", className)}>\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{label}</span>\n {children}\n {hint && <span className=\"text-xs text-[var(--foreground-muted)]\">{hint}</span>}\n </label>\n );\n}\n\n/** «Ошибок: 2 · Замечаний: 1» — красным и тёплым; ничего — ничего. */\nexport function IssueBadge({ issues, className }: { issues: FlowIssueCount; className?: string }) {\n const labels = useFlowLabels().editor;\n if (issues.errors === 0 && issues.warnings === 0) return null;\n return (\n <span className={cn(\"inline-flex items-center gap-1.5 text-xs font-medium\", className)}>\n {issues.errors > 0 && <span className=\"text-[var(--destructive-text)]\">{labels.board.errors(issues.errors)}</span>}\n {issues.warnings > 0 && <span className=\"text-[var(--warm-text)]\">{labels.board.warnings(issues.warnings)}</span>}\n </span>\n );\n}\n\n/** Значок-кнопка без подписи: подпись — в `aria-label` и подсказке. */\nexport function IconButton({\n label,\n onClick,\n disabled,\n children,\n className,\n tone = \"neutral\",\n}: {\n label: string;\n onClick(): void;\n disabled?: boolean;\n children: ReactNode;\n className?: string;\n tone?: \"neutral\" | \"danger\";\n}) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n disabled={disabled}\n onClick={onClick}\n className={cn(\n \"inline-flex size-8 shrink-0 items-center justify-center rounded-[var(--radius-small)] text-[var(--foreground-muted)] transition-colors hover:bg-[var(--surface-hover)] hover:text-[var(--foreground)] disabled:pointer-events-none disabled:opacity-35\",\n tone === \"danger\" && \"text-[var(--destructive-text)] hover:text-[var(--destructive-text)]\",\n className,\n )}\n >\n {children}\n </button>\n );\n}\n\n/** Панель справа: заголовок-надпись, заголовок, кнопки и содержимое с прокруткой. */\nexport function PanelShell({\n eyebrow,\n title,\n actions,\n children,\n label,\n}: {\n eyebrow: string;\n title: ReactNode;\n actions?: ReactNode;\n children: ReactNode;\n label: string;\n}) {\n return (\n <section aria-label={label} className=\"flex min-h-0 flex-1 flex-col\">\n <header className=\"flex items-start gap-2 px-5 pb-3 pt-5\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-[var(--foreground-subtle)]\">{eyebrow}</p>\n <h2 className=\"mt-1 break-words text-xl font-semibold text-[var(--foreground)]\">{title}</h2>\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-1\">{actions}</div>}\n </header>\n <div className=\"flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-5 pb-6\">{children}</div>\n </section>\n );\n}\n","import { Button, Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from \"@tandem/ui\";\nimport type { FlowJsonDialogProps } from \"@ykurilov/agent-chat-flows/react\";\nimport { useFlowLabels } from \"@ykurilov/agent-chat-flows/react\";\nimport { Check, Copy, Download, Upload } from \"lucide-react\";\nimport { useRef, useState } from \"react\";\n\n/** Окно JSON: показ, копия, скачивание и загрузка файла или вставленного текста с ошибками разбора. */\nexport function TandemFlowJsonDialog(props: FlowJsonDialogProps) {\n const labels = useFlowLabels().editor.jsonDialog;\n const [text, setText] = useState(props.json);\n const [copied, setCopied] = useState(false);\n const file = useRef<HTMLInputElement>(null);\n const edited = text !== props.json;\n\n return (\n <Dialog open onOpenChange={(open) => !open && props.onClose()}>\n <DialogContent className=\"flex max-h-[90vh] w-[min(760px,calc(100vw-24px))] max-w-none flex-col gap-3\">\n <DialogHeader>\n <DialogTitle>{labels.title}</DialogTitle>\n </DialogHeader>\n <textarea\n aria-label={labels.title}\n readOnly={props.readOnly}\n spellCheck={false}\n value={text}\n onChange={(event) => setText(event.target.value)}\n className=\"min-h-[320px] w-full flex-1 resize-none rounded-[var(--radius-nested)] border border-[var(--border)] bg-[var(--surface-muted)] p-3 font-mono text-xs leading-relaxed text-[var(--foreground)] outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]\"\n />\n {props.errors.length > 0 && (\n <ul role=\"alert\" className=\"max-h-32 overflow-y-auto rounded-[var(--radius-small)] bg-[color-mix(in_oklab,var(--destructive)_10%,transparent)] p-3 text-xs text-[var(--destructive-text)]\">\n {props.errors.map((error) => (\n <li key={error} className=\"break-words font-mono\">\n {error}\n </li>\n ))}\n </ul>\n )}\n <input\n ref={file}\n type=\"file\"\n accept=\"application/json,.json\"\n hidden\n onChange={async (event) => {\n const chosen = event.target.files?.[0];\n if (!chosen) return;\n const content = await chosen.text();\n setText(content);\n props.onLoad(content);\n event.target.value = \"\";\n }}\n />\n <DialogFooter className=\"flex-wrap gap-2\">\n <Button\n variant=\"secondary\"\n onClick={() => {\n props.onCopy();\n setCopied(true);\n }}\n >\n {copied ? <Check aria-hidden=\"true\" className=\"size-4\" /> : <Copy aria-hidden=\"true\" className=\"size-4\" />}\n {copied ? labels.copied : labels.copy}\n </Button>\n <Button variant=\"secondary\" onClick={props.onDownload}>\n <Download aria-hidden=\"true\" className=\"size-4\" />\n {labels.download}\n </Button>\n {!props.readOnly && (\n <Button variant={edited ? \"primary\" : \"secondary\"} onClick={() => (edited ? props.onLoad(text) : file.current?.click())}>\n <Upload aria-hidden=\"true\" className=\"size-4\" />\n {labels.load}\n </Button>\n )}\n <Button variant=\"ghost\" onClick={props.onClose}>\n {labels.close}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\n/** Рамка тестового чата живёт в `test-chat.tsx`. */\nexport { TandemFlowTestChatFrame } from \"./test-chat\";\n","import { Button, Input } from \"@tandem/ui\";\nimport type { FlowTestChatFrameProps } from \"@ykurilov/agent-chat-flows/react\";\nimport { useFlowLabels } from \"@ykurilov/agent-chat-flows/react\";\nimport { BellRing, Clock, RotateCcw, Sunrise, X } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { IconButton } from \"./flow-parts\";\n\n/** Поле «своё время»: «1 ч 30 мин» по Enter. Понял — перемотка и поле пустое; нет — подсказка, текст остаётся. */\nfunction CustomTimeField({ onAdvanceText, busy }: { onAdvanceText: (text: string) => boolean; busy: boolean }) {\n const labels = useFlowLabels().testChat;\n const [text, setText] = useState(\"\");\n const [invalid, setInvalid] = useState(false);\n return (\n <div className=\"w-full\">\n <Input\n aria-label={labels.customTime}\n aria-invalid={invalid}\n placeholder={labels.customTimePlaceholder}\n className=\"h-8 w-full text-sm\"\n disabled={busy}\n value={text}\n onChange={(event) => {\n setText(event.target.value);\n setInvalid(false);\n }}\n onKeyDown={(event) => {\n if (event.key !== \"Enter\" || !text.trim()) return;\n event.preventDefault();\n const understood = onAdvanceText(text);\n setInvalid(!understood);\n if (understood) setText(\"\");\n }}\n />\n {invalid && <p className=\"mt-1 text-xs text-[var(--destructive-text)]\">{labels.customTimeInvalid}</p>}\n </div>\n );\n}\n\n/** Тестовый чат в панели рядом с доской: где агент, часы чата с перемоткой и сам чат приложения. */\nexport function TandemFlowTestChatFrame(props: FlowTestChatFrameProps) {\n const labels = useFlowLabels().testChat;\n return (\n <section aria-label={labels.title} data-flow-test-chat=\"\" className=\"flex min-h-0 flex-1 flex-col\">\n <header className=\"flex items-start gap-2 border-b border-[var(--border)] px-5 pb-3 pt-4\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-[var(--foreground-subtle)]\">{labels.title}</p>\n <p className=\"mt-1 text-xs text-[var(--foreground-muted)]\">{labels.state}</p>\n <h2 data-flow-test-state=\"\" className=\"break-words text-lg font-semibold text-[var(--foreground)]\">\n {props.stateTitle}\n </h2>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n <IconButton label={labels.reset} onClick={props.onReset} disabled={props.busy}>\n <RotateCcw aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n <IconButton label={labels.close} onClick={props.onClose}>\n <X aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n </div>\n </header>\n <div className=\"flex flex-wrap items-center gap-1.5 border-b border-[var(--border)] px-5 py-2.5 text-sm\">\n <Clock aria-hidden=\"true\" className=\"size-4 text-[var(--foreground-subtle)]\" />\n <span className=\"text-[var(--foreground-muted)]\">{labels.clock}:</span>\n <span data-flow-test-clock=\"\" className=\"mr-auto font-medium tabular-nums text-[var(--foreground)]\">\n {props.clock}\n </span>\n {props.day && (\n <span data-flow-test-day=\"\" className=\"w-full text-xs font-medium text-[var(--warm-text)] sm:order-first sm:w-auto\">\n {props.day}\n </span>\n )}\n {props.advanceSteps.map((step) => (\n <Button key={step.ms} variant=\"secondary\" size=\"sm\" disabled={props.busy} onClick={() => props.onAdvance(step.ms)}>\n {labels.advance(step.label)}\n </Button>\n ))}\n {props.onNextDay && (\n <Button variant=\"secondary\" size=\"sm\" disabled={props.busy} onClick={props.onNextDay}>\n <Sunrise aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.nextDay}\n </Button>\n )}\n {props.onNextFirstMessage && (\n <Button variant=\"secondary\" size=\"sm\" disabled={props.busy} onClick={props.onNextFirstMessage}>\n <BellRing aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.nextFirstMessage}\n </Button>\n )}\n {props.onAdvanceText && <CustomTimeField onAdvanceText={props.onAdvanceText} busy={props.busy} />}\n </div>\n {props.nothingScheduled && (\n <p role=\"status\" className=\"mx-5 mt-2 rounded-[var(--radius-small)] bg-[var(--surface-muted)] px-3 py-2 text-xs text-[var(--foreground-muted)]\">\n {labels.nothingScheduled}\n </p>\n )}\n {props.failed && (\n <p role=\"alert\" className=\"mx-5 mt-2 rounded-[var(--radius-small)] bg-[color-mix(in_oklab,var(--destructive)_10%,transparent)] px-3 py-2 text-xs text-[var(--destructive-text)]\">\n {labels.failed}\n </p>\n )}\n <div className=\"flex min-h-0 flex-1 flex-col overflow-hidden\">{props.children}</div>\n </section>\n );\n}\n","import { Input, Textarea, cn } from \"@tandem/ui\";\nimport type { FlowCondition, FlowConditionType } from \"@ykurilov/agent-chat-flows/format\";\nimport type { FlowExitCardProps } from \"@ykurilov/agent-chat-flows/react\";\nimport { useFlowLabels } from \"@ykurilov/agent-chat-flows/react\";\nimport { ChevronDown, ChevronUp, Trash2 } from \"lucide-react\";\nimport { IconButton, KindIcon, Labeled, Select } from \"./flow-parts\";\n\nconst KINDS: FlowConditionType[] = [\"judge\", \"data\", \"event\", \"timer\"];\nconst EVENTS = [\"message\", \"button\", \"tool\", \"app\"] as const;\nconst SPANS = [\"in_state\", \"silence\", \"since_start\", \"time_of_day\"] as const;\nconst UNITS = [\"min\", \"h\", \"d\"] as const;\n\n/**\n * Карточка условия: вид (словами, данные, событие, таймер), его настройки и «куда». Меняется одно поле — годным\n * условие делает слой поведения (`normalizeCondition`): при смене вида достаточно передать `{ type }`.\n */\nexport function TandemFlowExitCard(props: FlowExitCardProps) {\n const labels = useFlowLabels().editor;\n const { when } = props;\n const change = (next: FlowCondition) => props.onChange({ when: next, to: props.to });\n const errors = props.issues.filter((issue) => issue.level === \"error\");\n const index = props.exitId;\n\n return (\n <article\n aria-label={labels.exitCard.when}\n data-exit-card={index}\n className={cn(\n \"flex min-w-0 flex-col gap-3 rounded-[var(--radius-nested)] border bg-[var(--surface)] p-3\",\n errors.length > 0 ? \"border-[var(--destructive)]\" : \"border-[var(--border)]\",\n )}\n >\n <div className=\"flex items-center gap-1\">\n <div role=\"radiogroup\" aria-label={labels.exitCard.when} className=\"flex min-w-0 flex-1 flex-wrap gap-0.5 rounded-[var(--radius-control)] bg-[var(--surface-muted)] p-0.5\">\n {KINDS.map((kind) => (\n <button\n key={kind}\n type=\"button\"\n role=\"radio\"\n aria-checked={when.type === kind}\n onClick={() => when.type !== kind && change({ type: kind } as FlowCondition)}\n className={cn(\n \"inline-flex min-h-8 flex-1 items-center justify-center gap-1 rounded-[calc(var(--radius-control)-2px)] px-2 text-xs font-medium\",\n when.type === kind ? \"bg-[var(--surface)] text-[var(--foreground)] shadow-[var(--shadow-xs)]\" : \"text-[var(--foreground-muted)]\",\n )}\n >\n <KindIcon kind={kind} />\n {labels.conditionKinds[kind]}\n </button>\n ))}\n </div>\n <IconButton label={labels.exitCard.moveUp} onClick={props.onMoveUp} disabled={!props.canMoveUp}>\n <ChevronUp aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n <IconButton label={labels.exitCard.moveDown} onClick={props.onMoveDown} disabled={!props.canMoveDown}>\n <ChevronDown aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n <IconButton label={labels.exitCard.delete} onClick={props.onDelete} tone=\"danger\">\n <Trash2 aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n </div>\n\n {when.type === \"judge\" && (\n <Textarea\n aria-label={labels.exitCard.when}\n rows={2}\n value={when.text}\n placeholder={labels.board.emptyCondition}\n onChange={(event) => change({ ...when, text: event.target.value })}\n />\n )}\n\n {when.type === \"data\" && <DataSettings {...props} when={when} change={change} />}\n\n {when.type === \"event\" && (\n <div className=\"grid grid-cols-2 gap-2\">\n <Labeled label={labels.exitCard.event}>\n <Select value={when.event} onChange={(event) => change({ type: \"event\", event: event.target.value as (typeof EVENTS)[number] })}>\n {EVENTS.map((event) => (\n <option key={event} value={event}>\n {labels.events[event]}\n </option>\n ))}\n </Select>\n </Labeled>\n {when.event !== \"message\" && (\n <Labeled label={labels.exitCard.eventName}>\n <Select value={when.name ?? \"\"} onChange={(event) => change({ ...when, name: event.target.value })}>\n <option value=\"\" />\n {[...new Set([...props.eventNames[when.event], ...(when.name ? [when.name] : [])])].map((name) => (\n <option key={name} value={name}>\n {(when.event !== \"tool\" && props.eventLabels?.[name]) || name}\n </option>\n ))}\n </Select>\n </Labeled>\n )}\n </div>\n )}\n\n {when.type === \"timer\" && (\n <div className=\"grid grid-cols-2 gap-2\">\n <Labeled label={labels.exitCard.timer} className=\"col-span-2\">\n <Select value={when.from} onChange={(event) => change({ ...when, from: event.target.value } as FlowCondition)}>\n {SPANS.map((span) => (\n <option key={span} value={span}>\n {labels.timerSpans[span]}\n </option>\n ))}\n <option value=\"state_days\">{`${labels.statePanel.duration}, ${labels.statePanel.durationUnits.d}`}</option>\n <option value=\"program_day\">{`${labels.statePanel.duration}, ${labels.statePanel.durationUnits.program_day}`}</option>\n </Select>\n </Labeled>\n {when.from === \"time_of_day\" ? (\n <Labeled label={labels.exitCard.at}>\n <Input type=\"time\" value={when.at} onChange={(event) => event.target.value && change({ ...when, at: event.target.value })} />\n </Labeled>\n ) : when.from === \"state_days\" || when.from === \"program_day\" ? (\n <Labeled label={labels.exitCard.amount}>\n <Input\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n value={when.from === \"state_days\" ? when.days : when.day}\n onChange={(event) => {\n const days = Number(event.target.value);\n if (Number.isInteger(days) && days > 0) change(when.from === \"state_days\" ? { ...when, days } : { ...when, day: days });\n }}\n />\n </Labeled>\n ) : (\n <>\n <Labeled label={labels.exitCard.amount}>\n <Input\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n value={when.amount}\n onChange={(event) => {\n const amount = Number(event.target.value);\n if (amount > 0) change({ ...when, amount });\n }}\n />\n </Labeled>\n <Labeled label={\"\\u00a0\"}>\n <Select aria-label={labels.exitCard.amount} value={when.unit} onChange={(event) => change({ ...when, unit: event.target.value as (typeof UNITS)[number] })}>\n {UNITS.map((unit) => (\n <option key={unit} value={unit}>\n {labels.units[unit]}\n </option>\n ))}\n </Select>\n </Labeled>\n </>\n )}\n </div>\n )}\n\n <Labeled label={labels.exitCard.to}>\n <Select value={props.to ?? \"\"} onChange={(event) => props.onChange({ when, to: event.target.value || null })} aria-invalid={props.to === null || undefined}>\n <option value=\"\">{labels.board.noTarget}</option>\n {props.targets.map((target) => (\n <option key={target.value} value={target.value}>\n {target.title}\n </option>\n ))}\n </Select>\n </Labeled>\n\n {props.issues.length > 0 && (\n <ul className=\"flex flex-col gap-1\">\n {props.issues.map((issue) => (\n <li\n key={`${issue.code}-${issue.message}`}\n role={issue.level === \"error\" ? \"alert\" : undefined}\n className={cn(\"break-words text-xs\", issue.level === \"error\" ? \"text-[var(--destructive-text)]\" : \"text-[var(--warm-text)]\")}\n >\n {issue.message}\n </li>\n ))}\n </ul>\n )}\n </article>\n );\n}\n\nfunction DataSettings(props: FlowExitCardProps & { when: Extract<FlowCondition, { type: \"data\" }>; change(next: FlowCondition): void }) {\n const labels = useFlowLabels().editor;\n const { when, change } = props;\n const field = props.fields.find((candidate) => candidate.id === when.field);\n return (\n <div className=\"grid grid-cols-2 gap-2\">\n <Labeled label={labels.exitCard.field} className=\"col-span-2\">\n <Select value={when.field} onChange={(event) => change({ ...when, field: event.target.value })}>\n {!field && <option value={when.field}>{when.field}</option>}\n {props.fields.map((candidate) => (\n <option key={candidate.id} value={candidate.id}>\n {candidate.name || candidate.id}\n </option>\n ))}\n </Select>\n </Labeled>\n <Labeled label={labels.exitCard.op} className={when.op === \"filled\" ? \"col-span-2\" : undefined}>\n <Select value={when.op} onChange={(event) => change({ ...when, op: event.target.value as typeof when.op })}>\n {props.ops.map((op) => (\n <option key={op} value={op}>\n {labels.ops[op]}\n </option>\n ))}\n </Select>\n </Labeled>\n {when.op !== \"filled\" &&\n (field?.type === \"boolean\" ? (\n <Labeled label={labels.exitCard.value}>\n <Select value={when.value === false ? \"false\" : \"true\"} onChange={(event) => change({ ...when, value: event.target.value === \"true\" })}>\n <option value=\"true\">{labels.yes}</option>\n <option value=\"false\">{labels.no}</option>\n </Select>\n </Labeled>\n ) : field?.type === \"choice\" && field.options.length > 0 ? (\n <Labeled label={labels.exitCard.value}>\n <Select value={String(when.value ?? \"\")} onChange={(event) => change({ ...when, value: event.target.value })}>\n <option value=\"\" />\n {field.options.map((option) => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </Select>\n </Labeled>\n ) : (\n <Labeled label={labels.exitCard.value}>\n <Input\n value={String(when.value ?? \"\")}\n inputMode={field?.type === \"number\" ? \"decimal\" : undefined}\n onChange={(event) => change({ ...when, value: event.target.value })}\n />\n </Labeled>\n ))}\n </div>\n );\n}\n","import { Badge, Button, TandemMark, cn } from \"@tandem/ui\";\nimport type { FlowEditorFrameProps, FlowHeaderProps } from \"@ykurilov/agent-chat-flows/react\";\nimport { useFlowLabels } from \"@ykurilov/agent-chat-flows/react\";\nimport { Braces, Eye, IdCard, Maximize2, MessagesSquare, Minimize2, Play, Plus, Save, ShieldCheck, Shuffle } from \"lucide-react\";\nimport type { CSSProperties } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { FlowHeaderMenu, type FlowHeaderMenuItem } from \"./flow-header-menu\";\n\n/** Цвета доски для стилей `@xyflow/react` слоя поведения: из токенов Тандема, светлая и тёмная тема сами. */\nconst BOARD_COLORS = {\n \"--flow-board-dots\": \"color-mix(in oklab, var(--foreground-subtle) 45%, transparent)\",\n \"--flow-board-handle\": \"var(--action)\",\n \"--flow-board-handle-fill\": \"var(--surface)\",\n \"--flow-board-connection\": \"var(--action)\",\n \"--flow-board-minimap\": \"var(--surface)\",\n \"--flow-board-minimap-mask\": \"color-mix(in oklab, var(--action) 10%, transparent)\",\n \"--flow-board-minimap-node\": \"var(--border-strong)\",\n} as CSSProperties;\n\n/**\n * Раскладка: шапка 64px, доска и панель 400px справа; на узком экране панель уходит вниз.\n * Высота — родителя, но не меньше разумной: у родителя без высоты и на телефоне холст не схлопывается. Свои `className`\n * и `style` приложения идут последними и перебивают это (`min-h-0`, `style={{ height: 720 }}`).\n */\nexport function TandemFlowEditorFrame({ header, board, panel, dialog, className, style, compact }: FlowEditorFrameProps) {\n const withPanel = panel !== null;\n return (\n <div\n data-flow-editor=\"\"\n data-flow-compact={compact ? \"\" : undefined}\n className={cn(\n \"grid h-full min-h-[max(420px,60vh)] w-full bg-[var(--canvas)] text-[var(--foreground)] max-[860px]:min-h-[max(640px,100svh)] max-[860px]:grid-cols-1\",\n withPanel ? \"grid-cols-[minmax(0,1fr)_400px]\" : \"grid-cols-[minmax(0,1fr)]\",\n compact ? \"grid-rows-[48px_minmax(0,1fr)]\" : \"grid-rows-[64px_minmax(0,1fr)]\",\n withPanel ? \"max-[860px]:grid-rows-[auto_minmax(0,1fr)_46vh]\" : \"max-[860px]:grid-rows-[auto_minmax(0,1fr)]\",\n className,\n )}\n style={{ ...BOARD_COLORS, ...style }}\n >\n <div className=\"col-span-full min-w-0 border-b border-[var(--border)] bg-[var(--surface)]\">{header}</div>\n <div className=\"relative min-h-0 min-w-0\" data-flow-board=\"\">\n {board}\n </div>\n {panel !== null && (\n <aside className=\"flex min-h-0 min-w-0 flex-col border-l border-[var(--border)] bg-[var(--surface)] max-[860px]:border-l-0 max-[860px]:border-t\">\n {panel}\n </aside>\n )}\n {dialog}\n </div>\n );\n}\n\n/** Название сценария: правится по месту, сохраняется по уходу с поля или Enter. */\nfunction FlowName({ name, onRename, readOnly }: Pick<FlowHeaderProps, \"name\" | \"onRename\" | \"readOnly\">) {\n const [draft, setDraft] = useState(name);\n useEffect(() => setDraft(name), [name]);\n const commit = () => {\n const next = draft.trim();\n if (next && next !== name) onRename(next);\n else setDraft(name);\n };\n return (\n <input\n aria-label={name}\n readOnly={readOnly}\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n onBlur={commit}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") event.currentTarget.blur();\n }}\n className=\"min-w-0 flex-1 truncate rounded-[var(--radius-small)] bg-transparent px-1.5 py-1 text-base font-semibold text-[var(--foreground)] outline-none hover:bg-[var(--surface-hover)] focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]\"\n />\n );\n}\n\nexport function TandemFlowHeader(props: FlowHeaderProps) {\n const { editor: labels, testChat: testChatLabels } = useFlowLabels();\n const { mode, onModeChange, issues, compact: narrow } = props;\n const toggle = (target: \"check\" | \"run\") => onModeChange(mode === target ? \"edit\" : target);\n const compact = \"max-[1100px]:[&>span.label]:hidden\";\n // На телефоне подписи прячутся у всех кнопок, иначе «Сохранить» уезжает за край.\n const phone = \"max-[860px]:[&>span.label]:hidden\";\n // На узком экране второстепенные кнопки уходят в меню «⋯»; Проверить, Прогон и состояние сохранения остаются на виду.\n const wide = \"max-[860px]:hidden\";\n const fullscreenLabel = props.fullscreen?.active ? labels.board.space.exitFullscreen : labels.board.space.enterFullscreen;\n const menuItems: FlowHeaderMenuItem[] = [\n { key: \"state\", label: labels.header.state, icon: <Plus />, disabled: mode === \"run\" || props.readOnly === true, onSelect: props.onAddState },\n { key: \"card\", label: labels.header.card, icon: <IdCard />, disabled: mode === \"run\", onSelect: props.onOpenCard },\n { key: \"json\", label: labels.header.json, icon: <Braces />, onSelect: props.onOpenJson },\n ...(props.onOpenMigrate ? [{ key: \"migrate\", label: labels.header.migrate, icon: <Shuffle />, onSelect: props.onOpenMigrate }] : []),\n ...(props.onOpenTestChat ? [{ key: \"test-chat\", label: testChatLabels.title, icon: <MessagesSquare />, onSelect: props.onOpenTestChat }] : []),\n ...(props.fullscreen\n ? [{ key: \"fullscreen\", label: fullscreenLabel, icon: props.fullscreen.active ? <Minimize2 /> : <Maximize2 />, pressed: props.fullscreen.active, onSelect: props.fullscreen.onToggle }]\n : []),\n ];\n return (\n <div className=\"flex h-full min-w-0 items-center gap-2 px-4 max-[860px]:flex-wrap max-[860px]:gap-1.5 max-[860px]:py-2\">\n {!narrow && <TandemMark className=\"size-7 shrink-0\" />}\n {!narrow && <FlowName name={props.name} onRename={props.onRename} readOnly={props.readOnly} />}\n {props.readOnly && (\n <Badge variant=\"warm\" className=\"shrink-0\" title={labels.header.readOnlyHint} data-flow-read-only-badge=\"\">\n <Eye aria-hidden=\"true\" className=\"mr-1 size-3.5\" />\n {labels.header.readOnly}\n </Badge>\n )}\n <div className=\"relative flex shrink-0 items-center gap-1.5 max-[860px]:w-full max-[860px]:gap-1\">\n <Button variant=\"secondary\" size=\"sm\" className={cn(compact, wide)} onClick={props.onAddState} disabled={mode === \"run\" || props.readOnly} title={labels.header.state}>\n <Plus aria-hidden=\"true\" className=\"size-4\" />\n <span className=\"label\">{labels.header.state}</span>\n </Button>\n <Button variant=\"secondary\" size=\"sm\" className={cn(compact, wide)} onClick={props.onOpenCard} disabled={mode === \"run\"} title={labels.header.card}>\n <IdCard aria-hidden=\"true\" className=\"size-4\" />\n <span className=\"label\">{labels.header.card}</span>\n </Button>\n <Button\n variant={mode === \"check\" ? \"primary\" : \"secondary\"}\n size=\"sm\"\n className={compact}\n aria-pressed={mode === \"check\"}\n onClick={() => toggle(\"check\")}\n title={labels.header.check}\n >\n <ShieldCheck aria-hidden=\"true\" className=\"size-4\" />\n <span className=\"label\">{labels.header.check}</span>\n {issues.errors > 0 && (\n <Badge variant=\"warm\" className=\"ml-0.5 px-1.5 py-0 text-[11px]\" aria-label={labels.board.errors(issues.errors)}>\n {issues.errors}\n </Badge>\n )}\n </Button>\n <Button\n variant={mode === \"run\" ? \"secondary\" : \"warm\"}\n size=\"sm\"\n className={cn(compact, mode === \"run\" && \"ring-2 ring-[var(--warm-border)]\")}\n aria-pressed={mode === \"run\"}\n onClick={() => toggle(\"run\")}\n title={labels.header.run}\n >\n <Play aria-hidden=\"true\" className=\"size-4\" />\n <span className=\"label\">{labels.header.run}</span>\n </Button>\n <Button variant=\"ghost\" size=\"sm\" className={wide} onClick={props.onOpenJson} title={labels.header.json} aria-label={labels.header.json}>\n <Braces aria-hidden=\"true\" className=\"size-4\" />\n </Button>\n {props.onOpenMigrate && (\n <Button variant=\"ghost\" size=\"sm\" className={wide} onClick={props.onOpenMigrate} title={labels.header.migrate} aria-label={labels.header.migrate}>\n <Shuffle aria-hidden=\"true\" className=\"size-4\" />\n </Button>\n )}\n {props.fullscreen && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={wide}\n data-flow-fullscreen-toggle=\"\"\n aria-pressed={props.fullscreen.active}\n onClick={props.fullscreen.onToggle}\n title={props.fullscreen.active ? labels.board.space.exitFullscreen : labels.board.space.enterFullscreen}\n aria-label={props.fullscreen.active ? labels.board.space.exitFullscreen : labels.board.space.enterFullscreen}\n >\n {props.fullscreen.active ? <Minimize2 aria-hidden=\"true\" className=\"size-4\" /> : <Maximize2 aria-hidden=\"true\" className=\"size-4\" />}\n </Button>\n )}\n {props.onOpenTestChat && (\n <Button variant=\"ghost\" size=\"sm\" className={wide} onClick={props.onOpenTestChat} title={testChatLabels.title}>\n <MessagesSquare aria-hidden=\"true\" className=\"size-4\" />\n <span className=\"label\">{testChatLabels.title}</span>\n </Button>\n )}\n <FlowHeaderMenu label={labels.header.more} items={menuItems} className=\"hidden max-[860px]:block\" />\n {props.onSave && (\n <Button\n variant={props.saveFailed ? \"secondary\" : props.dirty ? \"primary\" : \"ghost\"}\n size=\"sm\"\n className={cn(phone, props.saveFailed && \"border-[var(--destructive)] text-[var(--destructive-text)]\")}\n loading={props.saving}\n disabled={props.saving || !props.dirty}\n onClick={props.onSave}\n title={props.saveFailed ? labels.header.saveFailedHint : props.dirty ? labels.header.unsaved : labels.header.saved}\n data-save-failed={props.saveFailed ? \"\" : undefined}\n >\n <Save aria-hidden=\"true\" className=\"size-4\" />\n <span className=\"label\">{props.saveFailed ? labels.header.saveFailed : props.dirty ? labels.header.save : labels.header.saved}</span>\n </Button>\n )}\n </div>\n </div>\n );\n}\n","import { Button } from \"@tandem/ui\";\nimport { Ellipsis } from \"lucide-react\";\nimport { useEffect, useRef, useState, type KeyboardEvent, type ReactNode } from \"react\";\n\nexport interface FlowHeaderMenuItem {\n key: string;\n label: string;\n icon: ReactNode;\n disabled?: boolean;\n /** Выбранный пункт-переключатель (полный экран). */\n pressed?: boolean;\n onSelect(): void;\n}\n\n/**\n * Меню «⋯» шапки на узком экране: сюда уходят кнопки, которым не хватило места. Кнопка и список доступны с клавиатуры:\n * Enter, пробел и стрелка вниз открывают; стрелки, Home и End ходят по пунктам; Esc закрывает и возвращает фокус на кнопку;\n * Tab и клик в сторону закрывают.\n */\nexport function FlowHeaderMenu({ label, items, className }: { label: string; items: FlowHeaderMenuItem[]; className?: string }) {\n const [open, setOpen] = useState(false);\n const root = useRef<HTMLDivElement>(null);\n\n const entries = () => [...(root.current?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]:not([disabled])') ?? [])];\n const close = (refocus: boolean) => {\n setOpen(false);\n if (refocus) root.current?.querySelector<HTMLElement>('[aria-haspopup=\"menu\"]')?.focus();\n };\n\n useEffect(() => {\n if (!open) return;\n entries()[0]?.focus();\n const away = (event: Event) => {\n if (!root.current?.contains(event.target as Node)) setOpen(false);\n };\n document.addEventListener(\"pointerdown\", away);\n return () => document.removeEventListener(\"pointerdown\", away);\n }, [open]);\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && open) {\n // Esc закрывает только меню, а не полный экран под ним.\n event.preventDefault();\n event.nativeEvent.stopImmediatePropagation();\n close(true);\n return;\n }\n if (!open) return;\n const list = entries();\n const at = list.indexOf(document.activeElement as HTMLElement);\n const go = (index: number) => {\n event.preventDefault();\n list[(index + list.length) % list.length]?.focus();\n };\n if (event.key === \"ArrowDown\") go(at + 1);\n else if (event.key === \"ArrowUp\") go(at < 0 ? -1 : at - 1);\n else if (event.key === \"Home\") go(0);\n else if (event.key === \"End\") go(-1);\n else if (event.key === \"Tab\") close(false);\n };\n\n return (\n <div ref={root} className={className} onKeyDown={onKeyDown} data-flow-header-menu=\"\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={label}\n title={label}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={() => setOpen(!open)}\n onKeyDown={(event) => {\n if (event.key === \"ArrowDown\" && !open) {\n event.preventDefault();\n setOpen(true);\n }\n }}\n >\n <Ellipsis aria-hidden=\"true\" className=\"size-4\" />\n </Button>\n {open && (\n <div\n role=\"menu\"\n aria-label={label}\n className=\"absolute right-0 top-full z-50 mt-1 flex min-w-[220px] flex-col rounded-[var(--radius-panel)] border border-[var(--border)] bg-[var(--surface)] p-1 shadow-[var(--shadow-md,var(--shadow-sm))]\"\n >\n {items.map((item) => (\n <button\n key={item.key}\n type=\"button\"\n role=\"menuitem\"\n disabled={item.disabled}\n data-pressed={item.pressed ? \"\" : undefined}\n onClick={() => {\n close(true);\n item.onSelect();\n }}\n className=\"flex h-10 items-center gap-2 rounded-[var(--radius-small)] px-3 text-left text-sm text-[var(--foreground)] hover:bg-[var(--surface-hover)] focus-visible:bg-[var(--surface-hover)] focus-visible:outline-none disabled:opacity-45 data-[pressed]:font-semibold\"\n >\n <span aria-hidden=\"true\" className=\"shrink-0 [&_svg]:size-4\">\n {item.icon}\n </span>\n {item.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { Badge, Button, Input, Switch, Textarea, cn } from \"@tandem/ui\";\nimport type { FlowConditionType } from \"@ykurilov/agent-chat-flows/format\";\nimport type {\n FlowAnyStatePanelProps,\n FlowCardPanelProps,\n FlowCheckPanelProps,\n FlowFieldRowProps,\n FlowOverviewPanelProps,\n FlowStateLinkView,\n FlowStatePanelProps,\n} from \"@ykurilov/agent-chat-flows/react\";\nimport { useFlowLabels } from \"@ykurilov/agent-chat-flows/react\";\nimport { ChevronDown, ChevronUp, CircleAlert, Flag, Plus, Trash2, TriangleAlert } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { IconButton, IssueBadge, KindIcon, Labeled, PanelShell, SectionTitle, Select } from \"./flow-parts\";\n\nconst KINDS: FlowConditionType[] = [\"judge\", \"data\", \"event\", \"timer\"];\nconst FIELD_TYPES = [\"text\", \"number\", \"choice\", \"boolean\"] as const;\n\nconst splitList = (text: string) =>\n text\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n\n/** Отмечаемые «чипы»: «узнать здесь», инструменты, исключения общих переходов. */\nfunction ChipToggles({ items, selected, onChange }: { items: Array<{ id: string; title: string }>; selected: string[]; onChange(ids: string[]): void }) {\n return (\n <div className=\"flex flex-wrap gap-1.5\">\n {items.map((item) => {\n const on = selected.includes(item.id);\n return (\n <button\n key={item.id}\n type=\"button\"\n aria-pressed={on}\n onClick={() => onChange(on ? selected.filter((id) => id !== item.id) : [...selected, item.id])}\n className={cn(\n \"min-h-8 rounded-full border px-3 text-xs font-medium transition-colors\",\n on\n ? \"border-[var(--action)] bg-[var(--cool-soft)] text-[var(--cool-text)]\"\n : \"border-[var(--border)] bg-[var(--surface)] text-[var(--foreground-muted)] hover:bg-[var(--surface-hover)]\",\n )}\n >\n {item.title}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction StateLinks({ states }: { states: FlowStateLinkView[] }) {\n const labels = useFlowLabels().editor;\n return (\n <ul className=\"flex flex-col gap-1\">\n {states.map((state) => (\n <li key={state.stateId}>\n <button\n type=\"button\"\n onClick={state.onSelect}\n className=\"flex min-h-9 w-full items-center gap-2 rounded-[var(--radius-small)] px-2 text-left text-sm text-[var(--foreground)] hover:bg-[var(--surface-hover)]\"\n >\n <span className=\"min-w-0 flex-1 truncate\">{state.title}</span>\n {state.start && <Flag aria-label={labels.board.start} className=\"size-3.5 text-[var(--cool-text)]\" />}\n {state.final && <span className=\"text-xs text-[var(--foreground-subtle)]\">{labels.board.final}</span>}\n </button>\n </li>\n ))}\n </ul>\n );\n}\n\nfunction AddExitButtons({ onAddExit }: { onAddExit(kind: FlowConditionType): void }) {\n const labels = useFlowLabels().editor;\n return (\n <div className=\"flex flex-col gap-2\">\n <span className=\"text-xs font-medium text-[var(--foreground-muted)]\">{labels.statePanel.addExit}</span>\n <div className=\"grid grid-cols-2 gap-1.5\">\n {KINDS.map((kind) => (\n <Button key={kind} variant=\"secondary\" size=\"sm\" onClick={() => onAddExit(kind)} className=\"justify-start\">\n <Plus aria-hidden=\"true\" className=\"size-3.5\" />\n <KindIcon kind={kind} />\n {labels.conditionKinds[kind]}\n </Button>\n ))}\n </div>\n </div>\n );\n}\n\nexport function IssueList({ issues }: { issues: Array<{ level: \"error\" | \"warning\"; message: string; code: string }> }) {\n if (issues.length === 0) return null;\n return (\n <ul className=\"flex flex-col gap-1.5\">\n {issues.map((issue) => (\n <li\n key={`${issue.code}-${issue.message}`}\n role={issue.level === \"error\" ? \"alert\" : undefined}\n className={cn(\n \"rounded-[var(--radius-small)] px-3 py-2 text-xs\",\n issue.level === \"error\" ? \"bg-[color-mix(in_oklab,var(--destructive)_10%,transparent)] text-[var(--destructive-text)]\" : \"bg-[var(--warm-soft)] text-[var(--warm-text)]\",\n )}\n >\n {issue.message}\n </li>\n ))}\n </ul>\n );\n}\n\nexport function TandemFlowOverviewPanel(props: FlowOverviewPanelProps) {\n const labels = useFlowLabels().editor;\n const count = (label: string, value: number) => (\n <div className=\"flex flex-col rounded-[var(--radius-nested)] bg-[var(--surface-muted)] px-3 py-2\">\n <span className=\"text-lg font-semibold tabular-nums text-[var(--foreground)]\">{value}</span>\n <span className=\"text-xs text-[var(--foreground-muted)]\">{label}</span>\n </div>\n );\n return (\n <PanelShell eyebrow={labels.overview.title} title={props.name} label={labels.overview.title} actions={<IssueBadge issues={props.issues} />}>\n <Labeled label={labels.overview.common} hint={labels.overview.commonHint}>\n <Textarea rows={6} value={props.common} onChange={(event) => props.onCommonChange(event.target.value)} />\n </Labeled>\n <div className=\"grid grid-cols-3 gap-2\">\n {count(labels.overview.states, props.counts.states)}\n {count(labels.overview.exits, props.counts.exits)}\n {count(labels.overview.finals, props.counts.finals)}\n </div>\n <div className=\"flex flex-col gap-2\">\n <SectionTitle>{labels.overview.lists}</SectionTitle>\n <StateLinks states={props.states} />\n </div>\n {props.sections}\n </PanelShell>\n );\n}\n\nexport function TandemFlowStatePanel(props: FlowStatePanelProps) {\n const labels = useFlowLabels().editor;\n const { onChange } = props;\n return (\n <PanelShell\n eyebrow={labels.statePanel.title}\n title={props.title || props.stateId}\n label={labels.statePanel.title}\n actions={\n <IconButton label={labels.statePanel.deleteState} onClick={props.onDelete} tone=\"danger\">\n <Trash2 aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n }\n >\n <IssueList issues={props.issues} />\n <Labeled label={labels.statePanel.name}>\n <Input value={props.title} onChange={(event) => onChange({ title: event.target.value })} />\n </Labeled>\n <Labeled label={labels.statePanel.instructions} hint={labels.statePanel.instructionsHint}>\n <Textarea rows={6} value={props.instructions} onChange={(event) => onChange({ instructions: event.target.value })} />\n </Labeled>\n {props.fields.length > 0 && (\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{labels.statePanel.learn}</span>\n <ChipToggles\n items={props.fields.map((field) => ({ id: field.id, title: field.name || field.id }))}\n selected={props.learn}\n onChange={(learn) => onChange({ learn })}\n />\n </div>\n )}\n <div className=\"flex items-center justify-between gap-3\">\n {props.start ? (\n <Badge variant=\"cool\" className=\"gap-1\">\n <Flag aria-hidden=\"true\" className=\"size-3\" />\n {labels.statePanel.isStart}\n </Badge>\n ) : (\n <Button variant=\"secondary\" size=\"sm\" onClick={props.onMakeStart}>\n <Flag aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.statePanel.makeStart}\n </Button>\n )}\n </div>\n\n {props.timing}\n\n <section className=\"flex flex-col gap-3 border-t border-[var(--border)] pt-4\" aria-label={labels.statePanel.exits}>\n <h3 className=\"text-base font-semibold text-[var(--foreground)]\">{labels.statePanel.exits}</h3>\n {props.exits}\n <AddExitButtons onAddExit={props.onAddExit} />\n </section>\n\n <details className=\"group flex flex-col gap-3 border-t border-[var(--border)] pt-4\">\n <summary className=\"cursor-pointer list-none text-sm font-semibold text-[var(--foreground)]\">\n <span className=\"inline-flex items-center gap-1\">\n <ChevronDown aria-hidden=\"true\" className=\"size-4 transition-transform group-open:rotate-180\" />\n {labels.statePanel.more}\n </span>\n </summary>\n <div className=\"mt-3 flex flex-col gap-4\">\n <Labeled label={labels.statePanel.firstMessage}>\n <Textarea\n rows={3}\n value={props.firstMessage ?? \"\"}\n onChange={(event) => onChange({ firstMessage: event.target.value === \"\" ? null : event.target.value })}\n />\n </Labeled>\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{labels.statePanel.tools}</span>\n <span className=\"text-xs text-[var(--foreground-muted)]\">{labels.statePanel.toolsHint}</span>\n {props.catalogTools.length === 0 ? (\n <span className=\"text-xs text-[var(--foreground-subtle)]\">{labels.statePanel.noTools}</span>\n ) : (\n <ChipToggles\n items={props.catalogTools.map((tool) => ({ id: tool, title: tool }))}\n selected={props.tools}\n onChange={(tools) => onChange({ tools })}\n />\n )}\n </div>\n <Labeled label={labels.statePanel.tags}>\n <Input defaultValue={props.tags.join(\", \")} key={props.tags.join(\",\")} onBlur={(event) => onChange({ tags: splitList(event.target.value) })} />\n </Labeled>\n <label className=\"flex items-center justify-between gap-3 text-sm text-[var(--foreground)]\">\n {labels.statePanel.noSideQuestions}\n <Switch checked={props.noSideQuestions} onCheckedChange={(noSideQuestions) => onChange({ noSideQuestions })} />\n </label>\n </div>\n </details>\n </PanelShell>\n );\n}\n\nexport function TandemFlowAnyStatePanel(props: FlowAnyStatePanelProps) {\n const labels = useFlowLabels().editor;\n return (\n <PanelShell eyebrow={labels.board.anyState} title={labels.anyStatePanel.title} label={labels.anyStatePanel.title}>\n <p className=\"text-sm text-[var(--foreground-muted)]\">{labels.anyStatePanel.hint}</p>\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{labels.anyStatePanel.except}</span>\n <ChipToggles items={props.states.map((state) => ({ id: state.stateId, title: state.title }))} selected={props.except} onChange={props.onExceptChange} />\n </div>\n <section className=\"flex flex-col gap-3 border-t border-[var(--border)] pt-4\" aria-label={labels.statePanel.exits}>\n <h3 className=\"text-base font-semibold text-[var(--foreground)]\">{labels.statePanel.exits}</h3>\n {props.exits}\n <AddExitButtons onAddExit={props.onAddExit} />\n </section>\n </PanelShell>\n );\n}\n\nexport function TandemFlowFieldRow(props: FlowFieldRowProps) {\n const labels = useFlowLabels().editor.cardPanel;\n const fieldTypes = useFlowLabels().editor.fieldTypes;\n const exitLabels = useFlowLabels().editor.exitCard;\n const { field, onChange } = props;\n const refresh = \"refreshAfterMonths\" in field ? field.refreshAfterMonths : null;\n return (\n <li\n aria-label={field.name || field.id}\n data-field={field.id}\n className={cn(\n \"flex min-w-0 flex-col gap-2 rounded-[var(--radius-nested)] border bg-[var(--surface)] p-3\",\n props.issues.some((issue) => issue.level === \"error\") ? \"border-[var(--destructive)]\" : \"border-[var(--border)]\",\n )}\n >\n <div className=\"flex items-center gap-1\">\n <Input aria-label={labels.name} value={field.name} onChange={(event) => onChange({ name: event.target.value })} className=\"flex-1\" />\n <IconButton label={exitLabels.moveUp} onClick={props.onMoveUp} disabled={!props.canMoveUp}>\n <ChevronUp aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n <IconButton label={exitLabels.moveDown} onClick={props.onMoveDown} disabled={!props.canMoveDown}>\n <ChevronDown aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n <IconButton label={exitLabels.delete} onClick={props.onDelete} tone=\"danger\">\n <Trash2 aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n </div>\n <Textarea aria-label={labels.about} placeholder={labels.about} rows={2} value={field.about} onChange={(event) => onChange({ about: event.target.value })} />\n <div className=\"grid grid-cols-2 gap-2\">\n <Labeled label={labels.type}>\n <Select value={field.type} onChange={(event) => onChange({ type: event.target.value as (typeof FIELD_TYPES)[number] })}>\n {FIELD_TYPES.map((type) => (\n <option key={type} value={type}>\n {fieldTypes[type]}\n </option>\n ))}\n </Select>\n </Labeled>\n {props.list === \"clientCard\" && (\n <Labeled label={labels.refreshAfter}>\n <Select\n value={refresh === null ? \"\" : String(refresh)}\n onChange={(event) => onChange({ refreshAfterMonths: event.target.value === \"\" ? null : Number(event.target.value) })}\n >\n <option value=\"\">—</option>\n {[1, 3, 6, 12].map((months) => (\n <option key={months} value={months}>\n {labels.refreshAfterMonths(months)}\n </option>\n ))}\n </Select>\n </Labeled>\n )}\n </div>\n {field.type === \"choice\" && (\n <Labeled label={labels.options} hint={labels.optionsHint}>\n <Input\n key={field.options.join(\",\")}\n defaultValue={field.options.join(\", \")}\n onBlur={(event) => onChange({ options: splitList(event.target.value) })}\n />\n </Labeled>\n )}\n <IssueList issues={props.issues} />\n </li>\n );\n}\n\nfunction FieldSection({\n title,\n hint,\n rows,\n onAdd,\n appFields,\n onAddAppField,\n}: {\n title: string;\n hint?: string;\n rows: ReactNode;\n onAdd(): void;\n appFields: Array<{ id: string; title: string }>;\n onAddAppField(fieldId: string): void;\n}) {\n const labels = useFlowLabels().editor.cardPanel;\n return (\n <section className=\"flex flex-col gap-2\" aria-label={title}>\n <SectionTitle>{title}</SectionTitle>\n {hint && <p className=\"text-xs text-[var(--foreground-muted)]\">{hint}</p>}\n <ul className=\"flex flex-col gap-2\">{rows}</ul>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button variant=\"secondary\" size=\"sm\" onClick={onAdd}>\n <Plus aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.addField}\n </Button>\n {appFields.length > 0 && (\n <Select aria-label={`${title}: ${labels.fromApp}`} className=\"h-8 w-auto text-xs\" value=\"\" onChange={(event) => event.target.value && onAddAppField(event.target.value)}>\n <option value=\"\">{labels.fromApp}</option>\n {appFields.map((field) => (\n <option key={field.id} value={field.id}>\n {field.title}\n </option>\n ))}\n </Select>\n )}\n </div>\n </section>\n );\n}\n\nexport function TandemFlowCardPanel(props: FlowCardPanelProps) {\n const labels = useFlowLabels().editor.cardPanel;\n return (\n <PanelShell eyebrow={labels.title} title={labels.title} label={labels.title}>\n {props.empty && <p className=\"text-sm text-[var(--foreground-muted)]\">{labels.empty}</p>}\n <FieldSection\n title={labels.clientCard}\n rows={props.clientCard}\n onAdd={() => props.onAddField(\"clientCard\")}\n appFields={props.appFields}\n onAddAppField={(fieldId) => props.onAddAppField(\"clientCard\", fieldId)}\n />\n <FieldSection\n title={labels.chatNotes}\n hint={labels.chatNotesHint}\n rows={props.chatNotes}\n onAdd={() => props.onAddField(\"chatNotes\")}\n appFields={props.appFields}\n onAddAppField={(fieldId) => props.onAddAppField(\"chatNotes\", fieldId)}\n />\n <section className=\"flex flex-col gap-2 border-t border-[var(--border)] pt-4\">\n <label className=\"flex items-center gap-2 text-sm text-[var(--foreground)]\">\n {labels.pace}\n <Input\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n className=\"w-20\"\n value={props.sideQuestionEveryMessages}\n onChange={(event) => Number(event.target.value) > 0 && props.onPaceChange(Number(event.target.value))}\n />\n </label>\n <p className=\"text-xs text-[var(--foreground-muted)]\">{labels.paceHint}</p>\n </section>\n </PanelShell>\n );\n}\n\nexport function TandemFlowCheckPanel({ issues }: FlowCheckPanelProps) {\n const labels = useFlowLabels().editor.checkPanel;\n const errors = issues.filter((issue) => issue.level === \"error\");\n const warnings = issues.filter((issue) => issue.level === \"warning\");\n const group = (title: string, list: typeof issues, Icon: typeof CircleAlert, tone: string) =>\n list.length > 0 && (\n <section className=\"flex flex-col gap-2\" aria-label={title}>\n <SectionTitle>\n {title} · {list.length}\n </SectionTitle>\n <ul className=\"flex flex-col gap-1.5\">\n {list.map((issue, index) => (\n <li key={`${issue.code}-${index}`}>\n <button\n type=\"button\"\n onClick={issue.onGo}\n className=\"flex w-full items-start gap-2 rounded-[var(--radius-nested)] border border-[var(--border)] bg-[var(--surface)] p-3 text-left text-sm hover:bg-[var(--surface-hover)]\"\n >\n <Icon aria-hidden=\"true\" className={cn(\"mt-0.5 size-4 shrink-0\", tone)} />\n <span className=\"min-w-0 flex-1 break-words text-[var(--foreground)]\">{issue.message}</span>\n <span className=\"shrink-0 text-xs text-[var(--action)]\">{labels.goTo}</span>\n </button>\n </li>\n ))}\n </ul>\n </section>\n );\n return (\n <PanelShell eyebrow={labels.title} title={labels.title} label={labels.title}>\n {issues.length === 0 && <p className=\"text-sm text-[var(--success-text)]\">{labels.clean}</p>}\n {group(labels.errors, errors, CircleAlert, \"text-[var(--destructive-text)]\")}\n {group(labels.warnings, warnings, TriangleAlert, \"text-[var(--warm-text)]\")}\n </PanelShell>\n );\n}\n","import { Button, Input, Switch, Textarea, cn } from \"@tandem/ui\";\nimport type { FlowAfterEnd, FlowDuration, FlowNudges, FlowTimerUnit } from \"@ykurilov/agent-chat-flows/format\";\nimport type {\n DurationUnit,\n FlowNudgesEditorProps,\n FlowScheduleSectionProps,\n FlowSideTasksSectionProps,\n FlowStateTimingProps,\n NudgesMode,\n} from \"@ykurilov/agent-chat-flows/react\";\nimport { DEFAULT_NUDGES, useFlowLabels } from \"@ykurilov/agent-chat-flows/react\";\nimport { ChevronDown, Clock, Plus, Trash2, X } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { IssueList } from \"./flow-panels\";\nimport { IconButton, Labeled, SectionTitle, Select } from \"./flow-parts\";\n\n// «Дни и время», касания, «Попутные задачи» и «Длится» ноды. Редкие настройки — под «Дополнительно».\n\nconst TIMER_UNITS: FlowTimerUnit[] = [\"min\", \"h\", \"d\"];\nconst NUDGES_MODES: NudgesMode[] = [\"inherit\", \"own\", \"off\"];\n\n/** Пустое поле — `undefined`, иначе целое число. */\nconst numberOrNone = (text: string) => (text.trim() === \"\" ? undefined : Math.max(0, Math.round(Number(text)) || 0));\n\nfunction More({ title, children }: { title: string; children: ReactNode }) {\n return (\n <details className=\"group flex flex-col gap-3\">\n <summary className=\"cursor-pointer list-none text-sm font-semibold text-[var(--foreground)]\">\n <span className=\"inline-flex items-center gap-1\">\n <ChevronDown aria-hidden=\"true\" className=\"size-4 transition-transform group-open:rotate-180\" />\n {title}\n </span>\n </summary>\n <div className=\"mt-3 flex flex-col gap-4\">{children}</div>\n </details>\n );\n}\n\nfunction SwitchRow({ label, checked, onChange }: { label: string; checked: boolean; onChange(checked: boolean): void }) {\n return (\n <label className=\"flex items-center justify-between gap-3 text-sm text-[var(--foreground)]\">\n {label}\n <Switch checked={checked} onCheckedChange={onChange} />\n </label>\n );\n}\n\n/** «15 мин»: число и единица. */\nfunction DurationInput({ label, value, onChange, onRemove }: { label: string; value: FlowDuration; onChange(value: FlowDuration): void; onRemove?(): void }) {\n const units = useFlowLabels().editor.units;\n const remove = useFlowLabels().editor.nudges.remove;\n return (\n <div className=\"flex items-center gap-1.5\">\n <Input\n aria-label={label}\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n className=\"w-20\"\n value={value.amount}\n onChange={(event) => Number(event.target.value) > 0 && onChange({ ...value, amount: Math.round(Number(event.target.value)) })}\n />\n <Select aria-label={`${label}: ${units[value.unit]}`} className=\"w-24\" value={value.unit} onChange={(event) => onChange({ ...value, unit: event.target.value as FlowTimerUnit })}>\n {TIMER_UNITS.map((unit) => (\n <option key={unit} value={unit}>\n {units[unit]}\n </option>\n ))}\n </Select>\n {onRemove && (\n <IconButton label={remove} onClick={onRemove}>\n <X aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n )}\n </div>\n );\n}\n\nexport function TandemFlowNudgesEditor({ nudges, optional, onChange }: FlowNudgesEditorProps) {\n const labels = useFlowLabels().editor.nudges;\n if (nudges === null) {\n return optional ? <SwitchRow label={labels.on} checked={false} onChange={() => onChange(structuredClone(DEFAULT_NUDGES))} /> : null;\n }\n const set = (patch: Partial<FlowNudges>) => onChange({ ...nudges, ...patch });\n const steps = nudges.afterSilence;\n const daily = nudges.dailyAt ?? [];\n return (\n <div data-flow-nudges=\"\" className=\"flex flex-col gap-3 rounded-[var(--radius-nested)] bg-[var(--surface-muted)] p-3\">\n {optional && <SwitchRow label={labels.on} checked onChange={() => onChange(null)} />}\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{labels.afterSilence}</span>\n {steps.map((step, index) => (\n <DurationInput\n key={index}\n label={`${labels.afterSilence} ${index + 1}`}\n value={step}\n onChange={(next) => set({ afterSilence: steps.map((item, at) => (at === index ? next : item)) })}\n onRemove={() => set({ afterSilence: steps.filter((_, at) => at !== index) })}\n />\n ))}\n <Button variant=\"secondary\" size=\"sm\" className=\"self-start\" onClick={() => set({ afterSilence: [...steps, steps.at(-1) ?? { amount: 1, unit: \"h\" }] })}>\n <Plus aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.addStep}\n </Button>\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{labels.dailyAt}</span>\n {daily.map((at, index) => (\n <div key={index} className=\"flex items-center gap-1.5\">\n <Input\n aria-label={`${labels.dailyAt} ${index + 1}`}\n type=\"time\"\n className=\"w-32\"\n value={at}\n onChange={(event) => event.target.value && set({ dailyAt: daily.map((item, place) => (place === index ? event.target.value : item)) })}\n />\n <IconButton label={labels.remove} onClick={() => set({ dailyAt: daily.filter((_, place) => place !== index) })}>\n <X aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n </div>\n ))}\n <Button variant=\"secondary\" size=\"sm\" className=\"self-start\" onClick={() => set({ dailyAt: [...daily, \"10:00\"] })}>\n <Plus aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.addTime}\n </Button>\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{labels.giveUpAfter}</span>\n {nudges.giveUpAfter ? (\n <DurationInput label={labels.giveUpAfter} value={nudges.giveUpAfter} onChange={(giveUpAfter) => set({ giveUpAfter })} onRemove={() => set({ giveUpAfter: undefined })} />\n ) : (\n <Button variant=\"secondary\" size=\"sm\" className=\"self-start\" onClick={() => set({ giveUpAfter: { amount: 3, unit: \"d\" } })}>\n {labels.never}\n </Button>\n )}\n </div>\n </div>\n );\n}\n\nexport function TandemFlowScheduleSection(props: FlowScheduleSectionProps) {\n const labels = useFlowLabels().editor;\n const text = labels.schedule;\n const { schedule, onChange } = props;\n const afterEnd = (\n <Labeled label={labels.overview.afterEnd} hint={labels.overview.afterEndHints[props.afterEnd]}>\n <Select value={props.afterEnd} onChange={(event) => props.onAfterEndChange(event.target.value as FlowAfterEnd)}>\n {([\"reply\", \"silent\"] as const).map((mode) => (\n <option key={mode} value={mode}>\n {labels.overview.afterEndModes[mode]}\n </option>\n ))}\n </Select>\n </Labeled>\n );\n return (\n <section aria-label={text.title} data-flow-schedule=\"\" className=\"flex flex-col gap-3 border-t border-[var(--border)] pt-4\">\n <h3 className=\"inline-flex items-center gap-1.5 text-base font-semibold text-[var(--foreground)]\">\n <Clock aria-hidden=\"true\" className=\"size-4 text-[var(--warm)]\" />\n {text.title}\n </h3>\n <SwitchRow label={text.on} checked={schedule !== null} onChange={props.onToggle} />\n <p className=\"text-xs text-[var(--foreground-muted)]\">{text.hint}</p>\n <IssueList issues={props.issues} />\n {schedule && (\n <>\n <div className=\"grid grid-cols-2 gap-2\">\n <Labeled label={text.dayStart} hint={text.dayStartHint}>\n <Input type=\"time\" value={schedule.dayStart} onChange={(event) => event.target.value && onChange({ dayStart: event.target.value })} />\n </Labeled>\n <Labeled label={text.lengthDays}>\n <Input\n type=\"number\"\n min={1}\n max={60}\n inputMode=\"numeric\"\n placeholder={text.lengthDaysNone}\n value={schedule.lengthDays ?? \"\"}\n onChange={(event) => onChange({ lengthDays: numberOrNone(event.target.value) || undefined })}\n />\n </Labeled>\n </div>\n {schedule.lengthDays !== undefined && (\n <>\n <Labeled label={text.deadlineState}>\n <Select value={schedule.deadlineState ?? \"\"} onChange={(event) => onChange({ deadlineState: event.target.value || undefined })}>\n <option value=\"\">{text.deadlineNone}</option>\n {props.states.map((state) => (\n <option key={state.value} value={state.value}>\n {state.title}\n </option>\n ))}\n </Select>\n </Labeled>\n <SwitchRow label={text.farewell} checked={schedule.farewellOnDeadline} onChange={(farewellOnDeadline) => onChange({ farewellOnDeadline })} />\n {schedule.farewellOnDeadline && (\n <Labeled label={text.farewellText} hint={text.farewellTextHint}>\n <Textarea rows={3} value={schedule.farewellText ?? \"\"} onChange={(event) => onChange({ farewellText: event.target.value })} />\n </Labeled>\n )}\n </>\n )}\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{text.nudges}</span>\n <span className=\"text-xs text-[var(--foreground-muted)]\">{text.nudgesHint}</span>\n {props.nudges}\n </div>\n </>\n )}\n <More title={text.more}>\n {schedule && (\n <>\n <div className=\"grid grid-cols-2 gap-2\">\n <Labeled label={text.nightFrom}>\n <Input type=\"time\" value={schedule.nightFrom ?? \"\"} onChange={(event) => onChange({ nightFrom: event.target.value || undefined })} />\n </Labeled>\n <Labeled label={text.lateStart}>\n <Input\n type=\"number\"\n min={0}\n inputMode=\"numeric\"\n value={schedule.lateStartHours}\n onChange={(event) => onChange({ lateStartHours: numberOrNone(event.target.value) ?? 0 })}\n />\n </Labeled>\n </div>\n <p className=\"-mt-2 text-xs text-[var(--foreground-muted)]\">\n {text.nightFromHint} {text.lateStartHint}\n </p>\n <div className=\"flex flex-col gap-2\">\n <SectionTitle>{text.firstMessages}</SectionTitle>\n <Labeled label={text.maxPerDay} hint={text.maxPerDayHint}>\n <Input\n type=\"number\"\n min={0}\n inputMode=\"numeric\"\n value={schedule.firstMessages?.maxPerDay ?? \"\"}\n onChange={(event) => onChange({ firstMessages: { ...schedule.firstMessages, maxPerDay: numberOrNone(event.target.value) } })}\n />\n </Labeled>\n <SwitchRow\n label={text.morning}\n checked={schedule.firstMessages?.morning ?? schedule.lengthDays !== undefined}\n onChange={(morning) => onChange({ firstMessages: { ...schedule.firstMessages, morning } })}\n />\n <Labeled label={text.skipMorning}>\n <Input\n type=\"number\"\n min={0}\n inputMode=\"numeric\"\n placeholder=\"180\"\n value={schedule.firstMessages?.skipMorningIfHumanWithinMin ?? \"\"}\n onChange={(event) => onChange({ firstMessages: { ...schedule.firstMessages, skipMorningIfHumanWithinMin: numberOrNone(event.target.value) } })}\n />\n </Labeled>\n </div>\n <div className=\"flex flex-col gap-2\">\n <SectionTitle>{text.dayFrame}</SectionTitle>\n <p className=\"text-xs text-[var(--foreground-muted)]\">{text.dayFrameHint}</p>\n <div className=\"grid grid-cols-2 gap-2\">\n <Labeled label={text.softFrom}>\n <Input\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n value={schedule.dayFrame?.softFrom ?? \"\"}\n onChange={(event) => onChange({ dayFrame: { ...schedule.dayFrame, softFrom: numberOrNone(event.target.value) || undefined } })}\n />\n </Labeled>\n <Labeled label={text.hardAt}>\n <Input\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n value={schedule.dayFrame?.hardAt ?? \"\"}\n onChange={(event) => onChange({ dayFrame: { ...schedule.dayFrame, hardAt: numberOrNone(event.target.value) || undefined } })}\n />\n </Labeled>\n </div>\n {schedule.dayFrame?.hardAt !== undefined && (\n <Labeled label={text.hardText} hint={text.hardTextHint}>\n <Textarea rows={2} value={schedule.dayFrame.hardText ?? \"\"} onChange={(event) => onChange({ dayFrame: { ...schedule.dayFrame, hardText: event.target.value } })} />\n </Labeled>\n )}\n </div>\n </>\n )}\n {afterEnd}\n </More>\n </section>\n );\n}\n\nexport function TandemFlowSideTasksSection(props: FlowSideTasksSectionProps) {\n const editorLabels = useFlowLabels().editor;\n const labels = editorLabels.sideTasks;\n const own = props.fields.filter((field) => !field.fromApp);\n const fromApp = props.fields.filter((field) => field.fromApp);\n return (\n <section aria-label={labels.title} data-flow-side-tasks=\"\" className=\"flex flex-col gap-3 border-t border-[var(--border)] pt-4\">\n <h3 className=\"text-base font-semibold text-[var(--foreground)]\">{labels.title}</h3>\n <p className=\"text-xs text-[var(--foreground-muted)]\">{labels.hint}</p>\n {props.builtInCity && <p className=\"rounded-[var(--radius-small)] bg-[var(--cool-soft)] px-3 py-2 text-xs text-[var(--cool-text)]\">{labels.builtIn}</p>}\n <ul className=\"flex flex-col gap-2\">\n {props.tasks.map((task) => (\n <li\n key={task.id}\n data-side-task={task.id}\n aria-label={task.text || task.id}\n className={cn(\n \"flex min-w-0 flex-col gap-2 rounded-[var(--radius-nested)] border bg-[var(--surface)] p-3\",\n task.issues.some((issue) => issue.level === \"error\") ? \"border-[var(--destructive)]\" : \"border-[var(--border)]\",\n task.focused && \"ring-2 ring-[var(--focus-ring)]\",\n )}\n >\n <div className=\"flex items-start gap-1\">\n <Textarea\n aria-label={labels.text}\n placeholder={labels.text}\n rows={2}\n className=\"flex-1\"\n value={task.text}\n onChange={(event) => props.onChange(task.id, { text: event.target.value })}\n />\n <IconButton label={labels.delete} onClick={() => props.onDelete(task.id)} tone=\"danger\">\n <Trash2 aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n </div>\n <Labeled label={labels.field}>\n <Select value={task.field ?? \"\"} onChange={(event) => props.onFieldChange(task.id, event.target.value || null)}>\n <option value=\"\">{labels.noField}</option>\n {own.map((field) => (\n <option key={field.id} value={field.id}>\n {field.title}\n </option>\n ))}\n {fromApp.length > 0 && (\n <optgroup label={labels.fromApp}>\n {fromApp.map((field) => (\n <option key={field.id} value={field.id}>\n {field.title}\n </option>\n ))}\n </optgroup>\n )}\n </Select>\n </Labeled>\n <More title={editorLabels.schedule.more}>\n <Labeled label={labels.when}>\n <Input value={task.when ?? \"\"} onChange={(event) => props.onChange(task.id, { when: event.target.value })} />\n </Labeled>\n <label className=\"flex items-center gap-2 text-sm text-[var(--foreground)]\">\n {labels.maxAttempts}\n <Input\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n className=\"w-20\"\n value={task.maxAttempts}\n onChange={(event) => Number(event.target.value) > 0 && props.onChange(task.id, { maxAttempts: Number(event.target.value) })}\n />\n </label>\n <SwitchRow label={labels.perConversation} checked={task.perConversation} onChange={(perConversation) => props.onChange(task.id, { perConversation })} />\n </More>\n <IssueList issues={task.issues} />\n </li>\n ))}\n </ul>\n <Button variant=\"secondary\" size=\"sm\" onClick={props.onAdd} className=\"self-start\">\n <Plus aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.add}\n </Button>\n </section>\n );\n}\n\nexport function TandemFlowStateTiming(props: FlowStateTimingProps) {\n const labels = useFlowLabels().editor.statePanel;\n const { duration } = props;\n const units: DurationUnit[] = props.daysAvailable ? [\"h\", \"d\", \"program_day\"] : [\"h\"];\n // «3 дней», но «до дня программы 3»: номер дня — после варианта.\n const amount = duration && (\n <Input\n aria-label={`${labels.duration}: ${labels.durationUnits[duration.unit]}`}\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n className=\"w-20\"\n value={duration.amount}\n onChange={(event) => Number(event.target.value) > 0 && props.onDurationChange({ amount: Number(event.target.value), unit: duration.unit })}\n />\n );\n return (\n <section aria-label={labels.duration} data-flow-state-timing=\"\" className=\"flex flex-col gap-3 border-t border-[var(--border)] pt-4\">\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{labels.duration}</span>\n <div className=\"flex items-center gap-1.5\">\n {duration?.unit !== \"program_day\" && amount}\n <Select\n aria-label={labels.duration}\n className={duration ? (duration.unit === \"program_day\" ? \"w-44\" : \"w-28\") : undefined}\n value={duration?.unit ?? \"\"}\n onChange={(event) => {\n const unit = event.target.value as DurationUnit | \"\";\n props.onDurationChange(unit === \"\" ? null : { amount: duration?.amount ?? 1, unit });\n }}\n >\n <option value=\"\">{labels.durationNone}</option>\n {units.map((unit) => (\n <option key={unit} value={unit}>\n {labels.durationUnits[unit]}\n </option>\n ))}\n </Select>\n {duration?.unit === \"program_day\" && amount}\n </div>\n <span className=\"text-xs text-[var(--foreground-muted)]\">{labels.durationHint}</span>\n </div>\n {duration && (\n <Labeled label={labels.durationTo}>\n <Select value={duration.to ?? \"\"} onChange={(event) => props.onDurationTargetChange(event.target.value || null)}>\n <option value=\"\">—</option>\n {props.targets.map((target) => (\n <option key={target.value} value={target.value}>\n {target.title}\n </option>\n ))}\n </Select>\n </Labeled>\n )}\n <IssueList issues={props.issues} />\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{labels.nudges}</span>\n <div role=\"radiogroup\" aria-label={labels.nudges} className=\"flex flex-wrap gap-1.5\">\n {NUDGES_MODES.map((mode) => (\n <button\n key={mode}\n type=\"button\"\n role=\"radio\"\n aria-checked={props.nudgesMode === mode}\n onClick={() => props.onNudgesModeChange(mode)}\n className={cn(\n \"min-h-8 rounded-full border px-3 text-xs font-medium transition-colors\",\n props.nudgesMode === mode\n ? \"border-[var(--action)] bg-[var(--cool-soft)] text-[var(--cool-text)]\"\n : \"border-[var(--border)] bg-[var(--surface)] text-[var(--foreground-muted)] hover:bg-[var(--surface-hover)]\",\n )}\n >\n {labels.nudgesModes[mode]}\n </button>\n ))}\n </div>\n <span className=\"text-xs text-[var(--foreground-muted)]\">{labels.nudgesHint}</span>\n {props.nudges}\n {props.nudgesMode === \"own\" && <NudgesDays days={props.nudgesDays} onChange={props.onNudgesDaysChange} />}\n </div>\n </section>\n );\n}\n\n/** «Свои касания действуют»: всё время в ноде или N дней, считая день входа. */\nfunction NudgesDays({ days, onChange }: { days: number | null; onChange(days: number | null): void }) {\n const labels = useFlowLabels().editor.statePanel;\n return (\n <div data-flow-nudges-days=\"\" className=\"flex flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{labels.nudgesDays}</span>\n <div className=\"flex items-center gap-1.5\">\n {days !== null && (\n <Input\n aria-label={`${labels.nudgesDays}: ${labels.nudgesDaysModes.days}`}\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n className=\"w-20\"\n value={days}\n onChange={(event) => Number(event.target.value) > 0 && onChange(Number(event.target.value))}\n />\n )}\n <Select aria-label={labels.nudgesDays} value={days === null ? \"always\" : \"days\"} onChange={(event) => onChange(event.target.value === \"days\" ? 1 : null)}>\n <option value=\"always\">{labels.nudgesDaysModes.always}</option>\n <option value=\"days\">{labels.nudgesDaysModes.days}</option>\n </Select>\n </div>\n {days !== null && <span className=\"text-xs text-[var(--foreground-muted)]\">{labels.nudgesDaysHint}</span>}\n </div>\n );\n}\n","import { Button, Input, cn } from \"@tandem/ui\";\nimport type { FlowRunPanelProps } from \"@ykurilov/agent-chat-flows/react\";\nimport { useFlowLabels } from \"@ykurilov/agent-chat-flows/react\";\nimport { ArrowRight, MessageCircleQuestion, RotateCcw, Undo2 } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\nimport { IconButton, KindIcon, PanelShell, SectionTitle } from \"./flow-parts\";\n\n/** Поле «что агент знает»: пишется по уходу с поля или Enter, чтобы прогон не прыгал на каждую букву. */\nfunction KnownInput({ value, label, placeholder, onChange }: { value: string | null; label: string; placeholder: string; onChange(value: string): void }) {\n const [draft, setDraft] = useState(value ?? \"\");\n useEffect(() => setDraft(value ?? \"\"), [value]);\n return (\n <Input\n aria-label={label}\n value={draft}\n placeholder={placeholder}\n onChange={(event) => setDraft(event.target.value)}\n onBlur={() => draft !== (value ?? \"\") && onChange(draft)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") event.currentTarget.blur();\n }}\n className=\"h-9\"\n />\n );\n}\n\n/** Прогон: где агент, «что произошло?» с целями от движка, «ничего из этого», что агент знает, путь. */\nexport function TandemFlowRunPanel(props: FlowRunPanelProps) {\n const labels = useFlowLabels().editor;\n const run = labels.runPanel;\n return (\n <PanelShell\n eyebrow={run.step(props.path.length)}\n title={run.current}\n label={run.title}\n actions={\n <>\n <IconButton label={run.back} onClick={props.onBack} disabled={!props.canGoBack}>\n <Undo2 aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n <IconButton label={run.restart} onClick={props.onRestart}>\n <RotateCcw aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n </>\n }\n >\n <div data-run-current={props.current.stateId} className=\"rounded-[var(--radius-panel)] border border-[var(--warm-border)] bg-[var(--warm-soft)] p-4\">\n <p className=\"break-words text-lg font-semibold text-[var(--foreground)]\">{props.current.title}</p>\n {props.current.goal && <p className=\"mt-1 break-words text-sm text-[var(--foreground-muted)]\">{props.current.goal}</p>}\n </div>\n\n <section className=\"flex flex-col gap-2\" aria-label={run.whatHappened}>\n <SectionTitle>{run.whatHappened}</SectionTitle>\n <ul className=\"flex flex-col gap-1.5\">\n {props.choices.map((choice) => (\n <li key={choice.exitId}>\n <button\n type=\"button\"\n onClick={choice.onChoose}\n disabled={choice.target === null}\n data-choice={choice.exitId}\n className=\"flex w-full items-start gap-3 rounded-[var(--radius-nested)] border border-[var(--border)] bg-[var(--surface)] p-3 text-left hover:border-[var(--action)] hover:bg-[var(--surface-hover)] disabled:cursor-not-allowed disabled:opacity-55\"\n >\n <KindIcon kind={choice.kind} className=\"mt-0.5 size-4\" />\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"break-words text-sm text-[var(--foreground)]\">{choice.text}</span>\n <span className={cn(\"inline-flex items-center gap-1 text-xs\", choice.target === null ? \"text-[var(--destructive-text)]\" : \"text-[var(--foreground-muted)]\")}>\n <ArrowRight aria-hidden=\"true\" className=\"size-3\" />\n {choice.target ?? run.wontFire}\n </span>\n </span>\n </button>\n </li>\n ))}\n <li>\n <button\n type=\"button\"\n onClick={props.onNothing}\n className=\"flex w-full items-start gap-3 rounded-[var(--radius-nested)] border border-dashed border-[var(--border-strong)] bg-[var(--surface)] p-3 text-left hover:bg-[var(--surface-hover)]\"\n >\n <ArrowRight aria-hidden=\"true\" className=\"mt-0.5 size-4 text-[var(--foreground-subtle)]\" />\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"text-sm text-[var(--foreground)]\">{run.nothing}</span>\n <span className=\"text-xs text-[var(--foreground-muted)]\">→ {run.stay}</span>\n </span>\n </button>\n </li>\n </ul>\n </section>\n\n {props.nextQuestion && (\n <p className=\"flex items-start gap-2 rounded-[var(--radius-nested)] bg-[var(--cool-soft)] p-3 text-sm text-[var(--cool-text)]\">\n <MessageCircleQuestion aria-hidden=\"true\" className=\"mt-0.5 size-4 shrink-0\" />\n <span>\n {run.nextQuestion}: <strong className=\"font-semibold\">{props.nextQuestion}</strong>\n </span>\n </p>\n )}\n\n {props.known.length > 0 && (\n <section className=\"flex flex-col gap-2\" aria-label={run.known}>\n <SectionTitle>{run.known}</SectionTitle>\n <ul className=\"flex flex-col gap-1.5\">\n {props.known.map((field) => (\n <li key={field.fieldId} className=\"grid grid-cols-[minmax(0,2fr)_minmax(0,3fr)] items-center gap-2\">\n <span className={cn(\"truncate text-sm\", field.stale ? \"text-[var(--warm-text)]\" : \"text-[var(--foreground)]\")}>{field.name}</span>\n <KnownInput value={field.value} label={field.name} placeholder={run.notYet} onChange={field.onChange} />\n </li>\n ))}\n </ul>\n </section>\n )}\n\n <section className=\"flex flex-col gap-2\" aria-label={run.path}>\n <SectionTitle>{run.path}</SectionTitle>\n <ol className=\"flex flex-col gap-1 text-sm\">\n {props.path.map((step, index) => (\n <li key={`${step.stateId}-${index}`} className=\"flex min-w-0 items-baseline gap-2\">\n <span className=\"w-5 shrink-0 text-right tabular-nums text-xs text-[var(--foreground-subtle)]\">{index + 1}</span>\n <span className=\"min-w-0 break-words\">\n <span className=\"text-[var(--foreground)]\">{step.title}</span>\n {step.via && <span className=\"text-xs text-[var(--foreground-muted)]\"> · {step.via}</span>}\n </span>\n </li>\n ))}\n </ol>\n </section>\n\n <Button variant=\"secondary\" onClick={props.onFinish} className=\"self-start\">\n {run.finish}\n </Button>\n </PanelShell>\n );\n}\n","import { Alert, Badge, Button, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from \"@tandem/ui\";\nimport type { FlowMigrateDialogProps } from \"@ykurilov/agent-chat-flows/react\";\nimport { useFlowLabels } from \"@ykurilov/agent-chat-flows/react\";\nimport { Select } from \"./flow-parts\";\n\n/** Окно «Перевести чаты на новую версию»: версия → состояние → чатов, для удалённых состояний — куда перевести. */\nexport function TandemFlowMigrateDialog(props: FlowMigrateDialogProps) {\n const labels = useFlowLabels().migrate;\n const nothing = !props.busy && props.rows.length === 0 && props.moved === null && !props.failed;\n return (\n <Dialog open onOpenChange={(open) => !open && props.onClose()}>\n <DialogContent className=\"w-[min(640px,calc(100vw-24px))] max-w-none\">\n <DialogHeader>\n <DialogTitle>{labels.title}</DialogTitle>\n <DialogDescription>{labels.hint}</DialogDescription>\n </DialogHeader>\n {nothing && <p className=\"text-sm text-[var(--foreground-muted)]\">{labels.nothingToMigrate}</p>}\n {props.rows.length > 0 && (\n <div className=\"max-h-[50vh] overflow-auto\">\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr className=\"text-left text-xs text-[var(--foreground-subtle)]\">\n <th className=\"py-1.5 pr-2 font-medium\">{labels.version}</th>\n <th className=\"py-1.5 pr-2 font-medium\">{labels.state}</th>\n <th className=\"py-1.5 pr-2 text-right font-medium\">{labels.chats}</th>\n <th className=\"py-1.5 font-medium\">{labels.target}</th>\n </tr>\n </thead>\n <tbody>\n {props.rows.map((row) => (\n <tr key={`${row.versionId}:${row.stateId}`} className=\"border-t border-[var(--border)] align-middle\">\n <td className=\"py-2 pr-2 font-mono text-xs text-[var(--foreground-muted)]\">{row.versionId}</td>\n <td className=\"py-2 pr-2\">\n <span className=\"text-[var(--foreground)]\">{row.stateTitle}</span>\n {row.removed && (\n <Badge variant=\"warm\" className=\"ml-1.5 py-0 text-[11px]\">\n {labels.removed}\n </Badge>\n )}\n </td>\n <td className=\"py-2 pr-2 text-right tabular-nums\">{row.chats}</td>\n <td className=\"py-2\">\n {row.removed ? (\n <Select aria-label={labels.target} value={row.target ?? \"\"} onChange={(event) => row.onTargetChange(event.target.value)}>\n <option value=\"\" disabled>\n {labels.chooseTarget}\n </option>\n {props.targets.map((target) => (\n <option key={target.value} value={target.value}>\n {target.title}\n </option>\n ))}\n </Select>\n ) : (\n <span className=\"text-[var(--foreground-subtle)]\">{row.stateTitle}</span>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n {props.moved !== null && <Alert variant=\"success\" title={labels.moved(props.moved)} />}\n {props.failed && <Alert variant=\"danger\" title={labels.failed} />}\n <DialogFooter>\n <Button variant=\"ghost\" onClick={props.onClose}>\n {labels.close}\n </Button>\n <Button onClick={props.onMigrate} disabled={!props.canMigrate} loading={props.busy}>\n {labels.migrate}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import type { FlowEditorSkin } from \"@ykurilov/agent-chat-flows/react\";\nimport { TandemFlowAnyStateNode, TandemFlowBoardToggle, TandemFlowEdge, TandemFlowLegend, TandemFlowStateNode, TandemFlowZoomControls } from \"./flow-board-parts\";\nimport { TandemFlowJsonDialog, TandemFlowTestChatFrame } from \"./flow-dialogs\";\nimport { TandemFlowExitCard } from \"./flow-exit-card\";\nimport { TandemFlowEditorFrame, TandemFlowHeader } from \"./flow-frame\";\nimport {\n TandemFlowAnyStatePanel,\n TandemFlowCardPanel,\n TandemFlowCheckPanel,\n TandemFlowFieldRow,\n TandemFlowOverviewPanel,\n TandemFlowStatePanel,\n} from \"./flow-panels\";\nimport { TandemFlowNudgesEditor, TandemFlowScheduleSection, TandemFlowSideTasksSection, TandemFlowStateTiming } from \"./flow-days\";\nimport { TandemFlowRunPanel } from \"./flow-run-panel\";\nimport { TandemFlowMigrateDialog } from \"./migrate-dialog\";\n\n/** Скин редактора сценария (договор `FlowEditorSkin` v1) по прототипу: для `FlowEditor`. */\nexport const tandemFlowEditorSkin: FlowEditorSkin = {\n FlowEditorFrame: TandemFlowEditorFrame,\n FlowHeader: TandemFlowHeader,\n FlowStateNode: TandemFlowStateNode,\n FlowAnyStateNode: TandemFlowAnyStateNode,\n FlowEdge: TandemFlowEdge,\n FlowLegend: TandemFlowLegend,\n FlowZoomControls: TandemFlowZoomControls,\n FlowBoardToggle: TandemFlowBoardToggle,\n FlowOverviewPanel: TandemFlowOverviewPanel,\n FlowStatePanel: TandemFlowStatePanel,\n FlowAnyStatePanel: TandemFlowAnyStatePanel,\n FlowExitCard: TandemFlowExitCard,\n FlowCardPanel: TandemFlowCardPanel,\n FlowFieldRow: TandemFlowFieldRow,\n FlowCheckPanel: TandemFlowCheckPanel,\n FlowRunPanel: TandemFlowRunPanel,\n FlowJsonDialog: TandemFlowJsonDialog,\n FlowMigrateDialog: TandemFlowMigrateDialog,\n FlowTestChatFrame: TandemFlowTestChatFrame,\n FlowScheduleSection: TandemFlowScheduleSection,\n FlowSideTasksSection: TandemFlowSideTasksSection,\n FlowStateTiming: TandemFlowStateTiming,\n FlowNudgesEditor: TandemFlowNudgesEditor,\n};\n"],"mappings":"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","names":["cn","useFlowLabels","Clock","jsx","jsxs","useFlowLabels","cn","Clock","Button","useFlowLabels","useState","useFlowLabels","Clock","jsx","jsxs","useFlowLabels","Clock","jsx","jsxs","useFlowLabels","useState","Button","Input","cn","useFlowLabels","jsx","jsxs","useFlowLabels","cn","Input","Button","cn","useFlowLabels","Plus","Shuffle","useEffect","useState","Button","useRef","useState","jsx","jsxs","jsx","jsxs","cn","useState","useEffect","useFlowLabels","Plus","Shuffle","Button","Badge","Button","Input","Textarea","cn","useFlowLabels","ChevronDown","ChevronUp","Flag","Plus","Trash2","jsx","jsxs","KINDS","cn","useFlowLabels","Flag","Button","Plus","Textarea","Trash2","Input","Badge","ChevronDown","ChevronUp","Button","Input","Switch","Textarea","cn","useFlowLabels","ChevronDown","Clock","Plus","Trash2","X","Fragment","jsx","jsxs","ChevronDown","Switch","useFlowLabels","Input","X","Button","Plus","Clock","Textarea","cn","Trash2","Button","Input","cn","useFlowLabels","RotateCcw","Undo2","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","Input","useFlowLabels","Undo2","RotateCcw","cn","Button","Badge","Button","Dialog","DialogContent","DialogFooter","DialogHeader","DialogTitle","useFlowLabels","jsx","jsxs","useFlowLabels","Dialog","DialogContent","DialogHeader","DialogTitle","Badge","DialogFooter","Button"]}
|
|
1
|
+
{"version":3,"sources":["../../src/flows/flow-board-parts.tsx","../../src/flows/flow-parts.tsx","../../src/flows/flow-dialogs.tsx","../../src/flows/test-chat.tsx","../../src/flows/flow-exit-card.tsx","../../src/flows/flow-frame.tsx","../../src/flows/flow-header-menu.tsx","../../src/flows/flow-panels.tsx","../../src/flows/flow-days.tsx","../../src/flows/flow-run-panel.tsx","../../src/flows/migrate-dialog.tsx","../../src/flows/flow-editor-skin.ts"],"sourcesContent":["import { cn } from \"@tandem/ui\";\nimport type {\n FlowAnyStateNodeProps,\n FlowEdgeProps,\n FlowExitRowView,\n FlowBoardToggleProps,\n FlowLegendProps,\n FlowStateNodeProps,\n FlowZoomControlsProps,\n} from \"@ykurilov/agent-chat-flows/react\";\nimport { useFlowLabels } from \"@ykurilov/agent-chat-flows/react\";\nimport { CircleHelp, Clock, Flag, Map as MapIcon, Maximize, Minus, MoonStar, PanelRightClose, PanelRightOpen, Plus, Shuffle, Tag } from \"lucide-react\";\nimport type { KeyboardEvent, ReactNode } from \"react\";\nimport { IssueBadge, KIND_COLOR, KIND_DASH, KindIcon } from \"./flow-parts\";\n\n// Доска: узлы, стрелки, легенда, масштаб. Ручки и пути стрелок приходят от слоя поведения готовыми.\n\nconst activate = (handler: () => void) => (event: KeyboardEvent) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n handler();\n }\n};\n\nfunction ExitRow({ exit, index, handle }: { exit: FlowExitRowView; index: number; handle: ReactNode }) {\n const labels = useFlowLabels().editor;\n const broken = exit.issues.errors > 0;\n return (\n <li className=\"relative flex min-w-0 items-start gap-1.5 py-1 pl-3 pr-4 text-[11px] leading-snug\" data-exit={exit.exitId}>\n <span className=\"w-3 shrink-0 tabular-nums text-[var(--foreground-subtle)]\">{index + 1}</span>\n <KindIcon kind={exit.kind} className=\"mt-px size-3\" />\n <span className={cn(\"min-w-0 flex-1 break-words\", broken ? \"text-[var(--destructive-text)]\" : \"text-[var(--foreground)]\")}>\n {exit.text}\n {exit.target === null ? (\n <span className=\"ml-1 italic text-[var(--destructive-text)]\">· {labels.board.noTarget}</span>\n ) : exit.kind === \"return\" ? (\n <span className=\"ml-1 text-[var(--foreground-subtle)]\">↩ {labels.returnKind.toLocaleLowerCase()}</span>\n ) : null}\n </span>\n {handle}\n </li>\n );\n}\n\nfunction NodeCard({\n selected,\n dimmed,\n run,\n muted,\n onSelect,\n label,\n children,\n}: {\n selected: boolean;\n dimmed: boolean;\n run: FlowStateNodeProps[\"run\"];\n muted?: boolean;\n onSelect(): void;\n label: string;\n children: ReactNode;\n}) {\n return (\n <div\n role=\"button\"\n tabIndex={0}\n aria-label={label}\n aria-pressed={selected}\n data-run={run ?? undefined}\n onClick={onSelect}\n onKeyDown={activate(onSelect)}\n className={cn(\n \"relative w-[264px] rounded-[var(--radius-panel)] border bg-[var(--surface)] text-left shadow-[var(--shadow-sm)] outline-none transition-[opacity,box-shadow] duration-150\",\n muted && \"border-dashed bg-[var(--surface-muted)]\",\n selected ? \"border-[var(--action)] ring-2 ring-[var(--focus-ring)]\" : \"border-[var(--border)]\",\n run === \"current\" && \"border-[var(--warm)] ring-2 ring-[var(--warm-border)] shadow-[var(--shadow-warm)]\",\n run === \"visited\" && \"bg-[var(--cool-soft)]\",\n dimmed && \"opacity-35\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]\",\n )}\n >\n {children}\n </div>\n );\n}\n\nexport function TandemFlowStateNode(props: FlowStateNodeProps) {\n const labels = useFlowLabels().editor;\n return (\n <NodeCard selected={props.selected} dimmed={props.dimmed} run={props.run} onSelect={props.onSelect} label={props.title}>\n {props.renderInputHandle()}\n <div className=\"flex flex-col gap-1 px-3 pb-2 pt-2.5\">\n {(props.start || props.final || props.tags.length > 0) && (\n <div className=\"flex flex-wrap items-center gap-1\">\n {props.start && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-[var(--cool-soft)] px-1.5 py-px text-[10px] font-medium text-[var(--cool-text)]\">\n <Flag aria-hidden=\"true\" className=\"size-2.5\" />\n {labels.board.start}\n </span>\n )}\n {props.final && (\n <span className=\"rounded-full bg-[var(--surface-muted)] px-1.5 py-px text-[10px] font-medium text-[var(--foreground-muted)]\">{labels.board.final}</span>\n )}\n {props.tags.map((tag) => (\n <span key={tag} className=\"inline-flex items-center gap-1 rounded-full bg-[var(--warm-soft)] px-1.5 py-px text-[10px] text-[var(--warm-text)]\">\n <Tag aria-hidden=\"true\" className=\"size-2.5\" />\n {tag}\n </span>\n ))}\n </div>\n )}\n <p className=\"break-words text-[13px] font-semibold leading-tight text-[var(--foreground)]\">{props.title}</p>\n {props.goal && <p className=\"line-clamp-2 break-words text-[11px] leading-snug text-[var(--foreground-muted)]\">{props.goal}</p>}\n {props.timing && (\n <p data-flow-node-timing=\"\" className=\"inline-flex items-center gap-1 text-[10px] text-[var(--warm-text)]\">\n <Clock aria-hidden=\"true\" className=\"size-2.5 shrink-0\" />\n <span className=\"truncate\">{props.timing}</span>\n </p>\n )}\n {(props.noSideQuestions || props.issues.errors + props.issues.warnings > 0) && (\n <div className=\"flex flex-wrap items-center gap-2 text-[10px] text-[var(--foreground-subtle)]\">\n {props.noSideQuestions && (\n <span className=\"inline-flex items-center gap-1\">\n <MoonStar aria-hidden=\"true\" className=\"size-2.5\" />\n {labels.board.noSideQuestions}\n </span>\n )}\n <IssueBadge issues={props.issues} className=\"text-[10px]\" />\n </div>\n )}\n </div>\n {props.exits.length > 0 && (\n <ul className=\"border-t border-[var(--border)] py-1\">\n {props.exits.map((exit, index) => (\n <ExitRow key={exit.exitId} exit={exit} index={index} handle={props.renderExitHandle(exit.exitId)} />\n ))}\n </ul>\n )}\n </NodeCard>\n );\n}\n\nexport function TandemFlowAnyStateNode(props: FlowAnyStateNodeProps) {\n const labels = useFlowLabels().editor;\n return (\n <NodeCard selected={props.selected} dimmed={props.dimmed} run={null} muted onSelect={props.onSelect} label={labels.board.anyState}>\n <div className=\"flex flex-col gap-1 px-3 pb-2 pt-2.5\">\n <span className=\"inline-flex items-center gap-1 text-[10px] font-medium text-[var(--foreground-subtle)]\">\n <Shuffle aria-hidden=\"true\" className=\"size-2.5\" />\n {labels.anyStatePanel.title}\n </span>\n <p className=\"text-[13px] font-semibold leading-tight text-[var(--foreground)]\">{labels.board.anyState}</p>\n {props.except.length > 0 && (\n <p className=\"break-words text-[11px] leading-snug text-[var(--foreground-muted)]\">\n {labels.anyStatePanel.except}: {props.except.join(\", \")}\n </p>\n )}\n <IssueBadge issues={props.issues} className=\"text-[10px]\" />\n </div>\n {props.exits.length > 0 && (\n <ul className=\"border-t border-[var(--border)] py-1\">\n {props.exits.map((exit, index) => (\n <ExitRow key={exit.exitId} exit={exit} index={index} handle={props.renderExitHandle(exit.exitId)} />\n ))}\n </ul>\n )}\n </NodeCard>\n );\n}\n\n/** Стрелка: цвет и пунктир по виду; широкая невидимая линия ловит щелчок и касание. */\nexport function TandemFlowEdge(props: FlowEdgeProps) {\n const color = KIND_COLOR[props.kind];\n const width = props.selected ? 3 : props.traversed ? 2.75 : 1.6;\n return (\n <g data-edge={props.edgeId} data-kind={props.kind} data-traversed={props.traversed || undefined} style={{ opacity: props.dimmed ? 0.18 : 1 }}>\n <path d={props.path} fill=\"none\" stroke={color} strokeWidth={width} strokeDasharray={KIND_DASH[props.kind]} strokeLinecap=\"round\" />\n <path\n d={props.path}\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={18}\n style={{ pointerEvents: \"stroke\", cursor: \"pointer\" }}\n onClick={props.onSelect}\n >\n <title>{props.label}</title>\n </path>\n </g>\n );\n}\n\nexport function TandemFlowLegend({ kinds }: FlowLegendProps) {\n const labels = useFlowLabels().editor;\n return (\n <div className=\"w-[320px] rounded-[var(--radius-panel)] border border-[var(--border)] bg-[var(--surface)] p-3 text-xs shadow-[var(--shadow-sm)]\">\n <p className=\"mb-1.5 font-semibold text-[var(--foreground)]\">{labels.overview.exits}</p>\n <ul className=\"flex flex-col gap-1\">\n {kinds.map((kind) => (\n <li key={kind} className=\"flex items-center gap-2 text-[var(--foreground-muted)]\">\n <svg aria-hidden=\"true\" width=\"28\" height=\"6\" className=\"shrink-0\">\n <line x1=\"1\" y1=\"3\" x2=\"27\" y2=\"3\" stroke={KIND_COLOR[kind]} strokeWidth=\"2\" strokeDasharray={KIND_DASH[kind]} />\n </svg>\n {kind === \"return\" ? `${labels.returnKind} — ${labels.returnTarget}` : labels.conditionKindHints[kind]}\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\nexport function TandemFlowZoomControls({ zoom, onZoomIn, onZoomOut, onFit }: FlowZoomControlsProps) {\n const labels = useFlowLabels().editor;\n const button =\n \"inline-flex size-9 items-center justify-center rounded-[var(--radius-small)] text-[var(--foreground-muted)] hover:bg-[var(--surface-hover)] hover:text-[var(--foreground)]\";\n return (\n <div className=\"flex items-center gap-0.5 rounded-[var(--radius-control)] border border-[var(--border)] bg-[var(--surface)] p-1 shadow-[var(--shadow-sm)]\">\n <button type=\"button\" className={button} onClick={onZoomOut} aria-label={labels.board.zoomOut} title={labels.board.zoomOut}>\n <Minus aria-hidden=\"true\" className=\"size-4\" />\n </button>\n <span className=\"w-12 text-center text-xs tabular-nums text-[var(--foreground)]\">{Math.round(zoom * 100)}%</span>\n <button type=\"button\" className={button} onClick={onZoomIn} aria-label={labels.board.zoomIn} title={labels.board.zoomIn}>\n <Plus aria-hidden=\"true\" className=\"size-4\" />\n </button>\n <button type=\"button\" className={button} onClick={onFit} aria-label={labels.board.fit} title={labels.board.fit}>\n <Maximize aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </div>\n );\n}\n\n/** Кнопка места на доске: легенда, мини-карта, панель «Сценарий». */\nexport function TandemFlowBoardToggle({ kind, label, expanded, showText, onClick }: FlowBoardToggleProps) {\n const Icon = kind === \"legend\" ? CircleHelp : kind === \"minimap\" ? MapIcon : expanded ? PanelRightClose : PanelRightOpen;\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={label}\n title={label}\n aria-expanded={expanded}\n data-flow-board-toggle={kind}\n className={cn(\n \"inline-flex h-9 items-center justify-center gap-1.5 rounded-[var(--radius-control)] border border-[var(--border)] bg-[var(--surface)] text-xs text-[var(--foreground-muted)] shadow-[var(--shadow-sm)] hover:bg-[var(--surface-hover)] hover:text-[var(--foreground)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]\",\n showText ? \"px-3\" : \"w-9\",\n expanded && \"text-[var(--foreground)]\",\n )}\n >\n <Icon aria-hidden=\"true\" className=\"size-4\" />\n {showText && <span>{label}</span>}\n </button>\n );\n}\n","import { cn } from \"@tandem/ui\";\nimport type { FlowEdgeKind, FlowIssueCount } from \"@ykurilov/agent-chat-flows/react\";\nimport { useFlowLabels } from \"@ykurilov/agent-chat-flows/react\";\nimport { Clock, Database, MessageSquareText, Undo2, Zap, type LucideIcon } from \"lucide-react\";\nimport type { ReactNode, SelectHTMLAttributes } from \"react\";\n\n// Общие мелочи скина редактора: цвета и значки видов условий, подписи разделов, выпадающий список, счётчик ошибок.\n\n/** Цвет вида стрелки: словами — действие, данные — приглушённый, событие — успех, таймер — тёплый пунктиром. */\nexport const KIND_COLOR: Record<FlowEdgeKind, string> = {\n judge: \"var(--action)\",\n data: \"var(--foreground-subtle)\",\n event: \"var(--success)\",\n timer: \"var(--warm)\",\n return: \"var(--foreground-subtle)\",\n};\n\nexport const KIND_DASH: Record<FlowEdgeKind, string | undefined> = {\n judge: undefined,\n data: undefined,\n event: undefined,\n timer: \"6 5\",\n return: \"2 4\",\n};\n\nexport const KIND_ICON: Record<FlowEdgeKind, LucideIcon> = {\n judge: MessageSquareText,\n data: Database,\n event: Zap,\n timer: Clock,\n return: Undo2,\n};\n\nexport function KindIcon({ kind, className }: { kind: FlowEdgeKind; className?: string }) {\n const Icon = KIND_ICON[kind];\n return <Icon aria-hidden=\"true\" className={cn(\"size-3.5 shrink-0\", className)} style={{ color: KIND_COLOR[kind] }} />;\n}\n\nexport function SectionTitle({ children, className }: { children: ReactNode; className?: string }) {\n return <h3 className={cn(\"text-xs font-semibold uppercase tracking-wide text-[var(--foreground-subtle)]\", className)}>{children}</h3>;\n}\n\n/** Обычный `select` в оформлении полей Тандема. */\nexport function Select({ className, children, ...props }: SelectHTMLAttributes<HTMLSelectElement>) {\n return (\n <select\n {...props}\n className={cn(\n \"h-[var(--control-height-md)] w-full min-w-0 rounded-[var(--radius-control)] border border-[var(--border)] bg-[var(--surface)] px-3 text-sm text-[var(--foreground)] outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)] disabled:opacity-60\",\n className,\n )}\n >\n {children}\n </select>\n );\n}\n\n/** Подпись над полем ввода. */\nexport function Labeled({ label, hint, children, className }: { label: string; hint?: string; children: ReactNode; className?: string }) {\n return (\n <label className={cn(\"flex min-w-0 flex-col gap-1.5\", className)}>\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{label}</span>\n {children}\n {hint && <span className=\"text-xs text-[var(--foreground-muted)]\">{hint}</span>}\n </label>\n );\n}\n\n/** «Ошибок: 2 · Замечаний: 1» — красным и тёплым; ничего — ничего. */\nexport function IssueBadge({ issues, className }: { issues: FlowIssueCount; className?: string }) {\n const labels = useFlowLabels().editor;\n if (issues.errors === 0 && issues.warnings === 0) return null;\n return (\n <span className={cn(\"inline-flex items-center gap-1.5 text-xs font-medium\", className)}>\n {issues.errors > 0 && <span className=\"text-[var(--destructive-text)]\">{labels.board.errors(issues.errors)}</span>}\n {issues.warnings > 0 && <span className=\"text-[var(--warm-text)]\">{labels.board.warnings(issues.warnings)}</span>}\n </span>\n );\n}\n\n/** Значок-кнопка без подписи: подпись — в `aria-label` и подсказке. */\nexport function IconButton({\n label,\n onClick,\n disabled,\n children,\n className,\n tone = \"neutral\",\n}: {\n label: string;\n onClick(): void;\n disabled?: boolean;\n children: ReactNode;\n className?: string;\n tone?: \"neutral\" | \"danger\";\n}) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n disabled={disabled}\n onClick={onClick}\n className={cn(\n \"inline-flex size-8 shrink-0 items-center justify-center rounded-[var(--radius-small)] text-[var(--foreground-muted)] transition-colors hover:bg-[var(--surface-hover)] hover:text-[var(--foreground)] disabled:pointer-events-none disabled:opacity-35\",\n tone === \"danger\" && \"text-[var(--destructive-text)] hover:text-[var(--destructive-text)]\",\n className,\n )}\n >\n {children}\n </button>\n );\n}\n\n/** Панель справа: заголовок-надпись, заголовок, кнопки и содержимое с прокруткой. */\nexport function PanelShell({\n eyebrow,\n title,\n actions,\n children,\n label,\n}: {\n eyebrow: string;\n title: ReactNode;\n actions?: ReactNode;\n children: ReactNode;\n label: string;\n}) {\n return (\n <section aria-label={label} className=\"flex min-h-0 flex-1 flex-col\">\n <header className=\"flex items-start gap-2 px-5 pb-3 pt-5\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-[var(--foreground-subtle)]\">{eyebrow}</p>\n <h2 className=\"mt-1 break-words text-xl font-semibold text-[var(--foreground)]\">{title}</h2>\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-1\">{actions}</div>}\n </header>\n <div className=\"flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto px-5 pb-6\">{children}</div>\n </section>\n );\n}\n","import { Button, Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from \"@tandem/ui\";\nimport type { FlowJsonDialogProps } from \"@ykurilov/agent-chat-flows/react\";\nimport { useFlowLabels } from \"@ykurilov/agent-chat-flows/react\";\nimport { Check, Copy, Download, Upload } from \"lucide-react\";\nimport { useRef, useState } from \"react\";\n\n/** Окно JSON: показ, копия, скачивание и загрузка файла или вставленного текста с ошибками разбора. */\nexport function TandemFlowJsonDialog(props: FlowJsonDialogProps) {\n const labels = useFlowLabels().editor.jsonDialog;\n const [text, setText] = useState(props.json);\n const [copied, setCopied] = useState(false);\n const file = useRef<HTMLInputElement>(null);\n const edited = text !== props.json;\n\n return (\n <Dialog open onOpenChange={(open) => !open && props.onClose()}>\n <DialogContent className=\"flex max-h-[90vh] w-[min(760px,calc(100vw-24px))] max-w-none flex-col gap-3\">\n <DialogHeader>\n <DialogTitle>{labels.title}</DialogTitle>\n </DialogHeader>\n <textarea\n aria-label={labels.title}\n readOnly={props.readOnly}\n spellCheck={false}\n value={text}\n onChange={(event) => setText(event.target.value)}\n className=\"min-h-[320px] w-full flex-1 resize-none rounded-[var(--radius-nested)] border border-[var(--border)] bg-[var(--surface-muted)] p-3 font-mono text-xs leading-relaxed text-[var(--foreground)] outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]\"\n />\n {props.errors.length > 0 && (\n <ul role=\"alert\" className=\"max-h-32 overflow-y-auto rounded-[var(--radius-small)] bg-[color-mix(in_oklab,var(--destructive)_10%,transparent)] p-3 text-xs text-[var(--destructive-text)]\">\n {props.errors.map((error) => (\n <li key={error} className=\"break-words font-mono\">\n {error}\n </li>\n ))}\n </ul>\n )}\n <input\n ref={file}\n type=\"file\"\n accept=\"application/json,.json\"\n hidden\n onChange={async (event) => {\n const chosen = event.target.files?.[0];\n if (!chosen) return;\n const content = await chosen.text();\n setText(content);\n props.onLoad(content);\n event.target.value = \"\";\n }}\n />\n <DialogFooter className=\"flex-wrap gap-2\">\n <Button\n variant=\"secondary\"\n onClick={() => {\n props.onCopy();\n setCopied(true);\n }}\n >\n {copied ? <Check aria-hidden=\"true\" className=\"size-4\" /> : <Copy aria-hidden=\"true\" className=\"size-4\" />}\n {copied ? labels.copied : labels.copy}\n </Button>\n <Button variant=\"secondary\" onClick={props.onDownload}>\n <Download aria-hidden=\"true\" className=\"size-4\" />\n {labels.download}\n </Button>\n {!props.readOnly && (\n <Button variant={edited ? \"primary\" : \"secondary\"} onClick={() => (edited ? props.onLoad(text) : file.current?.click())}>\n <Upload aria-hidden=\"true\" className=\"size-4\" />\n {labels.load}\n </Button>\n )}\n <Button variant=\"ghost\" onClick={props.onClose}>\n {labels.close}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\n/** Рамка тестового чата живёт в `test-chat.tsx`. */\nexport { TandemFlowTestChatFrame } from \"./test-chat\";\n","import { Button, Input } from \"@tandem/ui\";\nimport type { FlowTestChatFrameProps } from \"@ykurilov/agent-chat-flows/react\";\nimport { useFlowLabels } from \"@ykurilov/agent-chat-flows/react\";\nimport { BellRing, Clock, RotateCcw, Sunrise, X } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { IconButton } from \"./flow-parts\";\n\n/** Поле «своё время»: «1 ч 30 мин» по Enter. Понял — перемотка и поле пустое; нет — подсказка, текст остаётся. */\nfunction CustomTimeField({ onAdvanceText, busy }: { onAdvanceText: (text: string) => boolean; busy: boolean }) {\n const labels = useFlowLabels().testChat;\n const [text, setText] = useState(\"\");\n const [invalid, setInvalid] = useState(false);\n return (\n <div className=\"w-full\">\n <Input\n aria-label={labels.customTime}\n aria-invalid={invalid}\n placeholder={labels.customTimePlaceholder}\n className=\"h-8 w-full text-sm\"\n disabled={busy}\n value={text}\n onChange={(event) => {\n setText(event.target.value);\n setInvalid(false);\n }}\n onKeyDown={(event) => {\n if (event.key !== \"Enter\" || !text.trim()) return;\n event.preventDefault();\n const understood = onAdvanceText(text);\n setInvalid(!understood);\n if (understood) setText(\"\");\n }}\n />\n {invalid && <p className=\"mt-1 text-xs text-[var(--destructive-text)]\">{labels.customTimeInvalid}</p>}\n </div>\n );\n}\n\n/** Тестовый чат в панели рядом с доской: где агент, часы чата с перемоткой и сам чат приложения. */\nexport function TandemFlowTestChatFrame(props: FlowTestChatFrameProps) {\n const labels = useFlowLabels().testChat;\n return (\n <section aria-label={labels.title} data-flow-test-chat=\"\" className=\"flex min-h-0 flex-1 flex-col\">\n <header className=\"flex items-start gap-2 border-b border-[var(--border)] px-5 pb-3 pt-4\">\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-[var(--foreground-subtle)]\">{labels.title}</p>\n <p className=\"mt-1 text-xs text-[var(--foreground-muted)]\">{labels.state}</p>\n <h2 data-flow-test-state=\"\" className=\"break-words text-lg font-semibold text-[var(--foreground)]\">\n {props.stateTitle}\n </h2>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n <IconButton label={labels.reset} onClick={props.onReset} disabled={props.busy}>\n <RotateCcw aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n <IconButton label={labels.close} onClick={props.onClose}>\n <X aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n </div>\n </header>\n <div className=\"flex flex-wrap items-center gap-1.5 border-b border-[var(--border)] px-5 py-2.5 text-sm\">\n <Clock aria-hidden=\"true\" className=\"size-4 text-[var(--foreground-subtle)]\" />\n <span className=\"text-[var(--foreground-muted)]\">{labels.clock}:</span>\n <span data-flow-test-clock=\"\" className=\"mr-auto font-medium tabular-nums text-[var(--foreground)]\">\n {props.clock}\n </span>\n {props.day && (\n <span data-flow-test-day=\"\" className=\"w-full text-xs font-medium text-[var(--warm-text)] sm:order-first sm:w-auto\">\n {props.day}\n </span>\n )}\n {props.advanceSteps.map((step) => (\n <Button key={step.ms} variant=\"secondary\" size=\"sm\" disabled={props.busy} onClick={() => props.onAdvance(step.ms)}>\n {labels.advance(step.label)}\n </Button>\n ))}\n {props.onNextDay && (\n <Button variant=\"secondary\" size=\"sm\" disabled={props.busy} onClick={props.onNextDay}>\n <Sunrise aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.nextDay}\n </Button>\n )}\n {props.onNextFirstMessage && (\n <Button variant=\"secondary\" size=\"sm\" disabled={props.busy} onClick={props.onNextFirstMessage}>\n <BellRing aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.nextFirstMessage}\n </Button>\n )}\n {props.onAdvanceText && <CustomTimeField onAdvanceText={props.onAdvanceText} busy={props.busy} />}\n </div>\n {props.nothingScheduled && (\n <p role=\"status\" className=\"mx-5 mt-2 rounded-[var(--radius-small)] bg-[var(--surface-muted)] px-3 py-2 text-xs text-[var(--foreground-muted)]\">\n {labels.nothingScheduled}\n </p>\n )}\n {props.failed && (\n <p role=\"alert\" className=\"mx-5 mt-2 rounded-[var(--radius-small)] bg-[color-mix(in_oklab,var(--destructive)_10%,transparent)] px-3 py-2 text-xs text-[var(--destructive-text)]\">\n {labels.failed}\n </p>\n )}\n <div className=\"flex min-h-0 flex-1 flex-col overflow-hidden\">{props.children}</div>\n </section>\n );\n}\n","import { Input, Textarea, cn } from \"@tandem/ui\";\nimport type { FlowCondition, FlowConditionType } from \"@ykurilov/agent-chat-flows/format\";\nimport type { FlowExitCardProps } from \"@ykurilov/agent-chat-flows/react\";\nimport { useFlowLabels } from \"@ykurilov/agent-chat-flows/react\";\nimport { ChevronDown, ChevronUp, Trash2 } from \"lucide-react\";\nimport { IconButton, KindIcon, Labeled, Select } from \"./flow-parts\";\n\nconst KINDS: FlowConditionType[] = [\"judge\", \"data\", \"event\", \"timer\"];\nconst EVENTS = [\"message\", \"button\", \"tool\", \"app\"] as const;\nconst SPANS = [\"in_state\", \"silence\", \"since_start\", \"time_of_day\"] as const;\nconst UNITS = [\"min\", \"h\", \"d\"] as const;\n\n/**\n * Карточка условия: вид (словами, данные, событие, таймер), его настройки и «куда». Меняется одно поле — годным\n * условие делает слой поведения (`normalizeCondition`): при смене вида достаточно передать `{ type }`.\n */\nexport function TandemFlowExitCard(props: FlowExitCardProps) {\n const labels = useFlowLabels().editor;\n const { when } = props;\n const change = (next: FlowCondition) => props.onChange({ when: next, to: props.to });\n const errors = props.issues.filter((issue) => issue.level === \"error\");\n const index = props.exitId;\n\n return (\n <article\n aria-label={labels.exitCard.when}\n data-exit-card={index}\n className={cn(\n \"flex min-w-0 flex-col gap-3 rounded-[var(--radius-nested)] border bg-[var(--surface)] p-3\",\n errors.length > 0 ? \"border-[var(--destructive)]\" : \"border-[var(--border)]\",\n )}\n >\n <div className=\"flex items-center gap-1\">\n <div role=\"radiogroup\" aria-label={labels.exitCard.when} className=\"flex min-w-0 flex-1 flex-wrap gap-0.5 rounded-[var(--radius-control)] bg-[var(--surface-muted)] p-0.5\">\n {KINDS.map((kind) => (\n <button\n key={kind}\n type=\"button\"\n role=\"radio\"\n aria-checked={when.type === kind}\n onClick={() => when.type !== kind && change({ type: kind } as FlowCondition)}\n className={cn(\n \"inline-flex min-h-8 flex-1 items-center justify-center gap-1 rounded-[calc(var(--radius-control)-2px)] px-2 text-xs font-medium\",\n when.type === kind ? \"bg-[var(--surface)] text-[var(--foreground)] shadow-[var(--shadow-xs)]\" : \"text-[var(--foreground-muted)]\",\n )}\n >\n <KindIcon kind={kind} />\n {labels.conditionKinds[kind]}\n </button>\n ))}\n </div>\n <IconButton label={labels.exitCard.moveUp} onClick={props.onMoveUp} disabled={!props.canMoveUp}>\n <ChevronUp aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n <IconButton label={labels.exitCard.moveDown} onClick={props.onMoveDown} disabled={!props.canMoveDown}>\n <ChevronDown aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n <IconButton label={labels.exitCard.delete} onClick={props.onDelete} tone=\"danger\">\n <Trash2 aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n </div>\n\n {when.type === \"judge\" && (\n <Textarea\n aria-label={labels.exitCard.when}\n rows={2}\n value={when.text}\n placeholder={labels.board.emptyCondition}\n onChange={(event) => change({ ...when, text: event.target.value })}\n />\n )}\n\n {when.type === \"data\" && <DataSettings {...props} when={when} change={change} />}\n\n {when.type === \"event\" && (\n <div className=\"grid grid-cols-2 gap-2\">\n <Labeled label={labels.exitCard.event}>\n <Select value={when.event} onChange={(event) => change({ type: \"event\", event: event.target.value as (typeof EVENTS)[number] })}>\n {EVENTS.map((event) => (\n <option key={event} value={event}>\n {labels.events[event]}\n </option>\n ))}\n </Select>\n </Labeled>\n {when.event !== \"message\" && (\n <Labeled label={labels.exitCard.eventName}>\n <Select value={when.name ?? \"\"} onChange={(event) => change({ ...when, name: event.target.value })}>\n <option value=\"\" />\n {[...new Set([...props.eventNames[when.event], ...(when.name ? [when.name] : [])])].map((name) => (\n <option key={name} value={name}>\n {(when.event !== \"tool\" && props.eventLabels?.[name]) || name}\n </option>\n ))}\n </Select>\n </Labeled>\n )}\n </div>\n )}\n\n {when.type === \"timer\" && (\n <div className=\"grid grid-cols-2 gap-2\">\n <Labeled label={labels.exitCard.timer} className=\"col-span-2\">\n <Select value={when.from} onChange={(event) => change({ ...when, from: event.target.value } as FlowCondition)}>\n {SPANS.map((span) => (\n <option key={span} value={span}>\n {labels.timerSpans[span]}\n </option>\n ))}\n <option value=\"state_days\">{`${labels.statePanel.duration}, ${labels.statePanel.durationUnits.d}`}</option>\n <option value=\"program_day\">{`${labels.statePanel.duration}, ${labels.statePanel.durationUnits.program_day}`}</option>\n </Select>\n </Labeled>\n {when.from === \"time_of_day\" ? (\n <Labeled label={labels.exitCard.at}>\n <Input type=\"time\" value={when.at} onChange={(event) => event.target.value && change({ ...when, at: event.target.value })} />\n </Labeled>\n ) : when.from === \"state_days\" || when.from === \"program_day\" ? (\n <Labeled label={labels.exitCard.amount}>\n <Input\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n value={when.from === \"state_days\" ? when.days : when.day}\n onChange={(event) => {\n const days = Number(event.target.value);\n if (Number.isInteger(days) && days > 0) change(when.from === \"state_days\" ? { ...when, days } : { ...when, day: days });\n }}\n />\n </Labeled>\n ) : (\n <>\n <Labeled label={labels.exitCard.amount}>\n <Input\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n value={when.amount}\n onChange={(event) => {\n const amount = Number(event.target.value);\n if (amount > 0) change({ ...when, amount });\n }}\n />\n </Labeled>\n <Labeled label={\"\\u00a0\"}>\n <Select aria-label={labels.exitCard.amount} value={when.unit} onChange={(event) => change({ ...when, unit: event.target.value as (typeof UNITS)[number] })}>\n {UNITS.map((unit) => (\n <option key={unit} value={unit}>\n {labels.units[unit]}\n </option>\n ))}\n </Select>\n </Labeled>\n </>\n )}\n </div>\n )}\n\n <Labeled label={labels.exitCard.to}>\n <Select value={props.to ?? \"\"} onChange={(event) => props.onChange({ when, to: event.target.value || null })} aria-invalid={props.to === null || undefined}>\n <option value=\"\">{labels.board.noTarget}</option>\n {props.targets.map((target) => (\n <option key={target.value} value={target.value}>\n {target.title}\n </option>\n ))}\n </Select>\n </Labeled>\n\n {props.issues.length > 0 && (\n <ul className=\"flex flex-col gap-1\">\n {props.issues.map((issue) => (\n <li\n key={`${issue.code}-${issue.message}`}\n role={issue.level === \"error\" ? \"alert\" : undefined}\n className={cn(\"break-words text-xs\", issue.level === \"error\" ? \"text-[var(--destructive-text)]\" : \"text-[var(--warm-text)]\")}\n >\n {issue.message}\n </li>\n ))}\n </ul>\n )}\n </article>\n );\n}\n\nfunction DataSettings(props: FlowExitCardProps & { when: Extract<FlowCondition, { type: \"data\" }>; change(next: FlowCondition): void }) {\n const labels = useFlowLabels().editor;\n const { when, change } = props;\n const field = props.fields.find((candidate) => candidate.id === when.field);\n return (\n <div className=\"grid grid-cols-2 gap-2\">\n <Labeled label={labels.exitCard.field} className=\"col-span-2\">\n <Select value={when.field} onChange={(event) => change({ ...when, field: event.target.value })}>\n {!field && <option value={when.field}>{when.field}</option>}\n {props.fields.map((candidate) => (\n <option key={candidate.id} value={candidate.id}>\n {candidate.name || candidate.id}\n </option>\n ))}\n </Select>\n </Labeled>\n <Labeled label={labels.exitCard.op} className={when.op === \"filled\" ? \"col-span-2\" : undefined}>\n <Select value={when.op} onChange={(event) => change({ ...when, op: event.target.value as typeof when.op })}>\n {props.ops.map((op) => (\n <option key={op} value={op}>\n {labels.ops[op]}\n </option>\n ))}\n </Select>\n </Labeled>\n {when.op !== \"filled\" &&\n (field?.type === \"boolean\" ? (\n <Labeled label={labels.exitCard.value}>\n <Select value={when.value === false ? \"false\" : \"true\"} onChange={(event) => change({ ...when, value: event.target.value === \"true\" })}>\n <option value=\"true\">{labels.yes}</option>\n <option value=\"false\">{labels.no}</option>\n </Select>\n </Labeled>\n ) : field?.type === \"choice\" && field.options.length > 0 ? (\n <Labeled label={labels.exitCard.value}>\n <Select value={String(when.value ?? \"\")} onChange={(event) => change({ ...when, value: event.target.value })}>\n <option value=\"\" />\n {field.options.map((option) => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </Select>\n </Labeled>\n ) : (\n <Labeled label={labels.exitCard.value}>\n <Input\n value={String(when.value ?? \"\")}\n inputMode={field?.type === \"number\" ? \"decimal\" : undefined}\n onChange={(event) => change({ ...when, value: event.target.value })}\n />\n </Labeled>\n ))}\n </div>\n );\n}\n","import { Badge, Button, TandemMark, cn } from \"@tandem/ui\";\nimport type { FlowEditorFrameProps, FlowHeaderProps } from \"@ykurilov/agent-chat-flows/react\";\nimport { useFlowLabels } from \"@ykurilov/agent-chat-flows/react\";\nimport { Braces, Eye, IdCard, Maximize2, MessagesSquare, Minimize2, Play, Plus, Save, ShieldCheck, Shuffle } from \"lucide-react\";\nimport type { CSSProperties } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { FlowHeaderMenu, type FlowHeaderMenuItem } from \"./flow-header-menu\";\n\n/** Цвета доски для стилей `@xyflow/react` слоя поведения: из токенов Тандема, светлая и тёмная тема сами. */\nconst BOARD_COLORS = {\n \"--flow-board-dots\": \"color-mix(in oklab, var(--foreground-subtle) 45%, transparent)\",\n \"--flow-board-handle\": \"var(--action)\",\n \"--flow-board-handle-fill\": \"var(--surface)\",\n \"--flow-board-connection\": \"var(--action)\",\n \"--flow-board-minimap\": \"var(--surface)\",\n \"--flow-board-minimap-mask\": \"color-mix(in oklab, var(--action) 10%, transparent)\",\n \"--flow-board-minimap-node\": \"var(--border-strong)\",\n} as CSSProperties;\n\n/**\n * Раскладка: шапка 64px, доска и панель 400px справа; на узком экране панель уходит вниз.\n * Высота — родителя, но не меньше разумной: у родителя без высоты и на телефоне холст не схлопывается. Свои `className`\n * и `style` приложения идут последними и перебивают это (`min-h-0`, `style={{ height: 720 }}`).\n */\nexport function TandemFlowEditorFrame({ header, board, panel, dialog, className, style, compact }: FlowEditorFrameProps) {\n const withPanel = panel !== null;\n return (\n <div\n data-flow-editor=\"\"\n data-flow-compact={compact ? \"\" : undefined}\n className={cn(\n \"grid h-full min-h-[max(420px,60vh)] w-full bg-[var(--canvas)] text-[var(--foreground)] max-[860px]:min-h-[max(640px,100svh)] max-[860px]:grid-cols-1\",\n withPanel ? \"grid-cols-[minmax(0,1fr)_400px]\" : \"grid-cols-[minmax(0,1fr)]\",\n compact ? \"grid-rows-[48px_minmax(0,1fr)]\" : \"grid-rows-[64px_minmax(0,1fr)]\",\n withPanel ? \"max-[860px]:grid-rows-[auto_minmax(0,1fr)_46vh]\" : \"max-[860px]:grid-rows-[auto_minmax(0,1fr)]\",\n className,\n )}\n style={{ ...BOARD_COLORS, ...style }}\n >\n <div className=\"col-span-full min-w-0 border-b border-[var(--border)] bg-[var(--surface)]\">{header}</div>\n <div className=\"relative min-h-0 min-w-0\" data-flow-board=\"\">\n {board}\n </div>\n {panel !== null && (\n <aside className=\"flex min-h-0 min-w-0 flex-col border-l border-[var(--border)] bg-[var(--surface)] max-[860px]:border-l-0 max-[860px]:border-t\">\n {panel}\n </aside>\n )}\n {dialog}\n </div>\n );\n}\n\n/** Название сценария: правится по месту, сохраняется по уходу с поля или Enter. */\nfunction FlowName({ name, onRename, readOnly }: Pick<FlowHeaderProps, \"name\" | \"onRename\" | \"readOnly\">) {\n const [draft, setDraft] = useState(name);\n useEffect(() => setDraft(name), [name]);\n const commit = () => {\n const next = draft.trim();\n if (next && next !== name) onRename(next);\n else setDraft(name);\n };\n return (\n <input\n aria-label={name}\n readOnly={readOnly}\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n onBlur={commit}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") event.currentTarget.blur();\n }}\n className=\"min-w-0 flex-1 truncate rounded-[var(--radius-small)] bg-transparent px-1.5 py-1 text-base font-semibold text-[var(--foreground)] outline-none hover:bg-[var(--surface-hover)] focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]\"\n />\n );\n}\n\nexport function TandemFlowHeader(props: FlowHeaderProps) {\n const { editor: labels, testChat: testChatLabels } = useFlowLabels();\n const { mode, onModeChange, issues, compact: narrow } = props;\n const toggle = (target: \"check\" | \"run\") => onModeChange(mode === target ? \"edit\" : target);\n const compact = \"max-[1100px]:[&>span.label]:hidden\";\n // На телефоне подписи прячутся у всех кнопок, иначе «Сохранить» уезжает за край.\n const phone = \"max-[860px]:[&>span.label]:hidden\";\n // На узком экране второстепенные кнопки уходят в меню «⋯»; Проверить, Прогон и состояние сохранения остаются на виду.\n const wide = \"max-[860px]:hidden\";\n const fullscreenLabel = props.fullscreen?.active ? labels.board.space.exitFullscreen : labels.board.space.enterFullscreen;\n const menuItems: FlowHeaderMenuItem[] = [\n { key: \"state\", label: labels.header.state, icon: <Plus />, disabled: mode === \"run\" || props.readOnly === true, onSelect: props.onAddState },\n { key: \"card\", label: labels.header.card, icon: <IdCard />, disabled: mode === \"run\", onSelect: props.onOpenCard },\n { key: \"json\", label: labels.header.json, icon: <Braces />, onSelect: props.onOpenJson },\n ...(props.onOpenMigrate ? [{ key: \"migrate\", label: labels.header.migrate, icon: <Shuffle />, onSelect: props.onOpenMigrate }] : []),\n ...(props.onOpenTestChat ? [{ key: \"test-chat\", label: testChatLabels.title, icon: <MessagesSquare />, onSelect: props.onOpenTestChat }] : []),\n ...(props.fullscreen\n ? [{ key: \"fullscreen\", label: fullscreenLabel, icon: props.fullscreen.active ? <Minimize2 /> : <Maximize2 />, pressed: props.fullscreen.active, onSelect: props.fullscreen.onToggle }]\n : []),\n ];\n return (\n <div className=\"flex h-full min-w-0 items-center gap-2 px-4 max-[860px]:flex-wrap max-[860px]:gap-1.5 max-[860px]:py-2\">\n {!narrow && <TandemMark className=\"size-7 shrink-0\" />}\n {!narrow && <FlowName name={props.name} onRename={props.onRename} readOnly={props.readOnly} />}\n {props.readOnly && (\n <Badge variant=\"warm\" className=\"shrink-0\" title={labels.header.readOnlyHint} data-flow-read-only-badge=\"\">\n <Eye aria-hidden=\"true\" className=\"mr-1 size-3.5\" />\n {labels.header.readOnly}\n </Badge>\n )}\n <div className=\"relative flex shrink-0 items-center gap-1.5 max-[860px]:w-full max-[860px]:gap-1\">\n <Button variant=\"secondary\" size=\"sm\" className={cn(compact, wide)} onClick={props.onAddState} disabled={mode === \"run\" || props.readOnly} title={labels.header.state}>\n <Plus aria-hidden=\"true\" className=\"size-4\" />\n <span className=\"label\">{labels.header.state}</span>\n </Button>\n <Button variant=\"secondary\" size=\"sm\" className={cn(compact, wide)} onClick={props.onOpenCard} disabled={mode === \"run\"} title={labels.header.card}>\n <IdCard aria-hidden=\"true\" className=\"size-4\" />\n <span className=\"label\">{labels.header.card}</span>\n </Button>\n <Button\n variant={mode === \"check\" ? \"primary\" : \"secondary\"}\n size=\"sm\"\n className={compact}\n aria-pressed={mode === \"check\"}\n onClick={() => toggle(\"check\")}\n title={labels.header.check}\n >\n <ShieldCheck aria-hidden=\"true\" className=\"size-4\" />\n <span className=\"label\">{labels.header.check}</span>\n {issues.errors > 0 && (\n <Badge variant=\"warm\" className=\"ml-0.5 px-1.5 py-0 text-[11px]\" aria-label={labels.board.errors(issues.errors)}>\n {issues.errors}\n </Badge>\n )}\n </Button>\n <Button\n variant={mode === \"run\" ? \"secondary\" : \"warm\"}\n size=\"sm\"\n className={cn(compact, mode === \"run\" && \"ring-2 ring-[var(--warm-border)]\")}\n aria-pressed={mode === \"run\"}\n onClick={() => toggle(\"run\")}\n title={labels.header.run}\n >\n <Play aria-hidden=\"true\" className=\"size-4\" />\n <span className=\"label\">{labels.header.run}</span>\n </Button>\n <Button variant=\"ghost\" size=\"sm\" className={wide} onClick={props.onOpenJson} title={labels.header.json} aria-label={labels.header.json}>\n <Braces aria-hidden=\"true\" className=\"size-4\" />\n </Button>\n {props.onOpenMigrate && (\n <Button variant=\"ghost\" size=\"sm\" className={wide} onClick={props.onOpenMigrate} title={labels.header.migrate} aria-label={labels.header.migrate}>\n <Shuffle aria-hidden=\"true\" className=\"size-4\" />\n </Button>\n )}\n {props.fullscreen && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={wide}\n data-flow-fullscreen-toggle=\"\"\n aria-pressed={props.fullscreen.active}\n onClick={props.fullscreen.onToggle}\n title={props.fullscreen.active ? labels.board.space.exitFullscreen : labels.board.space.enterFullscreen}\n aria-label={props.fullscreen.active ? labels.board.space.exitFullscreen : labels.board.space.enterFullscreen}\n >\n {props.fullscreen.active ? <Minimize2 aria-hidden=\"true\" className=\"size-4\" /> : <Maximize2 aria-hidden=\"true\" className=\"size-4\" />}\n </Button>\n )}\n {props.onOpenTestChat && (\n <Button variant=\"ghost\" size=\"sm\" className={wide} onClick={props.onOpenTestChat} title={testChatLabels.title}>\n <MessagesSquare aria-hidden=\"true\" className=\"size-4\" />\n <span className=\"label\">{testChatLabels.title}</span>\n </Button>\n )}\n <FlowHeaderMenu label={labels.header.more} items={menuItems} className=\"hidden max-[860px]:block\" />\n {props.onSave && (\n <Button\n variant={props.saveFailed ? \"secondary\" : props.dirty ? \"primary\" : \"ghost\"}\n size=\"sm\"\n className={cn(phone, props.saveFailed && \"border-[var(--destructive)] text-[var(--destructive-text)]\")}\n loading={props.saving}\n disabled={props.saving || !props.dirty}\n onClick={props.onSave}\n title={props.saveFailed ? labels.header.saveFailedHint : props.dirty ? labels.header.unsaved : labels.header.saved}\n data-save-failed={props.saveFailed ? \"\" : undefined}\n >\n <Save aria-hidden=\"true\" className=\"size-4\" />\n <span className=\"label\">{props.saveFailed ? labels.header.saveFailed : props.dirty ? labels.header.save : labels.header.saved}</span>\n </Button>\n )}\n </div>\n </div>\n );\n}\n","import { Button } from \"@tandem/ui\";\nimport { Ellipsis } from \"lucide-react\";\nimport { useEffect, useRef, useState, type KeyboardEvent, type ReactNode } from \"react\";\n\nexport interface FlowHeaderMenuItem {\n key: string;\n label: string;\n icon: ReactNode;\n disabled?: boolean;\n /** Выбранный пункт-переключатель (полный экран). */\n pressed?: boolean;\n onSelect(): void;\n}\n\n/**\n * Меню «⋯» шапки на узком экране: сюда уходят кнопки, которым не хватило места. Кнопка и список доступны с клавиатуры:\n * Enter, пробел и стрелка вниз открывают; стрелки, Home и End ходят по пунктам; Esc закрывает и возвращает фокус на кнопку;\n * Tab и клик в сторону закрывают.\n */\nexport function FlowHeaderMenu({ label, items, className }: { label: string; items: FlowHeaderMenuItem[]; className?: string }) {\n const [open, setOpen] = useState(false);\n const root = useRef<HTMLDivElement>(null);\n\n const entries = () => [...(root.current?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]:not([disabled])') ?? [])];\n const close = (refocus: boolean) => {\n setOpen(false);\n if (refocus) root.current?.querySelector<HTMLElement>('[aria-haspopup=\"menu\"]')?.focus();\n };\n\n useEffect(() => {\n if (!open) return;\n entries()[0]?.focus();\n const away = (event: Event) => {\n if (!root.current?.contains(event.target as Node)) setOpen(false);\n };\n document.addEventListener(\"pointerdown\", away);\n return () => document.removeEventListener(\"pointerdown\", away);\n }, [open]);\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && open) {\n // Esc закрывает только меню, а не полный экран под ним.\n event.preventDefault();\n event.nativeEvent.stopImmediatePropagation();\n close(true);\n return;\n }\n if (!open) return;\n const list = entries();\n const at = list.indexOf(document.activeElement as HTMLElement);\n const go = (index: number) => {\n event.preventDefault();\n list[(index + list.length) % list.length]?.focus();\n };\n if (event.key === \"ArrowDown\") go(at + 1);\n else if (event.key === \"ArrowUp\") go(at < 0 ? -1 : at - 1);\n else if (event.key === \"Home\") go(0);\n else if (event.key === \"End\") go(-1);\n else if (event.key === \"Tab\") close(false);\n };\n\n return (\n <div ref={root} className={className} onKeyDown={onKeyDown} data-flow-header-menu=\"\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={label}\n title={label}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={() => setOpen(!open)}\n onKeyDown={(event) => {\n if (event.key === \"ArrowDown\" && !open) {\n event.preventDefault();\n setOpen(true);\n }\n }}\n >\n <Ellipsis aria-hidden=\"true\" className=\"size-4\" />\n </Button>\n {open && (\n <div\n role=\"menu\"\n aria-label={label}\n className=\"absolute right-0 top-full z-50 mt-1 flex min-w-[220px] flex-col rounded-[var(--radius-panel)] border border-[var(--border)] bg-[var(--surface)] p-1 shadow-[var(--shadow-md,var(--shadow-sm))]\"\n >\n {items.map((item) => (\n <button\n key={item.key}\n type=\"button\"\n role=\"menuitem\"\n disabled={item.disabled}\n data-pressed={item.pressed ? \"\" : undefined}\n onClick={() => {\n close(true);\n item.onSelect();\n }}\n className=\"flex h-10 items-center gap-2 rounded-[var(--radius-small)] px-3 text-left text-sm text-[var(--foreground)] hover:bg-[var(--surface-hover)] focus-visible:bg-[var(--surface-hover)] focus-visible:outline-none disabled:opacity-45 data-[pressed]:font-semibold\"\n >\n <span aria-hidden=\"true\" className=\"shrink-0 [&_svg]:size-4\">\n {item.icon}\n </span>\n {item.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { Badge, Button, Input, Switch, Textarea, cn } from \"@tandem/ui\";\nimport type { FlowConditionType } from \"@ykurilov/agent-chat-flows/format\";\nimport type {\n FlowAnyStatePanelProps,\n FlowCardPanelProps,\n FlowCheckPanelProps,\n FlowFieldRowProps,\n FlowOverviewPanelProps,\n FlowStateLinkView,\n FlowStatePanelProps,\n} from \"@ykurilov/agent-chat-flows/react\";\nimport { useFlowLabels } from \"@ykurilov/agent-chat-flows/react\";\nimport { ChevronDown, ChevronUp, CircleAlert, Flag, Plus, Trash2, TriangleAlert } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { IconButton, IssueBadge, KindIcon, Labeled, PanelShell, SectionTitle, Select } from \"./flow-parts\";\n\nconst KINDS: FlowConditionType[] = [\"judge\", \"data\", \"event\", \"timer\"];\nconst FIELD_TYPES = [\"text\", \"number\", \"choice\", \"boolean\"] as const;\n\nconst splitList = (text: string) =>\n text\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n\n/** Отмечаемые «чипы»: «узнать здесь», инструменты, исключения общих переходов. */\nfunction ChipToggles({ items, selected, onChange }: { items: Array<{ id: string; title: string }>; selected: string[]; onChange(ids: string[]): void }) {\n return (\n <div className=\"flex flex-wrap gap-1.5\">\n {items.map((item) => {\n const on = selected.includes(item.id);\n return (\n <button\n key={item.id}\n type=\"button\"\n aria-pressed={on}\n onClick={() => onChange(on ? selected.filter((id) => id !== item.id) : [...selected, item.id])}\n className={cn(\n \"min-h-8 rounded-full border px-3 text-xs font-medium transition-colors\",\n on\n ? \"border-[var(--action)] bg-[var(--cool-soft)] text-[var(--cool-text)]\"\n : \"border-[var(--border)] bg-[var(--surface)] text-[var(--foreground-muted)] hover:bg-[var(--surface-hover)]\",\n )}\n >\n {item.title}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction StateLinks({ states }: { states: FlowStateLinkView[] }) {\n const labels = useFlowLabels().editor;\n return (\n <ul className=\"flex flex-col gap-1\">\n {states.map((state) => (\n <li key={state.stateId}>\n <button\n type=\"button\"\n onClick={state.onSelect}\n className=\"flex min-h-9 w-full items-center gap-2 rounded-[var(--radius-small)] px-2 text-left text-sm text-[var(--foreground)] hover:bg-[var(--surface-hover)]\"\n >\n <span className=\"min-w-0 flex-1 truncate\">{state.title}</span>\n {state.start && <Flag aria-label={labels.board.start} className=\"size-3.5 text-[var(--cool-text)]\" />}\n {state.final && <span className=\"text-xs text-[var(--foreground-subtle)]\">{labels.board.final}</span>}\n </button>\n </li>\n ))}\n </ul>\n );\n}\n\nfunction AddExitButtons({ onAddExit }: { onAddExit(kind: FlowConditionType): void }) {\n const labels = useFlowLabels().editor;\n return (\n <div className=\"flex flex-col gap-2\">\n <span className=\"text-xs font-medium text-[var(--foreground-muted)]\">{labels.statePanel.addExit}</span>\n <div className=\"grid grid-cols-2 gap-1.5\">\n {KINDS.map((kind) => (\n <Button key={kind} variant=\"secondary\" size=\"sm\" onClick={() => onAddExit(kind)} className=\"justify-start\">\n <Plus aria-hidden=\"true\" className=\"size-3.5\" />\n <KindIcon kind={kind} />\n {labels.conditionKinds[kind]}\n </Button>\n ))}\n </div>\n </div>\n );\n}\n\nexport function IssueList({ issues }: { issues: Array<{ level: \"error\" | \"warning\"; message: string; code: string }> }) {\n if (issues.length === 0) return null;\n return (\n <ul className=\"flex flex-col gap-1.5\">\n {issues.map((issue) => (\n <li\n key={`${issue.code}-${issue.message}`}\n role={issue.level === \"error\" ? \"alert\" : undefined}\n className={cn(\n \"rounded-[var(--radius-small)] px-3 py-2 text-xs\",\n issue.level === \"error\" ? \"bg-[color-mix(in_oklab,var(--destructive)_10%,transparent)] text-[var(--destructive-text)]\" : \"bg-[var(--warm-soft)] text-[var(--warm-text)]\",\n )}\n >\n {issue.message}\n </li>\n ))}\n </ul>\n );\n}\n\nexport function TandemFlowOverviewPanel(props: FlowOverviewPanelProps) {\n const labels = useFlowLabels().editor;\n const count = (label: string, value: number) => (\n <div className=\"flex flex-col rounded-[var(--radius-nested)] bg-[var(--surface-muted)] px-3 py-2\">\n <span className=\"text-lg font-semibold tabular-nums text-[var(--foreground)]\">{value}</span>\n <span className=\"text-xs text-[var(--foreground-muted)]\">{label}</span>\n </div>\n );\n return (\n <PanelShell eyebrow={labels.overview.title} title={props.name} label={labels.overview.title} actions={<IssueBadge issues={props.issues} />}>\n <Labeled label={labels.overview.common} hint={labels.overview.commonHint}>\n <Textarea rows={6} value={props.common} onChange={(event) => props.onCommonChange(event.target.value)} />\n </Labeled>\n <div className=\"grid grid-cols-3 gap-2\">\n {count(labels.overview.states, props.counts.states)}\n {count(labels.overview.exits, props.counts.exits)}\n {count(labels.overview.finals, props.counts.finals)}\n </div>\n <div className=\"flex flex-col gap-2\">\n <SectionTitle>{labels.overview.lists}</SectionTitle>\n <StateLinks states={props.states} />\n </div>\n {props.sections}\n </PanelShell>\n );\n}\n\nexport function TandemFlowStatePanel(props: FlowStatePanelProps) {\n const labels = useFlowLabels().editor;\n const { onChange } = props;\n return (\n <PanelShell\n eyebrow={labels.statePanel.title}\n title={props.title || props.stateId}\n label={labels.statePanel.title}\n actions={\n <IconButton label={labels.statePanel.deleteState} onClick={props.onDelete} tone=\"danger\">\n <Trash2 aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n }\n >\n <IssueList issues={props.issues} />\n <Labeled label={labels.statePanel.name}>\n <Input value={props.title} onChange={(event) => onChange({ title: event.target.value })} />\n </Labeled>\n <Labeled label={labels.statePanel.instructions} hint={labels.statePanel.instructionsHint}>\n <Textarea rows={6} value={props.instructions} onChange={(event) => onChange({ instructions: event.target.value })} />\n </Labeled>\n {props.fields.length > 0 && (\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{labels.statePanel.learn}</span>\n <ChipToggles\n items={props.fields.map((field) => ({ id: field.id, title: field.name || field.id }))}\n selected={props.learn}\n onChange={(learn) => onChange({ learn })}\n />\n </div>\n )}\n <div className=\"flex items-center justify-between gap-3\">\n {props.start ? (\n <Badge variant=\"cool\" className=\"gap-1\">\n <Flag aria-hidden=\"true\" className=\"size-3\" />\n {labels.statePanel.isStart}\n </Badge>\n ) : (\n <Button variant=\"secondary\" size=\"sm\" onClick={props.onMakeStart}>\n <Flag aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.statePanel.makeStart}\n </Button>\n )}\n </div>\n\n {props.timing}\n\n <section className=\"flex flex-col gap-3 border-t border-[var(--border)] pt-4\" aria-label={labels.statePanel.exits}>\n <h3 className=\"text-base font-semibold text-[var(--foreground)]\">{labels.statePanel.exits}</h3>\n {props.exits}\n <AddExitButtons onAddExit={props.onAddExit} />\n </section>\n\n <details className=\"group flex flex-col gap-3 border-t border-[var(--border)] pt-4\">\n <summary className=\"cursor-pointer list-none text-sm font-semibold text-[var(--foreground)]\">\n <span className=\"inline-flex items-center gap-1\">\n <ChevronDown aria-hidden=\"true\" className=\"size-4 transition-transform group-open:rotate-180\" />\n {labels.statePanel.more}\n </span>\n </summary>\n <div className=\"mt-3 flex flex-col gap-4\">\n <Labeled label={labels.statePanel.firstMessage}>\n <Textarea\n rows={3}\n value={props.firstMessage ?? \"\"}\n onChange={(event) => onChange({ firstMessage: event.target.value === \"\" ? null : event.target.value })}\n />\n </Labeled>\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{labels.statePanel.tools}</span>\n <span className=\"text-xs text-[var(--foreground-muted)]\">{labels.statePanel.toolsHint}</span>\n {props.catalogTools.length === 0 ? (\n <span className=\"text-xs text-[var(--foreground-subtle)]\">{labels.statePanel.noTools}</span>\n ) : (\n <ChipToggles\n items={props.catalogTools.map((tool) => ({ id: tool, title: tool }))}\n selected={props.tools}\n onChange={(tools) => onChange({ tools })}\n />\n )}\n </div>\n <Labeled label={labels.statePanel.tags}>\n <Input defaultValue={props.tags.join(\", \")} key={props.tags.join(\",\")} onBlur={(event) => onChange({ tags: splitList(event.target.value) })} />\n </Labeled>\n <label className=\"flex items-center justify-between gap-3 text-sm text-[var(--foreground)]\">\n {labels.statePanel.noSideQuestions}\n <Switch checked={props.noSideQuestions} onCheckedChange={(noSideQuestions) => onChange({ noSideQuestions })} />\n </label>\n </div>\n </details>\n </PanelShell>\n );\n}\n\nexport function TandemFlowAnyStatePanel(props: FlowAnyStatePanelProps) {\n const labels = useFlowLabels().editor;\n return (\n <PanelShell eyebrow={labels.board.anyState} title={labels.anyStatePanel.title} label={labels.anyStatePanel.title}>\n <p className=\"text-sm text-[var(--foreground-muted)]\">{labels.anyStatePanel.hint}</p>\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{labels.anyStatePanel.except}</span>\n <ChipToggles items={props.states.map((state) => ({ id: state.stateId, title: state.title }))} selected={props.except} onChange={props.onExceptChange} />\n </div>\n <section className=\"flex flex-col gap-3 border-t border-[var(--border)] pt-4\" aria-label={labels.statePanel.exits}>\n <h3 className=\"text-base font-semibold text-[var(--foreground)]\">{labels.statePanel.exits}</h3>\n {props.exits}\n <AddExitButtons onAddExit={props.onAddExit} />\n </section>\n </PanelShell>\n );\n}\n\nexport function TandemFlowFieldRow(props: FlowFieldRowProps) {\n const labels = useFlowLabels().editor.cardPanel;\n const fieldTypes = useFlowLabels().editor.fieldTypes;\n const exitLabels = useFlowLabels().editor.exitCard;\n const { field, onChange } = props;\n const refresh = \"refreshAfterMonths\" in field ? field.refreshAfterMonths : null;\n return (\n <li\n aria-label={field.name || field.id}\n data-field={field.id}\n className={cn(\n \"flex min-w-0 flex-col gap-2 rounded-[var(--radius-nested)] border bg-[var(--surface)] p-3\",\n props.issues.some((issue) => issue.level === \"error\") ? \"border-[var(--destructive)]\" : \"border-[var(--border)]\",\n )}\n >\n <div className=\"flex items-center gap-1\">\n <Input aria-label={labels.name} value={field.name} onChange={(event) => onChange({ name: event.target.value })} className=\"flex-1\" />\n <IconButton label={exitLabels.moveUp} onClick={props.onMoveUp} disabled={!props.canMoveUp}>\n <ChevronUp aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n <IconButton label={exitLabels.moveDown} onClick={props.onMoveDown} disabled={!props.canMoveDown}>\n <ChevronDown aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n <IconButton label={exitLabels.delete} onClick={props.onDelete} tone=\"danger\">\n <Trash2 aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n </div>\n <Textarea aria-label={labels.about} placeholder={labels.about} rows={2} value={field.about} onChange={(event) => onChange({ about: event.target.value })} />\n <div className=\"grid grid-cols-2 gap-2\">\n <Labeled label={labels.type}>\n <Select value={field.type} onChange={(event) => onChange({ type: event.target.value as (typeof FIELD_TYPES)[number] })}>\n {FIELD_TYPES.map((type) => (\n <option key={type} value={type}>\n {fieldTypes[type]}\n </option>\n ))}\n </Select>\n </Labeled>\n {props.list === \"clientCard\" && (\n <Labeled label={labels.refreshAfter}>\n <Select\n value={refresh === null ? \"\" : String(refresh)}\n onChange={(event) => onChange({ refreshAfterMonths: event.target.value === \"\" ? null : Number(event.target.value) })}\n >\n <option value=\"\">—</option>\n {[1, 3, 6, 12].map((months) => (\n <option key={months} value={months}>\n {labels.refreshAfterMonths(months)}\n </option>\n ))}\n </Select>\n </Labeled>\n )}\n </div>\n {field.type === \"choice\" && (\n <Labeled label={labels.options} hint={labels.optionsHint}>\n <Input\n key={field.options.join(\",\")}\n defaultValue={field.options.join(\", \")}\n onBlur={(event) => onChange({ options: splitList(event.target.value) })}\n />\n </Labeled>\n )}\n <IssueList issues={props.issues} />\n </li>\n );\n}\n\nfunction FieldSection({\n title,\n hint,\n rows,\n onAdd,\n appFields,\n onAddAppField,\n}: {\n title: string;\n hint?: string;\n rows: ReactNode;\n onAdd(): void;\n appFields: Array<{ id: string; title: string }>;\n onAddAppField(fieldId: string): void;\n}) {\n const labels = useFlowLabels().editor.cardPanel;\n return (\n <section className=\"flex flex-col gap-2\" aria-label={title}>\n <SectionTitle>{title}</SectionTitle>\n {hint && <p className=\"text-xs text-[var(--foreground-muted)]\">{hint}</p>}\n <ul className=\"flex flex-col gap-2\">{rows}</ul>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button variant=\"secondary\" size=\"sm\" onClick={onAdd}>\n <Plus aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.addField}\n </Button>\n {appFields.length > 0 && (\n <Select aria-label={`${title}: ${labels.fromApp}`} className=\"h-8 w-auto text-xs\" value=\"\" onChange={(event) => event.target.value && onAddAppField(event.target.value)}>\n <option value=\"\">{labels.fromApp}</option>\n {appFields.map((field) => (\n <option key={field.id} value={field.id}>\n {field.title}\n </option>\n ))}\n </Select>\n )}\n </div>\n </section>\n );\n}\n\nexport function TandemFlowCardPanel(props: FlowCardPanelProps) {\n const labels = useFlowLabels().editor.cardPanel;\n return (\n <PanelShell eyebrow={labels.title} title={labels.title} label={labels.title}>\n {props.empty && <p className=\"text-sm text-[var(--foreground-muted)]\">{labels.empty}</p>}\n <FieldSection\n title={labels.clientCard}\n rows={props.clientCard}\n onAdd={() => props.onAddField(\"clientCard\")}\n appFields={props.appFields}\n onAddAppField={(fieldId) => props.onAddAppField(\"clientCard\", fieldId)}\n />\n <FieldSection\n title={labels.chatNotes}\n hint={labels.chatNotesHint}\n rows={props.chatNotes}\n onAdd={() => props.onAddField(\"chatNotes\")}\n appFields={props.appFields}\n onAddAppField={(fieldId) => props.onAddAppField(\"chatNotes\", fieldId)}\n />\n <section className=\"flex flex-col gap-2 border-t border-[var(--border)] pt-4\">\n <label className=\"flex items-center gap-2 text-sm text-[var(--foreground)]\">\n {labels.pace}\n <Input\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n className=\"w-20\"\n value={props.sideQuestionEveryMessages}\n onChange={(event) => Number(event.target.value) > 0 && props.onPaceChange(Number(event.target.value))}\n />\n </label>\n <p className=\"text-xs text-[var(--foreground-muted)]\">{labels.paceHint}</p>\n </section>\n </PanelShell>\n );\n}\n\nexport function TandemFlowCheckPanel({ issues }: FlowCheckPanelProps) {\n const labels = useFlowLabels().editor.checkPanel;\n const errors = issues.filter((issue) => issue.level === \"error\");\n const warnings = issues.filter((issue) => issue.level === \"warning\");\n const group = (title: string, list: typeof issues, Icon: typeof CircleAlert, tone: string) =>\n list.length > 0 && (\n <section className=\"flex flex-col gap-2\" aria-label={title}>\n <SectionTitle>\n {title} · {list.length}\n </SectionTitle>\n <ul className=\"flex flex-col gap-1.5\">\n {list.map((issue, index) => (\n <li key={`${issue.code}-${index}`}>\n <button\n type=\"button\"\n onClick={issue.onGo}\n className=\"flex w-full items-start gap-2 rounded-[var(--radius-nested)] border border-[var(--border)] bg-[var(--surface)] p-3 text-left text-sm hover:bg-[var(--surface-hover)]\"\n >\n <Icon aria-hidden=\"true\" className={cn(\"mt-0.5 size-4 shrink-0\", tone)} />\n <span className=\"min-w-0 flex-1 break-words text-[var(--foreground)]\">{issue.message}</span>\n <span className=\"shrink-0 text-xs text-[var(--action)]\">{labels.goTo}</span>\n </button>\n </li>\n ))}\n </ul>\n </section>\n );\n return (\n <PanelShell eyebrow={labels.title} title={labels.title} label={labels.title}>\n {issues.length === 0 && <p className=\"text-sm text-[var(--success-text)]\">{labels.clean}</p>}\n {group(labels.errors, errors, CircleAlert, \"text-[var(--destructive-text)]\")}\n {group(labels.warnings, warnings, TriangleAlert, \"text-[var(--warm-text)]\")}\n </PanelShell>\n );\n}\n","import { Button, Input, Switch, Textarea, cn } from \"@tandem/ui\";\nimport type { FlowAfterEnd, FlowDuration, FlowNudges, FlowTimerUnit } from \"@ykurilov/agent-chat-flows/format\";\nimport type {\n DurationUnit,\n FlowNudgesEditorProps,\n FlowScheduleSectionProps,\n FlowSideTasksSectionProps,\n FlowStateTimingProps,\n NudgesMode,\n} from \"@ykurilov/agent-chat-flows/react\";\nimport { capsByDayText, DEFAULT_NUDGES, parseCapsByDay, useFlowLabels } from \"@ykurilov/agent-chat-flows/react\";\nimport { ChevronDown, Clock, Plus, Trash2, X } from \"lucide-react\";\nimport { useState, type ReactNode } from \"react\";\nimport { IssueList } from \"./flow-panels\";\nimport { IconButton, Labeled, SectionTitle, Select } from \"./flow-parts\";\n\n// «Дни и время», касания, «Попутные задачи» и «Длится» ноды. Редкие настройки — под «Дополнительно».\n\nconst TIMER_UNITS: FlowTimerUnit[] = [\"min\", \"h\", \"d\"];\nconst NUDGES_MODES: NudgesMode[] = [\"inherit\", \"own\", \"off\"];\n\n/** Пустое поле — `undefined`, иначе целое число. */\nconst numberOrNone = (text: string) => (text.trim() === \"\" ? undefined : Math.max(0, Math.round(Number(text)) || 0));\n\nfunction More({ title, children }: { title: string; children: ReactNode }) {\n return (\n <details className=\"group flex flex-col gap-3\">\n <summary className=\"cursor-pointer list-none text-sm font-semibold text-[var(--foreground)]\">\n <span className=\"inline-flex items-center gap-1\">\n <ChevronDown aria-hidden=\"true\" className=\"size-4 transition-transform group-open:rotate-180\" />\n {title}\n </span>\n </summary>\n <div className=\"mt-3 flex flex-col gap-4\">{children}</div>\n </details>\n );\n}\n\nfunction SwitchRow({ label, checked, onChange }: { label: string; checked: boolean; onChange(checked: boolean): void }) {\n return (\n <label className=\"flex items-center justify-between gap-3 text-sm text-[var(--foreground)]\">\n {label}\n <Switch checked={checked} onCheckedChange={onChange} />\n </label>\n );\n}\n\n/** «15 мин»: число и единица. */\nfunction DurationInput({ label, value, onChange, onRemove }: { label: string; value: FlowDuration; onChange(value: FlowDuration): void; onRemove?(): void }) {\n const units = useFlowLabels().editor.units;\n const remove = useFlowLabels().editor.nudges.remove;\n return (\n <div className=\"flex items-center gap-1.5\">\n <Input\n aria-label={label}\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n className=\"w-20\"\n value={value.amount}\n onChange={(event) => Number(event.target.value) > 0 && onChange({ ...value, amount: Math.round(Number(event.target.value)) })}\n />\n <Select aria-label={`${label}: ${units[value.unit]}`} className=\"w-24\" value={value.unit} onChange={(event) => onChange({ ...value, unit: event.target.value as FlowTimerUnit })}>\n {TIMER_UNITS.map((unit) => (\n <option key={unit} value={unit}>\n {units[unit]}\n </option>\n ))}\n </Select>\n {onRemove && (\n <IconButton label={remove} onClick={onRemove}>\n <X aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n )}\n </div>\n );\n}\n\nexport function TandemFlowNudgesEditor({ nudges, optional, onChange }: FlowNudgesEditorProps) {\n const labels = useFlowLabels().editor.nudges;\n if (nudges === null) {\n return optional ? <SwitchRow label={labels.on} checked={false} onChange={() => onChange(structuredClone(DEFAULT_NUDGES))} /> : null;\n }\n const set = (patch: Partial<FlowNudges>) => onChange({ ...nudges, ...patch });\n const steps = nudges.afterSilence;\n const daily = nudges.dailyAt ?? [];\n return (\n <div data-flow-nudges=\"\" className=\"flex flex-col gap-3 rounded-[var(--radius-nested)] bg-[var(--surface-muted)] p-3\">\n {optional && <SwitchRow label={labels.on} checked onChange={() => onChange(null)} />}\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{labels.afterSilence}</span>\n {steps.map((step, index) => (\n <DurationInput\n key={index}\n label={`${labels.afterSilence} ${index + 1}`}\n value={step}\n onChange={(next) => set({ afterSilence: steps.map((item, at) => (at === index ? next : item)) })}\n onRemove={() => set({ afterSilence: steps.filter((_, at) => at !== index) })}\n />\n ))}\n <Button variant=\"secondary\" size=\"sm\" className=\"self-start\" onClick={() => set({ afterSilence: [...steps, steps.at(-1) ?? { amount: 1, unit: \"h\" }] })}>\n <Plus aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.addStep}\n </Button>\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{labels.dailyAt}</span>\n {daily.map((at, index) => (\n <div key={index} className=\"flex items-center gap-1.5\">\n <Input\n aria-label={`${labels.dailyAt} ${index + 1}`}\n type=\"time\"\n className=\"w-32\"\n value={at}\n onChange={(event) => event.target.value && set({ dailyAt: daily.map((item, place) => (place === index ? event.target.value : item)) })}\n />\n <IconButton label={labels.remove} onClick={() => set({ dailyAt: daily.filter((_, place) => place !== index) })}>\n <X aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n </div>\n ))}\n <Button variant=\"secondary\" size=\"sm\" className=\"self-start\" onClick={() => set({ dailyAt: [...daily, \"10:00\"] })}>\n <Plus aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.addTime}\n </Button>\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{labels.giveUpAfter}</span>\n {nudges.giveUpAfter ? (\n <DurationInput label={labels.giveUpAfter} value={nudges.giveUpAfter} onChange={(giveUpAfter) => set({ giveUpAfter })} onRemove={() => set({ giveUpAfter: undefined })} />\n ) : (\n <Button variant=\"secondary\" size=\"sm\" className=\"self-start\" onClick={() => set({ giveUpAfter: { amount: 3, unit: \"d\" } })}>\n {labels.never}\n </Button>\n )}\n </div>\n </div>\n );\n}\n\nexport function TandemFlowScheduleSection(props: FlowScheduleSectionProps) {\n const labels = useFlowLabels().editor;\n const text = labels.schedule;\n const { schedule, onChange } = props;\n const afterEnd = (\n <Labeled label={labels.overview.afterEnd} hint={labels.overview.afterEndHints[props.afterEnd]}>\n <Select value={props.afterEnd} onChange={(event) => props.onAfterEndChange(event.target.value as FlowAfterEnd)}>\n {([\"reply\", \"silent\"] as const).map((mode) => (\n <option key={mode} value={mode}>\n {labels.overview.afterEndModes[mode]}\n </option>\n ))}\n </Select>\n </Labeled>\n );\n return (\n <section aria-label={text.title} data-flow-schedule=\"\" className=\"flex flex-col gap-3 border-t border-[var(--border)] pt-4\">\n <h3 className=\"inline-flex items-center gap-1.5 text-base font-semibold text-[var(--foreground)]\">\n <Clock aria-hidden=\"true\" className=\"size-4 text-[var(--warm)]\" />\n {text.title}\n </h3>\n <SwitchRow label={text.on} checked={schedule !== null} onChange={props.onToggle} />\n <p className=\"text-xs text-[var(--foreground-muted)]\">{text.hint}</p>\n <IssueList issues={props.issues} />\n {schedule && (\n <>\n <div className=\"grid grid-cols-2 gap-2\">\n <Labeled label={text.dayStart} hint={text.dayStartHint}>\n <Input type=\"time\" value={schedule.dayStart} onChange={(event) => event.target.value && onChange({ dayStart: event.target.value })} />\n </Labeled>\n <Labeled label={text.lengthDays}>\n <Input\n type=\"number\"\n min={1}\n max={60}\n inputMode=\"numeric\"\n placeholder={text.lengthDaysNone}\n value={schedule.lengthDays ?? \"\"}\n onChange={(event) => onChange({ lengthDays: numberOrNone(event.target.value) || undefined })}\n />\n </Labeled>\n </div>\n {schedule.lengthDays !== undefined && (\n <>\n <Labeled label={text.deadlineState}>\n <Select value={schedule.deadlineState ?? \"\"} onChange={(event) => onChange({ deadlineState: event.target.value || undefined })}>\n <option value=\"\">{text.deadlineNone}</option>\n {props.states.map((state) => (\n <option key={state.value} value={state.value}>\n {state.title}\n </option>\n ))}\n </Select>\n </Labeled>\n <SwitchRow label={text.farewell} checked={schedule.farewellOnDeadline} onChange={(farewellOnDeadline) => onChange({ farewellOnDeadline })} />\n {schedule.farewellOnDeadline && (\n <Labeled label={text.farewellText} hint={text.farewellTextHint}>\n <Textarea rows={3} value={schedule.farewellText ?? \"\"} onChange={(event) => onChange({ farewellText: event.target.value })} />\n </Labeled>\n )}\n </>\n )}\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{text.nudges}</span>\n <span className=\"text-xs text-[var(--foreground-muted)]\">{text.nudgesHint}</span>\n {props.nudges}\n </div>\n </>\n )}\n <More title={text.more}>\n {schedule && (\n <>\n <div className=\"grid grid-cols-2 gap-2\">\n <Labeled label={text.nightFrom}>\n <Input type=\"time\" value={schedule.nightFrom ?? \"\"} onChange={(event) => onChange({ nightFrom: event.target.value || undefined })} />\n </Labeled>\n <Labeled label={text.lateStart}>\n <Input\n type=\"number\"\n min={0}\n inputMode=\"numeric\"\n value={schedule.lateStartHours}\n onChange={(event) => onChange({ lateStartHours: numberOrNone(event.target.value) ?? 0 })}\n />\n </Labeled>\n </div>\n <p className=\"-mt-2 text-xs text-[var(--foreground-muted)]\">\n {text.nightFromHint} {text.lateStartHint}\n </p>\n <div className=\"flex flex-col gap-2\">\n <SectionTitle>{text.firstMessages}</SectionTitle>\n <Labeled label={text.maxPerDay} hint={text.maxPerDayHint}>\n <Input\n type=\"number\"\n min={0}\n inputMode=\"numeric\"\n value={schedule.firstMessages?.maxPerDay ?? \"\"}\n onChange={(event) => onChange({ firstMessages: { ...schedule.firstMessages, maxPerDay: numberOrNone(event.target.value) } })}\n />\n </Labeled>\n <Labeled label={text.maxPerDayByDay} hint={text.maxPerDayByDayHint}>\n <CapsByDayInput\n caps={schedule.firstMessages?.maxPerDayByDay}\n onChange={(maxPerDayByDay) => onChange({ firstMessages: { ...schedule.firstMessages, maxPerDayByDay } })}\n />\n </Labeled>\n <SwitchRow\n label={text.morning}\n checked={schedule.firstMessages?.morning ?? schedule.lengthDays !== undefined}\n onChange={(morning) => onChange({ firstMessages: { ...schedule.firstMessages, morning } })}\n />\n <Labeled label={text.skipMorning}>\n <Input\n type=\"number\"\n min={0}\n inputMode=\"numeric\"\n placeholder=\"180\"\n value={schedule.firstMessages?.skipMorningIfHumanWithinMin ?? \"\"}\n onChange={(event) => onChange({ firstMessages: { ...schedule.firstMessages, skipMorningIfHumanWithinMin: numberOrNone(event.target.value) } })}\n />\n </Labeled>\n </div>\n <div className=\"flex flex-col gap-2\">\n <SectionTitle>{text.dayFrame}</SectionTitle>\n <p className=\"text-xs text-[var(--foreground-muted)]\">{text.dayFrameHint}</p>\n <div className=\"grid grid-cols-2 gap-2\">\n <Labeled label={text.softFrom}>\n <Input\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n value={schedule.dayFrame?.softFrom ?? \"\"}\n onChange={(event) => onChange({ dayFrame: { ...schedule.dayFrame, softFrom: numberOrNone(event.target.value) || undefined } })}\n />\n </Labeled>\n <Labeled label={text.hardAt}>\n <Input\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n value={schedule.dayFrame?.hardAt ?? \"\"}\n onChange={(event) => onChange({ dayFrame: { ...schedule.dayFrame, hardAt: numberOrNone(event.target.value) || undefined } })}\n />\n </Labeled>\n </div>\n {schedule.dayFrame?.hardAt !== undefined && (\n <Labeled label={text.hardText} hint={text.hardTextHint}>\n <Textarea rows={2} value={schedule.dayFrame.hardText ?? \"\"} onChange={(event) => onChange({ dayFrame: { ...schedule.dayFrame, hardText: event.target.value } })} />\n </Labeled>\n )}\n </div>\n </>\n )}\n {afterEnd}\n </More>\n </section>\n );\n}\n\nexport function TandemFlowSideTasksSection(props: FlowSideTasksSectionProps) {\n const editorLabels = useFlowLabels().editor;\n const labels = editorLabels.sideTasks;\n const own = props.fields.filter((field) => !field.fromApp);\n const fromApp = props.fields.filter((field) => field.fromApp);\n return (\n <section aria-label={labels.title} data-flow-side-tasks=\"\" className=\"flex flex-col gap-3 border-t border-[var(--border)] pt-4\">\n <h3 className=\"text-base font-semibold text-[var(--foreground)]\">{labels.title}</h3>\n <p className=\"text-xs text-[var(--foreground-muted)]\">{labels.hint}</p>\n {props.builtInCity && <p className=\"rounded-[var(--radius-small)] bg-[var(--cool-soft)] px-3 py-2 text-xs text-[var(--cool-text)]\">{labels.builtIn}</p>}\n <ul className=\"flex flex-col gap-2\">\n {props.tasks.map((task) => (\n <li\n key={task.id}\n data-side-task={task.id}\n aria-label={task.text || task.id}\n className={cn(\n \"flex min-w-0 flex-col gap-2 rounded-[var(--radius-nested)] border bg-[var(--surface)] p-3\",\n task.issues.some((issue) => issue.level === \"error\") ? \"border-[var(--destructive)]\" : \"border-[var(--border)]\",\n task.focused && \"ring-2 ring-[var(--focus-ring)]\",\n )}\n >\n <div className=\"flex items-start gap-1\">\n <Textarea\n aria-label={labels.text}\n placeholder={labels.text}\n rows={2}\n className=\"flex-1\"\n value={task.text}\n onChange={(event) => props.onChange(task.id, { text: event.target.value })}\n />\n <IconButton label={labels.delete} onClick={() => props.onDelete(task.id)} tone=\"danger\">\n <Trash2 aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n </div>\n <Labeled label={labels.field}>\n <Select value={task.field ?? \"\"} onChange={(event) => props.onFieldChange(task.id, event.target.value || null)}>\n <option value=\"\">{labels.noField}</option>\n {own.map((field) => (\n <option key={field.id} value={field.id}>\n {field.title}\n </option>\n ))}\n {fromApp.length > 0 && (\n <optgroup label={labels.fromApp}>\n {fromApp.map((field) => (\n <option key={field.id} value={field.id}>\n {field.title}\n </option>\n ))}\n </optgroup>\n )}\n </Select>\n </Labeled>\n <More title={editorLabels.schedule.more}>\n <Labeled label={labels.when}>\n <Input value={task.when ?? \"\"} onChange={(event) => props.onChange(task.id, { when: event.target.value })} />\n </Labeled>\n <label className=\"flex items-center gap-2 text-sm text-[var(--foreground)]\">\n {labels.maxAttempts}\n <Input\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n className=\"w-20\"\n value={task.maxAttempts}\n onChange={(event) => Number(event.target.value) > 0 && props.onChange(task.id, { maxAttempts: Number(event.target.value) })}\n />\n </label>\n <SwitchRow label={labels.perConversation} checked={task.perConversation} onChange={(perConversation) => props.onChange(task.id, { perConversation })} />\n </More>\n <IssueList issues={task.issues} />\n </li>\n ))}\n </ul>\n <Button variant=\"secondary\" size=\"sm\" onClick={props.onAdd} className=\"self-start\">\n <Plus aria-hidden=\"true\" className=\"size-3.5\" />\n {labels.add}\n </Button>\n </section>\n );\n}\n\nexport function TandemFlowStateTiming(props: FlowStateTimingProps) {\n const labels = useFlowLabels().editor.statePanel;\n const { duration } = props;\n const units: DurationUnit[] = props.daysAvailable ? [\"h\", \"d\", \"program_day\"] : [\"h\"];\n // «3 дней», но «до дня программы 3»: номер дня — после варианта.\n const amount = duration && (\n <Input\n aria-label={`${labels.duration}: ${labels.durationUnits[duration.unit]}`}\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n className=\"w-20\"\n value={duration.amount}\n onChange={(event) => Number(event.target.value) > 0 && props.onDurationChange({ amount: Number(event.target.value), unit: duration.unit })}\n />\n );\n return (\n <section aria-label={labels.duration} data-flow-state-timing=\"\" className=\"flex flex-col gap-3 border-t border-[var(--border)] pt-4\">\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{labels.duration}</span>\n <div className=\"flex items-center gap-1.5\">\n {duration?.unit !== \"program_day\" && amount}\n <Select\n aria-label={labels.duration}\n className={duration ? (duration.unit === \"program_day\" ? \"w-44\" : \"w-28\") : undefined}\n value={duration?.unit ?? \"\"}\n onChange={(event) => {\n const unit = event.target.value as DurationUnit | \"\";\n props.onDurationChange(unit === \"\" ? null : { amount: duration?.amount ?? 1, unit });\n }}\n >\n <option value=\"\">{labels.durationNone}</option>\n {units.map((unit) => (\n <option key={unit} value={unit}>\n {labels.durationUnits[unit]}\n </option>\n ))}\n </Select>\n {duration?.unit === \"program_day\" && amount}\n </div>\n <span className=\"text-xs text-[var(--foreground-muted)]\">{labels.durationHint}</span>\n </div>\n {duration && (\n <Labeled label={labels.durationTo}>\n <Select value={duration.to ?? \"\"} onChange={(event) => props.onDurationTargetChange(event.target.value || null)}>\n <option value=\"\">—</option>\n {props.targets.map((target) => (\n <option key={target.value} value={target.value}>\n {target.title}\n </option>\n ))}\n </Select>\n </Labeled>\n )}\n <IssueList issues={props.issues} />\n <div className=\"flex flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{labels.nudges}</span>\n <div role=\"radiogroup\" aria-label={labels.nudges} className=\"flex flex-wrap gap-1.5\">\n {NUDGES_MODES.map((mode) => (\n <button\n key={mode}\n type=\"button\"\n role=\"radio\"\n aria-checked={props.nudgesMode === mode}\n onClick={() => props.onNudgesModeChange(mode)}\n className={cn(\n \"min-h-8 rounded-full border px-3 text-xs font-medium transition-colors\",\n props.nudgesMode === mode\n ? \"border-[var(--action)] bg-[var(--cool-soft)] text-[var(--cool-text)]\"\n : \"border-[var(--border)] bg-[var(--surface)] text-[var(--foreground-muted)] hover:bg-[var(--surface-hover)]\",\n )}\n >\n {labels.nudgesModes[mode]}\n </button>\n ))}\n </div>\n <span className=\"text-xs text-[var(--foreground-muted)]\">{labels.nudgesHint}</span>\n {props.nudges}\n {props.nudgesMode === \"own\" && (\n <NudgesDays\n days={props.nudgesDays}\n untilProgramDay={props.nudgesUntilProgramDay}\n onDaysChange={props.onNudgesDaysChange}\n onUntilProgramDayChange={props.onNudgesUntilProgramDayChange}\n />\n )}\n </div>\n </section>\n );\n}\n\n/** «Свои касания действуют»: всё время в ноде, N дней, считая день входа, или до дня программы N включительно. */\nfunction NudgesDays(props: {\n days: number | null;\n untilProgramDay: number | null;\n onDaysChange(days: number | null): void;\n onUntilProgramDayChange(day: number | null): void;\n}) {\n const labels = useFlowLabels().editor.statePanel;\n const mode = props.untilProgramDay !== null ? \"untilProgramDay\" : props.days !== null ? \"days\" : \"always\";\n const value = mode === \"untilProgramDay\" ? props.untilProgramDay : props.days;\n const setValue = mode === \"untilProgramDay\" ? props.onUntilProgramDayChange : props.onDaysChange;\n const setMode = (next: string) => {\n props.onDaysChange(next === \"days\" ? 1 : null);\n props.onUntilProgramDayChange(next === \"untilProgramDay\" ? 1 : null);\n };\n return (\n <div data-flow-nudges-days=\"\" className=\"flex flex-col gap-1.5\">\n <span className=\"text-sm font-medium text-[var(--foreground)]\">{labels.nudgesDays}</span>\n <div className=\"flex items-center gap-1.5\">\n {value !== null && mode !== \"always\" && (\n <Input\n aria-label={`${labels.nudgesDays}: ${labels.nudgesDaysModes[mode]}`}\n type=\"number\"\n min={1}\n inputMode=\"numeric\"\n className=\"w-20\"\n value={value}\n onChange={(event) => Number(event.target.value) > 0 && setValue(Number(event.target.value))}\n />\n )}\n <Select aria-label={labels.nudgesDays} value={mode} onChange={(event) => setMode(event.target.value)}>\n <option value=\"always\">{labels.nudgesDaysModes.always}</option>\n <option value=\"days\">{labels.nudgesDaysModes.days}</option>\n <option value=\"untilProgramDay\">{labels.nudgesDaysModes.untilProgramDay}</option>\n </Select>\n </div>\n {mode === \"days\" && <span className=\"text-xs text-[var(--foreground-muted)]\">{labels.nudgesDaysHint}</span>}\n {mode === \"untilProgramDay\" && (\n <span className=\"text-xs text-[var(--foreground-muted)]\">\n {labels.nudgesUntilProgramDayHint} {labels.nudgesDaysHint}\n </span>\n )}\n </div>\n );\n}\n\n/** Потолок по дням программы: «3, 2». Черновик поля живёт, пока он не число списком; пустое — без потолка по дням. */\nfunction CapsByDayInput({ caps, onChange }: { caps: number[] | undefined; onChange(caps: number[] | undefined): void }) {\n const [draft, setDraft] = useState<string | null>(null);\n const shown = draft ?? capsByDayText(caps);\n return (\n <Input\n inputMode=\"numeric\"\n placeholder=\"3, 2\"\n value={shown}\n aria-invalid={draft !== null && parseCapsByDay(draft) === null}\n onChange={(event) => {\n setDraft(event.target.value);\n const parsed = parseCapsByDay(event.target.value);\n if (parsed !== null) onChange(parsed);\n }}\n onBlur={() => setDraft(null)}\n />\n );\n}\n","import { Button, Input, cn } from \"@tandem/ui\";\nimport type { FlowRunPanelProps } from \"@ykurilov/agent-chat-flows/react\";\nimport { useFlowLabels } from \"@ykurilov/agent-chat-flows/react\";\nimport { ArrowRight, MessageCircleQuestion, RotateCcw, Undo2 } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\nimport { IconButton, KindIcon, PanelShell, SectionTitle } from \"./flow-parts\";\n\n/** Поле «что агент знает»: пишется по уходу с поля или Enter, чтобы прогон не прыгал на каждую букву. */\nfunction KnownInput({ value, label, placeholder, onChange }: { value: string | null; label: string; placeholder: string; onChange(value: string): void }) {\n const [draft, setDraft] = useState(value ?? \"\");\n useEffect(() => setDraft(value ?? \"\"), [value]);\n return (\n <Input\n aria-label={label}\n value={draft}\n placeholder={placeholder}\n onChange={(event) => setDraft(event.target.value)}\n onBlur={() => draft !== (value ?? \"\") && onChange(draft)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") event.currentTarget.blur();\n }}\n className=\"h-9\"\n />\n );\n}\n\n/** Прогон: где агент, «что произошло?» с целями от движка, «ничего из этого», что агент знает, путь. */\nexport function TandemFlowRunPanel(props: FlowRunPanelProps) {\n const labels = useFlowLabels().editor;\n const run = labels.runPanel;\n return (\n <PanelShell\n eyebrow={run.step(props.path.length)}\n title={run.current}\n label={run.title}\n actions={\n <>\n <IconButton label={run.back} onClick={props.onBack} disabled={!props.canGoBack}>\n <Undo2 aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n <IconButton label={run.restart} onClick={props.onRestart}>\n <RotateCcw aria-hidden=\"true\" className=\"size-4\" />\n </IconButton>\n </>\n }\n >\n <div data-run-current={props.current.stateId} className=\"rounded-[var(--radius-panel)] border border-[var(--warm-border)] bg-[var(--warm-soft)] p-4\">\n <p className=\"break-words text-lg font-semibold text-[var(--foreground)]\">{props.current.title}</p>\n {props.current.goal && <p className=\"mt-1 break-words text-sm text-[var(--foreground-muted)]\">{props.current.goal}</p>}\n </div>\n\n <section className=\"flex flex-col gap-2\" aria-label={run.whatHappened}>\n <SectionTitle>{run.whatHappened}</SectionTitle>\n <ul className=\"flex flex-col gap-1.5\">\n {props.choices.map((choice) => (\n <li key={choice.exitId}>\n <button\n type=\"button\"\n onClick={choice.onChoose}\n disabled={choice.target === null}\n data-choice={choice.exitId}\n className=\"flex w-full items-start gap-3 rounded-[var(--radius-nested)] border border-[var(--border)] bg-[var(--surface)] p-3 text-left hover:border-[var(--action)] hover:bg-[var(--surface-hover)] disabled:cursor-not-allowed disabled:opacity-55\"\n >\n <KindIcon kind={choice.kind} className=\"mt-0.5 size-4\" />\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"break-words text-sm text-[var(--foreground)]\">{choice.text}</span>\n <span className={cn(\"inline-flex items-center gap-1 text-xs\", choice.target === null ? \"text-[var(--destructive-text)]\" : \"text-[var(--foreground-muted)]\")}>\n <ArrowRight aria-hidden=\"true\" className=\"size-3\" />\n {choice.target ?? run.wontFire}\n </span>\n </span>\n </button>\n </li>\n ))}\n <li>\n <button\n type=\"button\"\n onClick={props.onNothing}\n className=\"flex w-full items-start gap-3 rounded-[var(--radius-nested)] border border-dashed border-[var(--border-strong)] bg-[var(--surface)] p-3 text-left hover:bg-[var(--surface-hover)]\"\n >\n <ArrowRight aria-hidden=\"true\" className=\"mt-0.5 size-4 text-[var(--foreground-subtle)]\" />\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"text-sm text-[var(--foreground)]\">{run.nothing}</span>\n <span className=\"text-xs text-[var(--foreground-muted)]\">→ {run.stay}</span>\n </span>\n </button>\n </li>\n </ul>\n </section>\n\n {props.nextQuestion && (\n <p className=\"flex items-start gap-2 rounded-[var(--radius-nested)] bg-[var(--cool-soft)] p-3 text-sm text-[var(--cool-text)]\">\n <MessageCircleQuestion aria-hidden=\"true\" className=\"mt-0.5 size-4 shrink-0\" />\n <span>\n {run.nextQuestion}: <strong className=\"font-semibold\">{props.nextQuestion}</strong>\n </span>\n </p>\n )}\n\n {props.known.length > 0 && (\n <section className=\"flex flex-col gap-2\" aria-label={run.known}>\n <SectionTitle>{run.known}</SectionTitle>\n <ul className=\"flex flex-col gap-1.5\">\n {props.known.map((field) => (\n <li key={field.fieldId} className=\"grid grid-cols-[minmax(0,2fr)_minmax(0,3fr)] items-center gap-2\">\n <span className={cn(\"truncate text-sm\", field.stale ? \"text-[var(--warm-text)]\" : \"text-[var(--foreground)]\")}>{field.name}</span>\n <KnownInput value={field.value} label={field.name} placeholder={run.notYet} onChange={field.onChange} />\n </li>\n ))}\n </ul>\n </section>\n )}\n\n <section className=\"flex flex-col gap-2\" aria-label={run.path}>\n <SectionTitle>{run.path}</SectionTitle>\n <ol className=\"flex flex-col gap-1 text-sm\">\n {props.path.map((step, index) => (\n <li key={`${step.stateId}-${index}`} className=\"flex min-w-0 items-baseline gap-2\">\n <span className=\"w-5 shrink-0 text-right tabular-nums text-xs text-[var(--foreground-subtle)]\">{index + 1}</span>\n <span className=\"min-w-0 break-words\">\n <span className=\"text-[var(--foreground)]\">{step.title}</span>\n {step.via && <span className=\"text-xs text-[var(--foreground-muted)]\"> · {step.via}</span>}\n </span>\n </li>\n ))}\n </ol>\n </section>\n\n <Button variant=\"secondary\" onClick={props.onFinish} className=\"self-start\">\n {run.finish}\n </Button>\n </PanelShell>\n );\n}\n","import { Alert, Badge, Button, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from \"@tandem/ui\";\nimport type { FlowMigrateDialogProps } from \"@ykurilov/agent-chat-flows/react\";\nimport { useFlowLabels } from \"@ykurilov/agent-chat-flows/react\";\nimport { Select } from \"./flow-parts\";\n\n/** Окно «Перевести чаты на новую версию»: версия → состояние → чатов, для удалённых состояний — куда перевести. */\nexport function TandemFlowMigrateDialog(props: FlowMigrateDialogProps) {\n const labels = useFlowLabels().migrate;\n const nothing = !props.busy && props.rows.length === 0 && props.moved === null && !props.failed;\n return (\n <Dialog open onOpenChange={(open) => !open && props.onClose()}>\n <DialogContent className=\"w-[min(640px,calc(100vw-24px))] max-w-none\">\n <DialogHeader>\n <DialogTitle>{labels.title}</DialogTitle>\n <DialogDescription>{labels.hint}</DialogDescription>\n </DialogHeader>\n {nothing && <p className=\"text-sm text-[var(--foreground-muted)]\">{labels.nothingToMigrate}</p>}\n {props.rows.length > 0 && (\n <div className=\"max-h-[50vh] overflow-auto\">\n <table className=\"w-full border-collapse text-sm\">\n <thead>\n <tr className=\"text-left text-xs text-[var(--foreground-subtle)]\">\n <th className=\"py-1.5 pr-2 font-medium\">{labels.version}</th>\n <th className=\"py-1.5 pr-2 font-medium\">{labels.state}</th>\n <th className=\"py-1.5 pr-2 text-right font-medium\">{labels.chats}</th>\n <th className=\"py-1.5 font-medium\">{labels.target}</th>\n </tr>\n </thead>\n <tbody>\n {props.rows.map((row) => (\n <tr key={`${row.versionId}:${row.stateId}`} className=\"border-t border-[var(--border)] align-middle\">\n <td className=\"py-2 pr-2 font-mono text-xs text-[var(--foreground-muted)]\">{row.versionId}</td>\n <td className=\"py-2 pr-2\">\n <span className=\"text-[var(--foreground)]\">{row.stateTitle}</span>\n {row.removed && (\n <Badge variant=\"warm\" className=\"ml-1.5 py-0 text-[11px]\">\n {labels.removed}\n </Badge>\n )}\n </td>\n <td className=\"py-2 pr-2 text-right tabular-nums\">{row.chats}</td>\n <td className=\"py-2\">\n {row.removed ? (\n <Select aria-label={labels.target} value={row.target ?? \"\"} onChange={(event) => row.onTargetChange(event.target.value)}>\n <option value=\"\" disabled>\n {labels.chooseTarget}\n </option>\n {props.targets.map((target) => (\n <option key={target.value} value={target.value}>\n {target.title}\n </option>\n ))}\n </Select>\n ) : (\n <span className=\"text-[var(--foreground-subtle)]\">{row.stateTitle}</span>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n {props.moved !== null && <Alert variant=\"success\" title={labels.moved(props.moved)} />}\n {props.failed && <Alert variant=\"danger\" title={labels.failed} />}\n <DialogFooter>\n <Button variant=\"ghost\" onClick={props.onClose}>\n {labels.close}\n </Button>\n <Button onClick={props.onMigrate} disabled={!props.canMigrate} loading={props.busy}>\n {labels.migrate}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import type { FlowEditorSkin } from \"@ykurilov/agent-chat-flows/react\";\nimport { TandemFlowAnyStateNode, TandemFlowBoardToggle, TandemFlowEdge, TandemFlowLegend, TandemFlowStateNode, TandemFlowZoomControls } from \"./flow-board-parts\";\nimport { TandemFlowJsonDialog, TandemFlowTestChatFrame } from \"./flow-dialogs\";\nimport { TandemFlowExitCard } from \"./flow-exit-card\";\nimport { TandemFlowEditorFrame, TandemFlowHeader } from \"./flow-frame\";\nimport {\n TandemFlowAnyStatePanel,\n TandemFlowCardPanel,\n TandemFlowCheckPanel,\n TandemFlowFieldRow,\n TandemFlowOverviewPanel,\n TandemFlowStatePanel,\n} from \"./flow-panels\";\nimport { TandemFlowNudgesEditor, TandemFlowScheduleSection, TandemFlowSideTasksSection, TandemFlowStateTiming } from \"./flow-days\";\nimport { TandemFlowRunPanel } from \"./flow-run-panel\";\nimport { TandemFlowMigrateDialog } from \"./migrate-dialog\";\n\n/** Скин редактора сценария (договор `FlowEditorSkin` v1) по прототипу: для `FlowEditor`. */\nexport const tandemFlowEditorSkin: FlowEditorSkin = {\n FlowEditorFrame: TandemFlowEditorFrame,\n FlowHeader: TandemFlowHeader,\n FlowStateNode: TandemFlowStateNode,\n FlowAnyStateNode: TandemFlowAnyStateNode,\n FlowEdge: TandemFlowEdge,\n FlowLegend: TandemFlowLegend,\n FlowZoomControls: TandemFlowZoomControls,\n FlowBoardToggle: TandemFlowBoardToggle,\n FlowOverviewPanel: TandemFlowOverviewPanel,\n FlowStatePanel: TandemFlowStatePanel,\n FlowAnyStatePanel: TandemFlowAnyStatePanel,\n FlowExitCard: TandemFlowExitCard,\n FlowCardPanel: TandemFlowCardPanel,\n FlowFieldRow: TandemFlowFieldRow,\n FlowCheckPanel: TandemFlowCheckPanel,\n FlowRunPanel: TandemFlowRunPanel,\n FlowJsonDialog: TandemFlowJsonDialog,\n FlowMigrateDialog: TandemFlowMigrateDialog,\n FlowTestChatFrame: TandemFlowTestChatFrame,\n FlowScheduleSection: TandemFlowScheduleSection,\n FlowSideTasksSection: TandemFlowSideTasksSection,\n FlowStateTiming: TandemFlowStateTiming,\n FlowNudgesEditor: TandemFlowNudgesEditor,\n};\n"],"mappings":"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","names":["cn","useFlowLabels","Clock","jsx","jsxs","useFlowLabels","cn","Clock","Button","useFlowLabels","useState","useFlowLabels","Clock","jsx","jsxs","useFlowLabels","Clock","jsx","jsxs","useFlowLabels","useState","Button","Input","cn","useFlowLabels","jsx","jsxs","useFlowLabels","cn","Input","Button","cn","useFlowLabels","Plus","Shuffle","useEffect","useState","Button","useRef","useState","jsx","jsxs","jsx","jsxs","cn","useState","useEffect","useFlowLabels","Plus","Shuffle","Button","Badge","Button","Input","Textarea","cn","useFlowLabels","ChevronDown","ChevronUp","Flag","Plus","Trash2","jsx","jsxs","KINDS","cn","useFlowLabels","Flag","Button","Plus","Textarea","Trash2","Input","Badge","ChevronDown","ChevronUp","Button","Input","Switch","Textarea","cn","useFlowLabels","ChevronDown","Clock","Plus","Trash2","X","useState","Fragment","jsx","jsxs","ChevronDown","Switch","useFlowLabels","Input","X","Button","Plus","Clock","Textarea","cn","Trash2","useState","Button","Input","cn","useFlowLabels","RotateCcw","Undo2","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","Input","useFlowLabels","Undo2","RotateCcw","cn","Button","Badge","Button","Dialog","DialogContent","DialogFooter","DialogHeader","DialogTitle","useFlowLabels","jsx","jsxs","useFlowLabels","Dialog","DialogContent","DialogHeader","DialogTitle","Badge","DialogFooter","Button"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ykurilov/agent-chat-skin-tandem",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.67.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -64,28 +64,28 @@
|
|
|
64
64
|
"mdast-util-from-markdown": "^2.0.3",
|
|
65
65
|
"mdast-util-gfm": "^3.1.0",
|
|
66
66
|
"micromark-extension-gfm": "^3.0.0",
|
|
67
|
-
"@ykurilov/agent-chat-react": "0.
|
|
67
|
+
"@ykurilov/agent-chat-react": "0.67.0"
|
|
68
68
|
},
|
|
69
69
|
"peerDependencies": {
|
|
70
70
|
"react": "^19.3.0",
|
|
71
|
-
"@ykurilov/agent-chat-messengers": "^0.
|
|
72
|
-
"@ykurilov/agent-chat-sandbox": "^0.
|
|
73
|
-
"@ykurilov/agent-chat-flows": "^0.
|
|
74
|
-
"@ykurilov/agent-chat-skills": "^0.
|
|
75
|
-
"@ykurilov/agent-chat-mcp": "^0.
|
|
71
|
+
"@ykurilov/agent-chat-messengers": "^0.67.0",
|
|
72
|
+
"@ykurilov/agent-chat-sandbox": "^0.67.0",
|
|
73
|
+
"@ykurilov/agent-chat-flows": "^0.67.0",
|
|
74
|
+
"@ykurilov/agent-chat-skills": "^0.67.0",
|
|
75
|
+
"@ykurilov/agent-chat-mcp": "^0.67.0"
|
|
76
76
|
},
|
|
77
77
|
"devDependencies": {
|
|
78
78
|
"@testing-library/react": "^16.3.3",
|
|
79
79
|
"@types/react": "^19.3.0",
|
|
80
80
|
"jsdom": "^30.1.1",
|
|
81
81
|
"react": "^19.3.0",
|
|
82
|
-
"@ykurilov/agent-chat-attachments": "0.
|
|
83
|
-
"@ykurilov/agent-chat-flows": "0.
|
|
84
|
-
"@ykurilov/agent-chat-mcp": "0.
|
|
85
|
-
"@ykurilov/agent-chat-messengers": "0.
|
|
86
|
-
"@ykurilov/agent-chat-
|
|
87
|
-
"@ykurilov/agent-chat-
|
|
88
|
-
"@ykurilov/agent-chat-web-tools": "0.
|
|
82
|
+
"@ykurilov/agent-chat-attachments": "0.67.0",
|
|
83
|
+
"@ykurilov/agent-chat-flows": "0.67.0",
|
|
84
|
+
"@ykurilov/agent-chat-mcp": "0.67.0",
|
|
85
|
+
"@ykurilov/agent-chat-messengers": "0.67.0",
|
|
86
|
+
"@ykurilov/agent-chat-sandbox": "0.67.0",
|
|
87
|
+
"@ykurilov/agent-chat-skills": "0.67.0",
|
|
88
|
+
"@ykurilov/agent-chat-web-tools": "0.67.0"
|
|
89
89
|
},
|
|
90
90
|
"peerDependenciesMeta": {
|
|
91
91
|
"@ykurilov/agent-chat-sandbox": {
|