@ykurilov/agent-chat-flows 0.0.0-stage → 0.55.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.
Files changed (151) hide show
  1. package/CHANGELOG.md +252 -0
  2. package/LICENSE +21 -0
  3. package/README.md +124 -2
  4. package/agent-flow.schema.json +1020 -0
  5. package/dist/chunk-3PTJI2XY.js +100 -0
  6. package/dist/chunk-3PTJI2XY.js.map +1 -0
  7. package/dist/chunk-BNMQUNSI.js +9 -0
  8. package/dist/chunk-BNMQUNSI.js.map +1 -0
  9. package/dist/chunk-BOV6FJGU.js +1288 -0
  10. package/dist/chunk-BOV6FJGU.js.map +1 -0
  11. package/dist/chunk-CKY5KG7N.js +165 -0
  12. package/dist/chunk-CKY5KG7N.js.map +1 -0
  13. package/dist/chunk-DCTRMCGV.js +34 -0
  14. package/dist/chunk-DCTRMCGV.js.map +1 -0
  15. package/dist/format.js +147 -0
  16. package/dist/format.js.map +1 -0
  17. package/dist/index.js +3197 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/postgres.js +387 -0
  20. package/dist/postgres.js.map +1 -0
  21. package/dist/react.js +2650 -0
  22. package/dist/react.js.map +1 -0
  23. package/dist/sqlite.js +319 -0
  24. package/dist/sqlite.js.map +1 -0
  25. package/dist/types/check/app-checks.d.ts +16 -0
  26. package/dist/types/check/check-flow.d.ts +8 -0
  27. package/dist/types/check/index.d.ts +2 -0
  28. package/dist/types/engine/data-conditions.d.ts +10 -0
  29. package/dist/types/engine/day-frame.d.ts +17 -0
  30. package/dist/types/engine/first-messages.d.ts +21 -0
  31. package/dist/types/engine/flow-days.d.ts +39 -0
  32. package/dist/types/engine/flow-graph.d.ts +26 -0
  33. package/dist/types/engine/flow-run.d.ts +130 -0
  34. package/dist/types/engine/index.d.ts +14 -0
  35. package/dist/types/engine/migrate-run.d.ts +11 -0
  36. package/dist/types/engine/next-transition.d.ts +40 -0
  37. package/dist/types/engine/nudges.d.ts +78 -0
  38. package/dist/types/engine/run-updates.d.ts +37 -0
  39. package/dist/types/engine/side-questions.d.ts +26 -0
  40. package/dist/types/engine/side-tasks.d.ts +44 -0
  41. package/dist/types/engine/targets.d.ts +9 -0
  42. package/dist/types/engine/timers.d.ts +61 -0
  43. package/dist/types/engine/zoned-time.d.ts +27 -0
  44. package/dist/types/format/catalog-events.d.ts +5 -0
  45. package/dist/types/format/compact-flow.d.ts +8 -0
  46. package/dist/types/format/flow-format.d.ts +286 -0
  47. package/dist/types/format/flow-json-schema.d.ts +2 -0
  48. package/dist/types/format/flow-schema.d.ts +605 -0
  49. package/dist/types/format/index.d.ts +7 -0
  50. package/dist/types/format/migrate-flow.d.ts +4 -0
  51. package/dist/types/format/parse-flow.d.ts +6 -0
  52. package/dist/types/format.d.ts +3 -0
  53. package/dist/types/index.d.ts +4 -0
  54. package/dist/types/labels/client-card.d.ts +20 -0
  55. package/dist/types/labels/editor.d.ts +261 -0
  56. package/dist/types/labels/index.d.ts +14 -0
  57. package/dist/types/labels/migrate.d.ts +19 -0
  58. package/dist/types/labels/test-chat.d.ts +28 -0
  59. package/dist/types/not-yet.d.ts +2 -0
  60. package/dist/types/postgres.d.ts +10 -0
  61. package/dist/types/prompt/client-card-block.d.ts +16 -0
  62. package/dist/types/prompt/flow-rules.d.ts +9 -0
  63. package/dist/types/prompt/rules/after-end.d.ts +3 -0
  64. package/dist/types/prompt/rules/client-facts.d.ts +2 -0
  65. package/dist/types/prompt/rules/day-frame.d.ts +2 -0
  66. package/dist/types/prompt/rules/link-views.d.ts +4 -0
  67. package/dist/types/prompt/rules/rule-part.d.ts +3 -0
  68. package/dist/types/prompt/rules/side-tasks.d.ts +2 -0
  69. package/dist/types/prompt/rules/time-zone.d.ts +2 -0
  70. package/dist/types/prompt/state-card.d.ts +14 -0
  71. package/dist/types/react/client-card/client-card-panel.d.ts +8 -0
  72. package/dist/types/react/client-card/index.d.ts +2 -0
  73. package/dist/types/react/client-card/use-client-card.d.ts +19 -0
  74. package/dist/types/react/client-card-skin.d.ts +27 -0
  75. package/dist/types/react/editor/board-space.d.ts +51 -0
  76. package/dist/types/react/editor/board-styles.d.ts +1 -0
  77. package/dist/types/react/editor/editor-model.d.ts +60 -0
  78. package/dist/types/react/editor/exit-text.d.ts +11 -0
  79. package/dist/types/react/editor/flow-board.d.ts +11 -0
  80. package/dist/types/react/editor/flow-editor.d.ts +13 -0
  81. package/dist/types/react/editor/flow-simulation.d.ts +44 -0
  82. package/dist/types/react/editor/index.d.ts +6 -0
  83. package/dist/types/react/editor/schedule-model.d.ts +47 -0
  84. package/dist/types/react/editor/side-task-model.d.ts +18 -0
  85. package/dist/types/react/editor/use-flow-editor.d.ts +120 -0
  86. package/dist/types/react/flow-editor-skin.d.ts +453 -0
  87. package/dist/types/react/flow-labels.d.ts +8 -0
  88. package/dist/types/react/index.d.ts +6 -0
  89. package/dist/types/react/test-chat/flow-test-chat.d.ts +22 -0
  90. package/dist/types/react/test-chat/index.d.ts +2 -0
  91. package/dist/types/react/test-chat/use-flow-test-chat.d.ts +50 -0
  92. package/dist/types/react.d.ts +3 -0
  93. package/dist/types/runtime/admit.d.ts +15 -0
  94. package/dist/types/runtime/agent-flow.d.ts +20 -0
  95. package/dist/types/runtime/client-card.d.ts +9 -0
  96. package/dist/types/runtime/client-facts.d.ts +22 -0
  97. package/dist/types/runtime/close-day-tool.d.ts +3 -0
  98. package/dist/types/runtime/decisions-client.d.ts +33 -0
  99. package/dist/types/runtime/extra-tool.d.ts +16 -0
  100. package/dist/types/runtime/first-message-retry.d.ts +4 -0
  101. package/dist/types/runtime/first-message-rules.d.ts +55 -0
  102. package/dist/types/runtime/first-reasons-notice.d.ts +9 -0
  103. package/dist/types/runtime/flow-delivery.d.ts +53 -0
  104. package/dist/types/runtime/flow-events.d.ts +126 -0
  105. package/dist/types/runtime/flow-finish.d.ts +68 -0
  106. package/dist/types/runtime/flow-known-texts.d.ts +11 -0
  107. package/dist/types/runtime/flow-signals.d.ts +12 -0
  108. package/dist/types/runtime/flow-timers.d.ts +55 -0
  109. package/dist/types/runtime/flow-tools.d.ts +23 -0
  110. package/dist/types/runtime/flow-types.d.ts +547 -0
  111. package/dist/types/runtime/held-messages.d.ts +25 -0
  112. package/dist/types/runtime/index.d.ts +11 -0
  113. package/dist/types/runtime/judge-context.d.ts +36 -0
  114. package/dist/types/runtime/judge.d.ts +21 -0
  115. package/dist/types/runtime/migrate-chats.d.ts +20 -0
  116. package/dist/types/runtime/note-tools.d.ts +15 -0
  117. package/dist/types/runtime/pause.d.ts +21 -0
  118. package/dist/types/runtime/prepare-turn.d.ts +12 -0
  119. package/dist/types/runtime/side-task-tool.d.ts +5 -0
  120. package/dist/types/runtime/step-tail.d.ts +11 -0
  121. package/dist/types/runtime/tail/day-line.d.ts +2 -0
  122. package/dist/types/runtime/tail/frame-line.d.ts +2 -0
  123. package/dist/types/runtime/tail/side-tasks-line.d.ts +2 -0
  124. package/dist/types/runtime/tail/tail-part.d.ts +21 -0
  125. package/dist/types/runtime/test-clock.d.ts +26 -0
  126. package/dist/types/runtime/time-zone-tool.d.ts +3 -0
  127. package/dist/types/runtime/turn-gate.d.ts +8 -0
  128. package/dist/types/sqlite.d.ts +9 -0
  129. package/dist/types/store/flow-store-shared.d.ts +20 -0
  130. package/dist/types/store/flow-store.d.ts +240 -0
  131. package/dist/types/store/memory.d.ts +3 -0
  132. package/dist/types/store/migration-settings.d.ts +7 -0
  133. package/dist/types/store/postgres-schema.d.ts +775 -0
  134. package/dist/types/store/postgres.d.ts +15 -0
  135. package/dist/types/store/sqlite-schema.d.ts +824 -0
  136. package/dist/types/store/sqlite.d.ts +9 -0
  137. package/drizzle/postgres/0000_init.sql +45 -0
  138. package/drizzle/postgres/0001_days_pause_side_tasks.sql +21 -0
  139. package/drizzle/postgres/0002_chat_placement.sql +1 -0
  140. package/drizzle/postgres/meta/0000_snapshot.json +317 -0
  141. package/drizzle/postgres/meta/0001_snapshot.json +439 -0
  142. package/drizzle/postgres/meta/0002_snapshot.json +445 -0
  143. package/drizzle/postgres/meta/_journal.json +27 -0
  144. package/drizzle/sqlite/0000_init.sql +44 -0
  145. package/drizzle/sqlite/0001_days_pause_side_tasks.sql +21 -0
  146. package/drizzle/sqlite/0002_chat_placement.sql +1 -0
  147. package/drizzle/sqlite/meta/0000_snapshot.json +297 -0
  148. package/drizzle/sqlite/meta/0001_snapshot.json +427 -0
  149. package/drizzle/sqlite/meta/0002_snapshot.json +434 -0
  150. package/drizzle/sqlite/meta/_journal.json +27 -0
  151. package/package.json +98 -3
@@ -0,0 +1,453 @@
1
+ import type { ComponentType, CSSProperties, ReactNode } from "react";
2
+ import type { ClientCardField, FlowAfterEnd, FlowCondition, FlowConditionType, FlowDataOp, FlowField, FlowIssue, FlowNudges, FlowSchedule, FlowSideTask } from "../format/flow-format.js";
3
+ import type { DurationUnit, NudgesMode, SchedulePatch } from "./editor/schedule-model.js";
4
+ import type { SideTaskPatch } from "./editor/side-task-model.js";
5
+ export type { DurationUnit, NudgesMode, SchedulePatch, SideTaskPatch };
6
+ /** Вид стрелки: по виду условия или «назад». */
7
+ export type FlowEdgeKind = FlowConditionType | "return";
8
+ /** Что открыто: правка, проверка графа, прогон. */
9
+ export type FlowEditorMode = "edit" | "check" | "run";
10
+ /** Сколько у места ошибок и замечаний проверки. */
11
+ export interface FlowIssueCount {
12
+ errors: number;
13
+ warnings: number;
14
+ }
15
+ /** Строка условия на карточке состояния. */
16
+ export interface FlowExitRowView {
17
+ exitId: string;
18
+ kind: FlowEdgeKind;
19
+ /** Готовая подпись условия: «Понятны тема курса и продажи», «Тишина человека 3 ч». */
20
+ text: string;
21
+ /** Название цели; `null` — цель не выбрана. «Назад» — `kind: "return"`. */
22
+ target: string | null;
23
+ issues: FlowIssueCount;
24
+ }
25
+ /** Где узел в прогоне. */
26
+ export type FlowRunMark = "current" | "visited" | null;
27
+ export interface FlowStateNodeProps {
28
+ stateId: string;
29
+ title: string;
30
+ /** Первая строка инструкции. */
31
+ goal: string;
32
+ exits: FlowExitRowView[];
33
+ tags: string[];
34
+ start: boolean;
35
+ /** Без условий выхода — конец сценария. */
36
+ final: boolean;
37
+ noSideQuestions: boolean;
38
+ /** «Длится» и свои касания одной строкой: «1 день · касания 15 мин · 1 ч»; пусто — нечего показать. */
39
+ timing: string;
40
+ selected: boolean;
41
+ /** Приглушить: в прогоне или при выборе стрелки узел не участвует. */
42
+ dimmed: boolean;
43
+ run: FlowRunMark;
44
+ issues: FlowIssueCount;
45
+ /** Ручка входа доски: поставить на край карточки. */
46
+ renderInputHandle(): ReactNode;
47
+ /** Ручка выхода доски для строки условия. */
48
+ renderExitHandle(exitId: string): ReactNode;
49
+ onSelect(): void;
50
+ }
51
+ /** Узел «Из любого состояния»: общие переходы. */
52
+ export interface FlowAnyStateNodeProps {
53
+ /** Названия состояний-исключений. */
54
+ except: string[];
55
+ exits: FlowExitRowView[];
56
+ selected: boolean;
57
+ dimmed: boolean;
58
+ issues: FlowIssueCount;
59
+ renderExitHandle(exitId: string): ReactNode;
60
+ onSelect(): void;
61
+ }
62
+ export interface FlowEdgeProps {
63
+ edgeId: string;
64
+ kind: FlowEdgeKind;
65
+ /** Путь SVG (`d`), посчитан доской. */
66
+ path: string;
67
+ /** Где поставить подпись, если скин её рисует. */
68
+ labelX: number;
69
+ labelY: number;
70
+ label: string;
71
+ selected: boolean;
72
+ dimmed: boolean;
73
+ /** Пройдена в прогоне. */
74
+ traversed: boolean;
75
+ onSelect(): void;
76
+ }
77
+ export interface FlowLegendProps {
78
+ kinds: FlowEdgeKind[];
79
+ }
80
+ export interface FlowZoomControlsProps {
81
+ /** 1 — как есть. */
82
+ zoom: number;
83
+ onZoomIn(): void;
84
+ onZoomOut(): void;
85
+ onFit(): void;
86
+ }
87
+ export interface FlowHeaderProps {
88
+ name: string;
89
+ onRename(name: string): void;
90
+ mode: FlowEditorMode;
91
+ onModeChange(mode: FlowEditorMode): void;
92
+ issues: FlowIssueCount;
93
+ onAddState(): void;
94
+ onOpenCard(): void;
95
+ onOpenJson(): void;
96
+ /** Есть, если приложение передало `onSave`. */
97
+ onSave?(): void;
98
+ saving: boolean;
99
+ dirty: boolean;
100
+ /** Приложение отказало в сохранении (без исключения или с ним): вместо «Сохранено» показать отказ. */
101
+ saveFailed?: boolean;
102
+ /** Только просмотр: показать плашку, не давать добавлять состояния и переименовывать. */
103
+ readOnly?: boolean;
104
+ /** Есть, если приложение подключило перевод чатов и тестовый чат. */
105
+ onOpenMigrate?(): void;
106
+ onOpenTestChat?(): void;
107
+ /** Узкая шапка: одна строка кнопок, без логотипа и названия сценария (приложение показывает своё). */
108
+ compact?: boolean;
109
+ /** Кнопка «На весь экран» / «Выйти»; нет — кнопки нет. */
110
+ fullscreen?: {
111
+ active: boolean;
112
+ onToggle(): void;
113
+ };
114
+ }
115
+ /** Строка списка в обзоре и панелях: состояние, на которое можно перейти. */
116
+ export interface FlowStateLinkView {
117
+ stateId: string;
118
+ title: string;
119
+ start: boolean;
120
+ final: boolean;
121
+ onSelect(): void;
122
+ }
123
+ export interface FlowOverviewPanelProps {
124
+ name: string;
125
+ /** «Общее для всех состояний». */
126
+ common: string;
127
+ onCommonChange(common: string): void;
128
+ counts: {
129
+ states: number;
130
+ exits: number;
131
+ finals: number;
132
+ };
133
+ states: FlowStateLinkView[];
134
+ issues: FlowIssueCount;
135
+ /** Разделы «Дни и время» и «Попутные задачи» (части скина ниже); нет частей — пусто. */
136
+ sections?: ReactNode;
137
+ }
138
+ /** Раздел «Дни и время» в обзоре. Редкое — в «Дополнительно». */
139
+ export interface FlowScheduleSectionProps {
140
+ /** `null` — сценарий без дней. */
141
+ schedule: FlowSchedule | null;
142
+ /** Что делать с сообщением после конца разговора; поля нет — `reply`. */
143
+ afterEnd: FlowAfterEnd;
144
+ /** Куда перейти при «срок вышел». */
145
+ states: FlowTargetOption[];
146
+ /** Находки проверки по «Дням и времени». */
147
+ issues: FlowIssue[];
148
+ /** Касания по умолчанию: `FlowNudgesEditor`. */
149
+ nudges: ReactNode;
150
+ onToggle(on: boolean): void;
151
+ onChange(patch: SchedulePatch): void;
152
+ onAfterEndChange(mode: FlowAfterEnd): void;
153
+ }
154
+ /** Расписание касаний: ряд сроков тишины, потом время каждый день, срок «молчит — конец». */
155
+ export interface FlowNudgesEditorProps {
156
+ /** `null` — касаний нет (только для общих касаний сценария). */
157
+ nudges: FlowNudges | null;
158
+ /** Можно выключить совсем: для общих касаний — да, у ноды за это отвечает режим. */
159
+ optional: boolean;
160
+ onChange(nudges: FlowNudges | null): void;
161
+ }
162
+ /** Раздел «Попутные задачи» в обзоре. */
163
+ export interface FlowSideTasksSectionProps {
164
+ tasks: Array<FlowSideTask & {
165
+ issues: FlowIssue[];
166
+ focused: boolean;
167
+ }>;
168
+ /** Поля карточки и заметок, плюс поля приложения (`fromApp`), которых в сценарии ещё нет. */
169
+ fields: Array<{
170
+ id: string;
171
+ title: string;
172
+ fromApp: boolean;
173
+ }>;
174
+ /** Заданы «Дни и время»: есть встроенная задача «узнать город». */
175
+ builtInCity: boolean;
176
+ onAdd(): void;
177
+ onChange(sideTaskId: string, patch: SideTaskPatch): void;
178
+ onFieldChange(sideTaskId: string, fieldId: string | null): void;
179
+ onDelete(sideTaskId: string): void;
180
+ }
181
+ /** «Длится» и «Касания» в панели ноды. */
182
+ export interface FlowStateTimingProps {
183
+ /** Выход-продолжительность; `null` — не ограничено. */
184
+ duration: {
185
+ amount: number;
186
+ unit: DurationUnit;
187
+ to: string | null;
188
+ } | null;
189
+ /** Дни и «до дня N программы» есть только при «Днях и времени»; иначе — часы. */
190
+ daysAvailable: boolean;
191
+ targets: FlowTargetOption[];
192
+ /** Находки по выходу-продолжительности. */
193
+ issues: FlowIssue[];
194
+ onDurationChange(value: {
195
+ amount: number;
196
+ unit: DurationUnit;
197
+ } | null): void;
198
+ onDurationTargetChange(to: string | null): void;
199
+ nudgesMode: NudgesMode;
200
+ onNudgesModeChange(mode: NudgesMode): void;
201
+ /** Свои касания: `FlowNudgesEditor`; режим не «свои» — `null`. */
202
+ nudges: ReactNode | null;
203
+ /** Свои касания действуют столько дней, считая день входа; `null` — всё время в ноде. С 0.55. */
204
+ nudgesDays: number | null;
205
+ onNudgesDaysChange(days: number | null): void;
206
+ }
207
+ /** Цель перехода в списке «Куда»: состояние или «назад». */
208
+ export interface FlowTargetOption {
209
+ /** `id` состояния или `@return`. */
210
+ value: string;
211
+ title: string;
212
+ }
213
+ /** Карточка условия в панели состояния или общих переходов. */
214
+ export interface FlowExitCardProps {
215
+ exitId: string;
216
+ when: FlowCondition;
217
+ to: string | null;
218
+ /** Поля карточки и заметок — для условия по данным. */
219
+ fields: FlowField[];
220
+ /** Какие сравнения подходят к выбранному полю. */
221
+ ops: FlowDataOp[];
222
+ /** Имена, объявленные приложением: кнопки и события, инструменты. */
223
+ eventNames: {
224
+ button: string[];
225
+ tool: string[];
226
+ app: string[];
227
+ };
228
+ /** Подписи кнопок и событий от приложения: имя → подпись. Нет подписи — показывать имя. С 0.55. */
229
+ eventLabels?: Readonly<Record<string, string>>;
230
+ targets: FlowTargetOption[];
231
+ issues: FlowIssue[];
232
+ canMoveUp: boolean;
233
+ canMoveDown: boolean;
234
+ onChange(next: {
235
+ when: FlowCondition;
236
+ to: string | null;
237
+ }): void;
238
+ onMoveUp(): void;
239
+ onMoveDown(): void;
240
+ onDelete(): void;
241
+ }
242
+ export interface FlowStatePanelProps {
243
+ stateId: string;
244
+ title: string;
245
+ instructions: string;
246
+ firstMessage: string | null;
247
+ learn: string[];
248
+ tools: string[];
249
+ tags: string[];
250
+ start: boolean;
251
+ noSideQuestions: boolean;
252
+ /** Из чего выбирать «Узнать» и инструменты. */
253
+ fields: FlowField[];
254
+ catalogTools: string[];
255
+ /** Карточки условий: скин кладёт их в раздел «Когда выходить и куда». */
256
+ exits: ReactNode;
257
+ /** «Длится» и «Касания» (`FlowStateTiming`); нет части скина — пусто. */
258
+ timing?: ReactNode;
259
+ issues: FlowIssue[];
260
+ onChange(patch: {
261
+ title?: string;
262
+ instructions?: string;
263
+ firstMessage?: string | null;
264
+ learn?: string[];
265
+ tools?: string[];
266
+ tags?: string[];
267
+ noSideQuestions?: boolean;
268
+ }): void;
269
+ onMakeStart(): void;
270
+ onAddExit(kind: FlowConditionType): void;
271
+ onDelete(): void;
272
+ }
273
+ export interface FlowAnyStatePanelProps {
274
+ except: string[];
275
+ states: FlowStateLinkView[];
276
+ onExceptChange(stateIds: string[]): void;
277
+ exits: ReactNode;
278
+ onAddExit(kind: FlowConditionType): void;
279
+ }
280
+ /** Поле карточки или заметки в панели «Карточка и заметки». */
281
+ export interface FlowFieldRowProps {
282
+ field: FlowField | ClientCardField;
283
+ list: "clientCard" | "chatNotes";
284
+ canMoveUp: boolean;
285
+ canMoveDown: boolean;
286
+ issues: FlowIssue[];
287
+ onChange(patch: Partial<ClientCardField>): void;
288
+ onMoveUp(): void;
289
+ onMoveDown(): void;
290
+ onDelete(): void;
291
+ }
292
+ export interface FlowCardPanelProps {
293
+ /** Строки полей: `FlowFieldRow` по порядку. */
294
+ clientCard: ReactNode;
295
+ chatNotes: ReactNode;
296
+ empty: boolean;
297
+ sideQuestionEveryMessages: number;
298
+ onPaceChange(messages: number): void;
299
+ onAddField(list: "clientCard" | "chatNotes"): void;
300
+ /** Поля словаря приложения (`catalog.fields`), которых в сценарии ещё нет. */
301
+ appFields: Array<{
302
+ id: string;
303
+ title: string;
304
+ }>;
305
+ onAddAppField(list: "clientCard" | "chatNotes", fieldId: string): void;
306
+ }
307
+ export interface FlowCheckPanelProps {
308
+ issues: Array<FlowIssue & {
309
+ onGo(): void;
310
+ }>;
311
+ }
312
+ /** Выбор «что произошло» в прогоне: условие текущего состояния или общее. */
313
+ export interface FlowRunChoiceView {
314
+ exitId: string;
315
+ kind: FlowEdgeKind;
316
+ text: string;
317
+ target: string | null;
318
+ onChoose(): void;
319
+ }
320
+ export interface FlowRunPanelProps {
321
+ current: {
322
+ stateId: string;
323
+ title: string;
324
+ goal: string;
325
+ };
326
+ choices: FlowRunChoiceView[];
327
+ onNothing(): void;
328
+ /** Что агент знает: поле, значение строкой или `null`, устарело ли. */
329
+ known: Array<{
330
+ fieldId: string;
331
+ name: string;
332
+ value: string | null;
333
+ stale: boolean;
334
+ onChange(value: string): void;
335
+ }>;
336
+ /** Название поля, о котором агент спросит между делом; `null` — ни о чём. */
337
+ nextQuestion: string | null;
338
+ path: Array<{
339
+ stateId: string;
340
+ title: string;
341
+ via: string | null;
342
+ }>;
343
+ canGoBack: boolean;
344
+ onBack(): void;
345
+ onRestart(): void;
346
+ onFinish(): void;
347
+ }
348
+ export interface FlowJsonDialogProps {
349
+ json: string;
350
+ /** Ошибки разбора загруженного JSON, готовыми строками. */
351
+ errors: string[];
352
+ onCopy(): void;
353
+ onDownload(): void;
354
+ onLoad(text: string): void;
355
+ onClose(): void;
356
+ /** Только просмотр: JSON можно смотреть, копировать и скачивать, но не загружать. */
357
+ readOnly?: boolean;
358
+ }
359
+ export interface FlowMigrateDialogProps {
360
+ rows: Array<{
361
+ versionId: string;
362
+ stateId: string;
363
+ stateTitle: string;
364
+ chats: number;
365
+ /** Состояния нет в новой версии: нужна цель. */
366
+ removed: boolean;
367
+ target: string | null;
368
+ onTargetChange(stateId: string): void;
369
+ }>;
370
+ targets: FlowTargetOption[];
371
+ busy: boolean;
372
+ failed: boolean;
373
+ /** Сколько перевели; `null` — ещё не переводили. */
374
+ moved: number | null;
375
+ canMigrate: boolean;
376
+ onMigrate(): void;
377
+ onClose(): void;
378
+ }
379
+ export interface FlowTestChatFrameProps {
380
+ stateTitle: string;
381
+ /** Сдвиг часов чата, готовой строкой («+1 ч 20 мин»). */
382
+ clock: string;
383
+ /** Варианты перемотки: подпись и сколько мс. */
384
+ advanceSteps: Array<{
385
+ label: string;
386
+ ms: number;
387
+ }>;
388
+ onAdvance(ms: number): void;
389
+ /** «День 2 из 3 · 14:20»; `null` — у сценария нет «Дней и времени» или ходов ещё не было. */
390
+ day: string | null;
391
+ /** К началу следующего дня сценария; нет — кнопки нет (нет «Дней и времени» или приложение не дало перемотку). */
392
+ onNextDay?(): void;
393
+ /** Идёт запуск чата или перемотка: кнопки перемотки ждут. */
394
+ busy: boolean;
395
+ /** Чат не открылся или часы не перемотались. */
396
+ failed: boolean;
397
+ onReset(): void;
398
+ onClose(): void;
399
+ /** Сам чат (экран чата приложения); `null` — чат ещё создаётся. */
400
+ children: ReactNode;
401
+ }
402
+ /** Раскладка редактора: шапка, доска и панель справа (`null` — панель закрыта). */
403
+ export interface FlowEditorFrameProps {
404
+ header: ReactNode;
405
+ board: ReactNode;
406
+ panel: ReactNode | null;
407
+ /** Окно поверх: JSON, перевод чатов, тестовый чат. */
408
+ dialog: ReactNode | null;
409
+ /** Класс и стиль корня, которые приложение передало в `FlowEditor`. Корень сам занимает высоту родителя, не меньше разумной. */
410
+ className?: string;
411
+ style?: CSSProperties;
412
+ /** Шапка в одну узкую строку. */
413
+ compact?: boolean;
414
+ }
415
+ /** Маленькая кнопка на доске или в шапке: свернуть и развернуть легенду, мини-карту, панель «Сценарий». */
416
+ export interface FlowBoardToggleProps {
417
+ kind: "legend" | "minimap" | "inspector";
418
+ /** Что сделает нажатие: «Показать мини-карту», «Скрыть панель «Сценарий»». */
419
+ label: string;
420
+ /** Показывается сейчас то, чем кнопка управляет. */
421
+ expanded: boolean;
422
+ /** С подписью рядом со значком (легенда), без неё — только значок. */
423
+ showText?: boolean;
424
+ onClick(): void;
425
+ }
426
+ /** Договор скина редактора сценария, версия 1. */
427
+ export interface FlowEditorSkin {
428
+ FlowEditorFrame: ComponentType<FlowEditorFrameProps>;
429
+ FlowHeader: ComponentType<FlowHeaderProps>;
430
+ FlowStateNode: ComponentType<FlowStateNodeProps>;
431
+ FlowAnyStateNode: ComponentType<FlowAnyStateNodeProps>;
432
+ FlowEdge: ComponentType<FlowEdgeProps>;
433
+ FlowLegend: ComponentType<FlowLegendProps>;
434
+ FlowZoomControls: ComponentType<FlowZoomControlsProps>;
435
+ FlowOverviewPanel: ComponentType<FlowOverviewPanelProps>;
436
+ FlowStatePanel: ComponentType<FlowStatePanelProps>;
437
+ FlowAnyStatePanel: ComponentType<FlowAnyStatePanelProps>;
438
+ FlowExitCard: ComponentType<FlowExitCardProps>;
439
+ FlowCardPanel: ComponentType<FlowCardPanelProps>;
440
+ FlowFieldRow: ComponentType<FlowFieldRowProps>;
441
+ FlowCheckPanel: ComponentType<FlowCheckPanelProps>;
442
+ FlowRunPanel: ComponentType<FlowRunPanelProps>;
443
+ FlowJsonDialog: ComponentType<FlowJsonDialogProps>;
444
+ FlowMigrateDialog: ComponentType<FlowMigrateDialogProps>;
445
+ FlowTestChatFrame: ComponentType<FlowTestChatFrameProps>;
446
+ /** Кнопки места на доске. Нет — доска рисует простые кнопки на токенах `--flow-board-*`. */
447
+ FlowBoardToggle?: ComponentType<FlowBoardToggleProps>;
448
+ /** Части формата v2 (сценарии 0.49). Нет — разделов нет, остальное работает. */
449
+ FlowScheduleSection?: ComponentType<FlowScheduleSectionProps>;
450
+ FlowSideTasksSection?: ComponentType<FlowSideTasksSectionProps>;
451
+ FlowStateTiming?: ComponentType<FlowStateTimingProps>;
452
+ FlowNudgesEditor?: ComponentType<FlowNudgesEditorProps>;
453
+ }
@@ -0,0 +1,8 @@
1
+ import type { ReactNode } from "react";
2
+ import { type FlowLabels } from "../labels/index.js";
3
+ /** Надписи экранов сценария; по умолчанию русские (`russianFlowLabels`). */
4
+ export declare function FlowLabelsProvider({ labels, children }: {
5
+ labels: FlowLabels;
6
+ children: ReactNode;
7
+ }): import("react").FunctionComponentElement<import("react").ProviderProps<FlowLabels>>;
8
+ export declare function useFlowLabels(): FlowLabels;
@@ -0,0 +1,6 @@
1
+ export { FlowLabelsProvider, useFlowLabels } from "./flow-labels.js";
2
+ export type * from "./flow-editor-skin.js";
3
+ export type * from "./client-card-skin.js";
4
+ export * from "./editor/index.js";
5
+ export * from "./client-card/index.js";
6
+ export * from "./test-chat/index.js";
@@ -0,0 +1,22 @@
1
+ import type { FlowDayInfo } from "../../engine/flow-days.js";
2
+ import { type FlowTestChatLabels } from "../../labels/test-chat.js";
3
+ import { type FlowEditorProps } from "../editor/flow-editor.js";
4
+ import { type FlowTestChatConnection } from "./use-flow-test-chat.js";
5
+ /** Варианты перемотки по умолчанию: 20 минут, 3 часа, сутки. */
6
+ export declare const DEFAULT_ADVANCE_STEPS: readonly number[];
7
+ /** Длительность словами: «1 д 3 ч 20 мин». */
8
+ export declare function formatDuration(ms: number, units: FlowTestChatLabels["units"]): string;
9
+ /** Сдвиг часов тестового чата готовой строкой: «как сейчас», «+3 ч 20 мин». */
10
+ export declare function formatClockOffset(ms: number, labels?: FlowTestChatLabels): string;
11
+ /** Строка дня тестового чата: «День 2 из 3 · 14:20» по часам чата в поясе человека; дней нет — `null`. */
12
+ export declare function formatDayLine(day: FlowDayInfo | null | undefined, at: number, timeZone: string, labels?: FlowTestChatLabels): string | null;
13
+ export interface FlowTestChatProps extends FlowEditorProps {
14
+ testChat: FlowTestChatConnection;
15
+ /** Варианты перемотки, мс. По умолчанию `DEFAULT_ADVANCE_STEPS`. */
16
+ advanceSteps?: readonly number[];
17
+ }
18
+ /**
19
+ * Редактор сценария с тестовым чатом: автор пишет агенту рядом с доской, видит текущее состояние и перематывает часы
20
+ * чата, чтобы проверить таймеры без ожидания. Сервер и экран чата даёт приложение (`testChat`).
21
+ */
22
+ export declare function FlowTestChat({ testChat, advanceSteps, skin, ...editor }: FlowTestChatProps): import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ export { DEFAULT_ADVANCE_STEPS, FlowTestChat, formatClockOffset, formatDayLine, formatDuration, type FlowTestChatProps } from "./flow-test-chat.js";
2
+ export { useFlowTestChat, type FlowTestChatConnection, type FlowTestChatController } from "./use-flow-test-chat.js";
@@ -0,0 +1,50 @@
1
+ import { type ReactNode } from "react";
2
+ import type { FlowDayInfo } from "../../engine/flow-days.js";
3
+ import type { FlowRun } from "../../engine/flow-run.js";
4
+ import type { AgentFlow } from "../../format/flow-format.js";
5
+ /** Что тестовому чату нужно от приложения: сервер и экран чата. Редактор не знает, где сервер. */
6
+ export interface FlowTestChatConnection {
7
+ /** Новый тестовый чат по сценарию из редактора: сервер создаёт его с `flowTestChatData()`. */
8
+ start(flow: AgentFlow): Promise<{
9
+ chatId: string;
10
+ }>;
11
+ /** Промотать часы чата: на сервере `flow.advanceTestClock`. */
12
+ advance(chatId: string, ms: number): Promise<{
13
+ timeOffset: number;
14
+ }>;
15
+ /**
16
+ * Промотать часы к началу следующего дня сценария: на сервере `flow.advanceTestClock({ chatId, to: "next_day_start" })`.
17
+ * Нет — кнопки «К началу следующего дня» нет.
18
+ */
19
+ advanceToNextDay?(chatId: string): Promise<{
20
+ timeOffset: number;
21
+ }>;
22
+ /** Место чата: на сервере `flow.readRun`. В браузер посетителя место не уходит, доска читает его отдельно. */
23
+ readRun(chatId: string): Promise<(Pick<FlowRun, "state" | "path"> & {
24
+ day?: FlowDayInfo;
25
+ }) | null>;
26
+ /** Экран чата приложения: `<AgentChat api=… chatId={chatId} skin=… />`. */
27
+ renderChat(chatId: string): ReactNode;
28
+ }
29
+ export interface FlowTestChatController {
30
+ opened: boolean;
31
+ chatId: string | null;
32
+ /** Сдвиг часов чата, мс. */
33
+ timeOffset: number;
34
+ busy: boolean;
35
+ failed: boolean;
36
+ /** Где чат на доске; пока ходов нет — старт сценария. */
37
+ stateId: string | null;
38
+ /** Пройденные состояния, без текущего. */
39
+ visited: ReadonlySet<string>;
40
+ /** День сценария чата; `null` — у сценария нет «Дней и времени» или ходов ещё не было. */
41
+ day: FlowDayInfo | null;
42
+ open(): void;
43
+ close(): void;
44
+ reset(): void;
45
+ advance(ms: number): void;
46
+ /** К началу следующего дня сценария; `null` — приложение не дало `advanceToNextDay`. */
47
+ nextDay: (() => void) | null;
48
+ }
49
+ /** Логика тестового чата редактора: открыть, перемотать, начать заново, подсветка состояния. */
50
+ export declare function useFlowTestChat(connection: FlowTestChatConnection, flow: AgentFlow): FlowTestChatController;
@@ -0,0 +1,3 @@
1
+ export * from "./react/index.js";
2
+ export { englishFlowLabels, russianFlowLabels } from "./labels/index.js";
3
+ export type { ClientCardLabels, FlowEditorLabels, FlowLabels, FlowMigrateLabels, FlowTestChatLabels } from "./labels/index.js";
@@ -0,0 +1,15 @@
1
+ import type { FlowAdmitDecision, FlowAdmitInput, FlowPort } from "./flow-types.js";
2
+ import { type FlowRuntime } from "./flow-events.js";
3
+ export type FlowAdmit = (input: FlowAdmitInput) => Promise<FlowAdmitDecision>;
4
+ /**
5
+ * Решение для сообщения, которое только пришло: оно ещё не посчитано в `run.dayCounts` (счёт ведёт ход, а сообщение
6
+ * без хода — «промолчать» — не считается). Поэтому оно `счёт + 1`-е за день: на `hardAt`-м — готовая фраза один раз,
7
+ * дальше — молчание до начала следующего дня, а в его начале — ответ на накопленное. Без рамок дня, паузы и конца разговора — `answer`, как в 0.48.
8
+ */
9
+ export declare function createFlowAdmit({ runtime, port }: {
10
+ runtime: FlowRuntime;
11
+ port: (chat: {
12
+ ownerId: string;
13
+ chatId: string;
14
+ }) => Promise<FlowPort>;
15
+ }): FlowAdmit;
@@ -0,0 +1,20 @@
1
+ import type { AgentFlowHandle, AgentFlowOptions, ChatMigrator, ClientCardTools, FirstMessageRules, FlowJudge, FlowTimers } from "./flow-types.js";
2
+ /** Модули других частей сценария; тесты подменяют их подделками. Нет — создаются по настройкам при первом обращении. */
3
+ export interface FlowModules {
4
+ judge?: FlowJudge;
5
+ timers?: FlowTimers;
6
+ firstMessages?: FirstMessageRules | null;
7
+ clientCard?: ClientCardTools;
8
+ migrator?: ChatMigrator;
9
+ }
10
+ export interface BuiltAgentFlow extends AgentFlowHandle {
11
+ /** Дождаться фоновой работы: судья после хода, доставка точного первого текста, `onTransition`. Для тестов и остановки. */
12
+ settled(): Promise<void>;
13
+ }
14
+ /** Сборка сценария с подменяемыми модулями. Приложению — `createAgentFlow`. */
15
+ export declare function buildAgentFlow(options: AgentFlowOptions, modules?: FlowModules): BuiltAgentFlow;
16
+ /**
17
+ * Сценарий поведения агента для службы чата. Подключение:
18
+ * `const { service } = createChatServer(flow.withChat({ agent, chatInstructions, afterTurn, … }))`, затем `flow.attach(service)`.
19
+ */
20
+ export declare function createAgentFlow(options: AgentFlowOptions): AgentFlowHandle;
@@ -0,0 +1,9 @@
1
+ import type { FlowStore } from "../store/flow-store.js";
2
+ import type { ClientCardStore, ClientCardTools } from "./flow-types.js";
3
+ /**
4
+ * Карточка клиента: чтение, запись агентом, «стереть поле» и «стереть всё». Есть `adapter` — всё лежит в хранилище
5
+ * приложения (читается, пишется и стирается там, таблица модуля не нужна). Нет — таблица модуля, как в 0.48.
6
+ */
7
+ export declare function createClientCard(store: FlowStore, now: () => Date, adapter?: ClientCardStore, logError?: (message: string) => void, options?: {
8
+ facts?: boolean;
9
+ }): ClientCardTools;
@@ -0,0 +1,22 @@
1
+ import type { ClientFact, FlowStore } from "../store/flow-store.js";
2
+ import type { ClientCardStore, ClientFactStore } from "./flow-types.js";
3
+ /** Факт в таблице карточки модуля — запись с `fieldId` = `fact:<id>`; приложение не должно называть так свои поля. */
4
+ export declare const FACT_PREFIX = "fact:";
5
+ export declare const MAX_FACTS = 30;
6
+ export declare const MAX_FACT_LENGTH = 200;
7
+ /** Тот же факт (с точностью до регистра и пробелов) — тот же id: `f` и восемь шестнадцатеричных цифр. */
8
+ export declare function factId(text: string): string;
9
+ export declare const sameFact: (left: string, right: string) => boolean;
10
+ export declare const isFactEntry: (fieldId: string) => boolean;
11
+ /** Факты по времени записи, раньше — выше: начало блока для модели не меняется, пока не пишут новое. */
12
+ export declare const byWriteOrder: (left: ClientFact, right: ClientFact) => number;
13
+ /** Факты человека: у приложения (`clientCard.facts`) или в таблице модуля. */
14
+ export declare function clientFactStore(store: FlowStore, adapter?: ClientCardStore): ClientFactStore;
15
+ /** Факт как запись карточки: так его видят `readClientCard` и экран («Что агент знает о вас»). */
16
+ export declare const factEntry: (fact: ClientFact) => {
17
+ fieldId: string;
18
+ value: string;
19
+ updatedAt: string;
20
+ chatId: string;
21
+ flowId: string;
22
+ };
@@ -0,0 +1,3 @@
1
+ import type { FlowExtraTool } from "./extra-tool.js";
2
+ export declare const FLOW_CLOSE_DAY_TOOL = "flow_close_day";
3
+ export declare const closeDayTool: FlowExtraTool;
@@ -0,0 +1,33 @@
1
+ export interface DecisionSettings {
2
+ apiKey: string;
3
+ /** Адрес OpenRouter приложения, обычно `…/api/v1`; прокси работает так же. */
4
+ baseUrl: string;
5
+ /** Свои заголовки приложения (например, `X-Proxy-Token` прокси). Ключ и тип содержимого они не подменяют. */
6
+ headers?: Record<string, string>;
7
+ /** Для тестов. */
8
+ fetch?: typeof fetch;
9
+ }
10
+ export interface DecisionQuestion {
11
+ /** Ключ ответа: `id` условия сценария. */
12
+ id: string;
13
+ instructions: string;
14
+ }
15
+ export interface DecisionRequest {
16
+ model: string;
17
+ /** Что оценивать: любой JSON. */
18
+ state: unknown;
19
+ questions: DecisionQuestion[];
20
+ signal?: AbortSignal;
21
+ }
22
+ export interface DecisionResponse {
23
+ /** Вероятность «да» (`noul`, 0…1) по `id` вопроса. Вопроса без числового ответа здесь нет: цена всё равно списана. */
24
+ answers: Record<string, number>;
25
+ /** Цена вызова, доллары (`usage.cost`). */
26
+ cost: number;
27
+ inputTokens: number;
28
+ outputTokens: number;
29
+ }
30
+ /** Адрес `/api/alpha/decisions` рядом с `…/api/v1` приложения: прокси с путём работает так же. */
31
+ export declare function decisionsUrl(baseUrl: string): string;
32
+ /** Клиент OpenRouter `/api/alpha/decisions`: вопросы `noul`, на каждый — вероятность «да». */
33
+ export declare function requestDecision(settings: DecisionSettings, request: DecisionRequest): Promise<DecisionResponse>;