@ykurilov/agent-chat-flows 0.0.0-stage → 0.56.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 +261 -0
- package/LICENSE +21 -0
- package/README.md +124 -2
- package/agent-flow.schema.json +1020 -0
- package/dist/chunk-3PTJI2XY.js +100 -0
- package/dist/chunk-3PTJI2XY.js.map +1 -0
- package/dist/chunk-BNMQUNSI.js +9 -0
- package/dist/chunk-BNMQUNSI.js.map +1 -0
- package/dist/chunk-BOV6FJGU.js +1288 -0
- package/dist/chunk-BOV6FJGU.js.map +1 -0
- package/dist/chunk-CKY5KG7N.js +165 -0
- package/dist/chunk-CKY5KG7N.js.map +1 -0
- package/dist/chunk-DCTRMCGV.js +34 -0
- package/dist/chunk-DCTRMCGV.js.map +1 -0
- package/dist/format.js +147 -0
- package/dist/format.js.map +1 -0
- package/dist/index.js +3197 -0
- package/dist/index.js.map +1 -0
- package/dist/postgres.js +387 -0
- package/dist/postgres.js.map +1 -0
- package/dist/react.js +2650 -0
- package/dist/react.js.map +1 -0
- package/dist/sqlite.js +319 -0
- package/dist/sqlite.js.map +1 -0
- package/dist/types/check/app-checks.d.ts +16 -0
- package/dist/types/check/check-flow.d.ts +8 -0
- package/dist/types/check/index.d.ts +2 -0
- package/dist/types/engine/data-conditions.d.ts +10 -0
- package/dist/types/engine/day-frame.d.ts +17 -0
- package/dist/types/engine/first-messages.d.ts +21 -0
- package/dist/types/engine/flow-days.d.ts +39 -0
- package/dist/types/engine/flow-graph.d.ts +26 -0
- package/dist/types/engine/flow-run.d.ts +130 -0
- package/dist/types/engine/index.d.ts +14 -0
- package/dist/types/engine/migrate-run.d.ts +11 -0
- package/dist/types/engine/next-transition.d.ts +40 -0
- package/dist/types/engine/nudges.d.ts +78 -0
- package/dist/types/engine/run-updates.d.ts +37 -0
- package/dist/types/engine/side-questions.d.ts +26 -0
- package/dist/types/engine/side-tasks.d.ts +44 -0
- package/dist/types/engine/targets.d.ts +9 -0
- package/dist/types/engine/timers.d.ts +61 -0
- package/dist/types/engine/zoned-time.d.ts +27 -0
- package/dist/types/format/catalog-events.d.ts +5 -0
- package/dist/types/format/compact-flow.d.ts +8 -0
- package/dist/types/format/flow-format.d.ts +286 -0
- package/dist/types/format/flow-json-schema.d.ts +2 -0
- package/dist/types/format/flow-schema.d.ts +605 -0
- package/dist/types/format/index.d.ts +7 -0
- package/dist/types/format/migrate-flow.d.ts +4 -0
- package/dist/types/format/parse-flow.d.ts +6 -0
- package/dist/types/format.d.ts +3 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/labels/client-card.d.ts +20 -0
- package/dist/types/labels/editor.d.ts +261 -0
- package/dist/types/labels/index.d.ts +14 -0
- package/dist/types/labels/migrate.d.ts +19 -0
- package/dist/types/labels/test-chat.d.ts +28 -0
- package/dist/types/not-yet.d.ts +2 -0
- package/dist/types/postgres.d.ts +10 -0
- package/dist/types/prompt/client-card-block.d.ts +16 -0
- package/dist/types/prompt/flow-rules.d.ts +9 -0
- package/dist/types/prompt/rules/after-end.d.ts +3 -0
- package/dist/types/prompt/rules/client-facts.d.ts +2 -0
- package/dist/types/prompt/rules/day-frame.d.ts +2 -0
- package/dist/types/prompt/rules/link-views.d.ts +4 -0
- package/dist/types/prompt/rules/rule-part.d.ts +3 -0
- package/dist/types/prompt/rules/side-tasks.d.ts +2 -0
- package/dist/types/prompt/rules/time-zone.d.ts +2 -0
- package/dist/types/prompt/state-card.d.ts +14 -0
- package/dist/types/react/client-card/client-card-panel.d.ts +8 -0
- package/dist/types/react/client-card/index.d.ts +2 -0
- package/dist/types/react/client-card/use-client-card.d.ts +19 -0
- package/dist/types/react/client-card-skin.d.ts +27 -0
- package/dist/types/react/editor/board-space.d.ts +51 -0
- package/dist/types/react/editor/board-styles.d.ts +1 -0
- package/dist/types/react/editor/editor-model.d.ts +60 -0
- package/dist/types/react/editor/exit-text.d.ts +11 -0
- package/dist/types/react/editor/flow-board.d.ts +11 -0
- package/dist/types/react/editor/flow-editor.d.ts +13 -0
- package/dist/types/react/editor/flow-simulation.d.ts +44 -0
- package/dist/types/react/editor/index.d.ts +6 -0
- package/dist/types/react/editor/schedule-model.d.ts +47 -0
- package/dist/types/react/editor/side-task-model.d.ts +18 -0
- package/dist/types/react/editor/use-flow-editor.d.ts +120 -0
- package/dist/types/react/flow-editor-skin.d.ts +453 -0
- package/dist/types/react/flow-labels.d.ts +8 -0
- package/dist/types/react/index.d.ts +6 -0
- package/dist/types/react/test-chat/flow-test-chat.d.ts +22 -0
- package/dist/types/react/test-chat/index.d.ts +2 -0
- package/dist/types/react/test-chat/use-flow-test-chat.d.ts +50 -0
- package/dist/types/react.d.ts +3 -0
- package/dist/types/runtime/admit.d.ts +15 -0
- package/dist/types/runtime/agent-flow.d.ts +20 -0
- package/dist/types/runtime/client-card.d.ts +9 -0
- package/dist/types/runtime/client-facts.d.ts +22 -0
- package/dist/types/runtime/close-day-tool.d.ts +3 -0
- package/dist/types/runtime/decisions-client.d.ts +33 -0
- package/dist/types/runtime/extra-tool.d.ts +16 -0
- package/dist/types/runtime/first-message-retry.d.ts +4 -0
- package/dist/types/runtime/first-message-rules.d.ts +55 -0
- package/dist/types/runtime/first-reasons-notice.d.ts +9 -0
- package/dist/types/runtime/flow-delivery.d.ts +53 -0
- package/dist/types/runtime/flow-events.d.ts +126 -0
- package/dist/types/runtime/flow-finish.d.ts +68 -0
- package/dist/types/runtime/flow-known-texts.d.ts +11 -0
- package/dist/types/runtime/flow-signals.d.ts +12 -0
- package/dist/types/runtime/flow-timers.d.ts +55 -0
- package/dist/types/runtime/flow-tools.d.ts +23 -0
- package/dist/types/runtime/flow-types.d.ts +547 -0
- package/dist/types/runtime/held-messages.d.ts +25 -0
- package/dist/types/runtime/index.d.ts +11 -0
- package/dist/types/runtime/judge-context.d.ts +36 -0
- package/dist/types/runtime/judge.d.ts +21 -0
- package/dist/types/runtime/migrate-chats.d.ts +20 -0
- package/dist/types/runtime/note-tools.d.ts +15 -0
- package/dist/types/runtime/pause.d.ts +21 -0
- package/dist/types/runtime/prepare-turn.d.ts +12 -0
- package/dist/types/runtime/side-task-tool.d.ts +5 -0
- package/dist/types/runtime/step-tail.d.ts +11 -0
- package/dist/types/runtime/tail/day-line.d.ts +2 -0
- package/dist/types/runtime/tail/frame-line.d.ts +2 -0
- package/dist/types/runtime/tail/side-tasks-line.d.ts +2 -0
- package/dist/types/runtime/tail/tail-part.d.ts +21 -0
- package/dist/types/runtime/test-clock.d.ts +26 -0
- package/dist/types/runtime/time-zone-tool.d.ts +3 -0
- package/dist/types/runtime/turn-gate.d.ts +8 -0
- package/dist/types/sqlite.d.ts +9 -0
- package/dist/types/store/flow-store-shared.d.ts +20 -0
- package/dist/types/store/flow-store.d.ts +240 -0
- package/dist/types/store/memory.d.ts +3 -0
- package/dist/types/store/migration-settings.d.ts +7 -0
- package/dist/types/store/postgres-schema.d.ts +775 -0
- package/dist/types/store/postgres.d.ts +15 -0
- package/dist/types/store/sqlite-schema.d.ts +824 -0
- package/dist/types/store/sqlite.d.ts +9 -0
- package/drizzle/postgres/0000_init.sql +45 -0
- package/drizzle/postgres/0001_days_pause_side_tasks.sql +21 -0
- package/drizzle/postgres/0002_chat_placement.sql +1 -0
- package/drizzle/postgres/meta/0000_snapshot.json +317 -0
- package/drizzle/postgres/meta/0001_snapshot.json +439 -0
- package/drizzle/postgres/meta/0002_snapshot.json +445 -0
- package/drizzle/postgres/meta/_journal.json +27 -0
- package/drizzle/sqlite/0000_init.sql +44 -0
- package/drizzle/sqlite/0001_days_pause_side_tasks.sql +21 -0
- package/drizzle/sqlite/0002_chat_placement.sql +1 -0
- package/drizzle/sqlite/meta/0000_snapshot.json +297 -0
- package/drizzle/sqlite/meta/0001_snapshot.json +427 -0
- package/drizzle/sqlite/meta/0002_snapshot.json +434 -0
- package/drizzle/sqlite/meta/_journal.json +27 -0
- package/package.json +98 -3
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/** Ключ в состоянии чата (`ChatState`), под которым лежит `FlowRun`. */
|
|
2
|
+
export declare const FLOW_STATE_KEY = "flow";
|
|
3
|
+
/** Сколько последних шагов пути хранить в чате. */
|
|
4
|
+
export declare const FLOW_PATH_LIMIT = 50;
|
|
5
|
+
/** Больше стольких переходов подряд без ответа агента — сценарий зациклился, движок останавливается. */
|
|
6
|
+
export declare const FLOW_CHAIN_LIMIT = 5;
|
|
7
|
+
/** Кто решил переход: агент заявил и судья подтвердил, судья сам, данные, событие или таймер. */
|
|
8
|
+
export type TransitionDecider = "claim" | "judge" | "data" | "event" | "timer";
|
|
9
|
+
/** Почему случился переход — словами для людей: «тишина 3 ч», «нода длится 1 день», «поле „Оплатил“ = да». */
|
|
10
|
+
export interface TransitionReason {
|
|
11
|
+
kind: TransitionDecider;
|
|
12
|
+
text: string;
|
|
13
|
+
}
|
|
14
|
+
/** Почему разговор закончился: конечная нода, срок вышел, человек пропал, канал заблокирован, своя причина приложения (`flow.end`). */
|
|
15
|
+
export type FlowEndReason = "final" | "deadline" | "abandoned" | "blocked" | (string & {});
|
|
16
|
+
/** Как чат попал в состояние: старт сценария, переход или перевод на новую версию. */
|
|
17
|
+
export type FlowPathCause = TransitionDecider | "start" | "migrate";
|
|
18
|
+
export interface FlowPathEntry {
|
|
19
|
+
state: string;
|
|
20
|
+
/** Время входа, мс с 1970 года. */
|
|
21
|
+
at: number;
|
|
22
|
+
/** Метки состояния на момент входа. */
|
|
23
|
+
tags: string[];
|
|
24
|
+
from: string | null;
|
|
25
|
+
exitId: string | null;
|
|
26
|
+
decidedBy: FlowPathCause;
|
|
27
|
+
/** Уверенность судьи, 0…1. */
|
|
28
|
+
probability?: number;
|
|
29
|
+
/** Причина перехода словами. В записях до 0.49 нет. */
|
|
30
|
+
reason?: TransitionReason;
|
|
31
|
+
}
|
|
32
|
+
/** Где чат в сценарии. Хранится в состоянии чата под `FLOW_STATE_KEY`; все времена — мс с 1970 года. */
|
|
33
|
+
export interface FlowRun {
|
|
34
|
+
state: string;
|
|
35
|
+
/** Когда вошли в текущее состояние. */
|
|
36
|
+
enteredAt: number;
|
|
37
|
+
/** Когда чат начал сценарий. */
|
|
38
|
+
startedAt: number;
|
|
39
|
+
/** Последние `FLOW_PATH_LIMIT` шагов, первый — самый старый. */
|
|
40
|
+
path: FlowPathEntry[];
|
|
41
|
+
/** Остановленные часы «время в состоянии» основных состояний, пока чат в напоминаниях: id состояния → накоплено мс. */
|
|
42
|
+
pausedClocks: Record<string, number>;
|
|
43
|
+
/** Заметки этого чата по `id` поля `chatNotes`. */
|
|
44
|
+
notes: Record<string, unknown>;
|
|
45
|
+
humanMessages: number;
|
|
46
|
+
agentAnswers: number;
|
|
47
|
+
/** На каком сообщении человека (`humanMessages`) был последний вопрос между делом. */
|
|
48
|
+
sideQuestionAt: number | null;
|
|
49
|
+
/** Последний переход, который судья не подтвердил: заявлять его снова можно после нового сообщения человека. */
|
|
50
|
+
lastRejected: {
|
|
51
|
+
exitId: string;
|
|
52
|
+
atHumanMessages: number;
|
|
53
|
+
} | null;
|
|
54
|
+
lastAgentAt: number | null;
|
|
55
|
+
lastHumanAt: number | null;
|
|
56
|
+
/** Переходов подряд без ответа агента; предел — `FLOW_CHAIN_LIMIT`. */
|
|
57
|
+
chain: number;
|
|
58
|
+
/** Сдвиг часов для тестового чата, мс. В рабочих чатах нет. */
|
|
59
|
+
timeOffset?: number;
|
|
60
|
+
/** Начало первого дня сценария (с учётом позднего старта и пояса человека). */
|
|
61
|
+
dayAnchorAt?: number;
|
|
62
|
+
/** Сообщения человека за текущий день сценария: местная дата «ГГГГ-ММ-ДД» → сколько. Хранится только текущий день. */
|
|
63
|
+
dayCounts?: Record<string, number>;
|
|
64
|
+
/** Какой шаг ряда касаний следующий; сообщение человека возвращает к 0. */
|
|
65
|
+
nudgeStep?: number;
|
|
66
|
+
/** `nudgeStep` насчитан своим рядом ноды на N дней (`nudges.days`): после них общий ряд начинается сначала. С 0.55. */
|
|
67
|
+
nudgeStepOwn?: boolean;
|
|
68
|
+
/** Ходов сервера подряд (по служебным сообщениям) после последнего сообщения человека, с 0.53; нет — 0. */
|
|
69
|
+
serverTurns?: number;
|
|
70
|
+
/** Последний ход «пишет первым», после которого человек не писал, и счёт до него: не доставлен — не засчитан (FR-309). */
|
|
71
|
+
touch?: FlowTouch;
|
|
72
|
+
/** Когда разговор закончился. После конца таймеров и касаний нет. */
|
|
73
|
+
endedAt?: number;
|
|
74
|
+
endReason?: FlowEndReason;
|
|
75
|
+
}
|
|
76
|
+
/** Ход «пишет первым» и что было до него. Ответ хода помечен «не доставлено» — счёт возвращается к этому. */
|
|
77
|
+
export interface FlowTouch {
|
|
78
|
+
/** Ответ агента этого хода. */
|
|
79
|
+
answerId: string;
|
|
80
|
+
/** Когда ход был, по часам чата: от него считается следующий срок, если касание не дошло. */
|
|
81
|
+
at: number;
|
|
82
|
+
lastAgentAt: number | null;
|
|
83
|
+
nudgeStep: number;
|
|
84
|
+
nudgeStepOwn?: boolean;
|
|
85
|
+
agentAnswers: number;
|
|
86
|
+
}
|
|
87
|
+
/** Переход, который движок решил сделать. */
|
|
88
|
+
export interface Transition {
|
|
89
|
+
from: string;
|
|
90
|
+
/** Новое состояние; при «назад» — уже найденное основное состояние. */
|
|
91
|
+
to: string;
|
|
92
|
+
exitId: string;
|
|
93
|
+
decidedBy: TransitionDecider;
|
|
94
|
+
probability?: number;
|
|
95
|
+
/** Метки состояния `to`. */
|
|
96
|
+
tags: string[];
|
|
97
|
+
at: number;
|
|
98
|
+
/** Переход «назад» (`@return`). */
|
|
99
|
+
returned?: boolean;
|
|
100
|
+
/** Причина словами: уходит в `onTransition` и в путь. */
|
|
101
|
+
reason?: TransitionReason;
|
|
102
|
+
}
|
|
103
|
+
/** Тихие часы и потолок сообщений, которые агент пишет первым (по таймерам). */
|
|
104
|
+
export interface FirstMessagesRules {
|
|
105
|
+
/** Ночью не писать: «ЧЧ:ММ» в поясе человека. Срок переносится на конец тихих часов. */
|
|
106
|
+
quietHours: {
|
|
107
|
+
from: string;
|
|
108
|
+
to: string;
|
|
109
|
+
};
|
|
110
|
+
/** Не больше стольких сообщений первым за сутки человека. */
|
|
111
|
+
maxPerDay: number;
|
|
112
|
+
/**
|
|
113
|
+
* Своя проверка приложения: например, человек отписался или остановлены расходы. `true` — писать. `false` — не сейчас:
|
|
114
|
+
* касание повторится через час. `"never"` — молчать до сообщения человека. `{ retryAt }` — повторить в этот момент
|
|
115
|
+
* (негодная дата — как `false`, прошедшая — через минуту). Конец разговора («срок вышел», «не завершил») и переходы нод
|
|
116
|
+
* по таймерам от ответа не зависят: наступают в свой срок.
|
|
117
|
+
*/
|
|
118
|
+
canWriteNow?: (input: {
|
|
119
|
+
ownerId: string;
|
|
120
|
+
chatId: string;
|
|
121
|
+
at: Date;
|
|
122
|
+
}) => CanWriteNow | Promise<CanWriteNow>;
|
|
123
|
+
}
|
|
124
|
+
/** Ответ `canWriteNow`: писать, не сейчас (повтор через час), молчать до сообщения человека или повторить в названный момент (с 0.53). */
|
|
125
|
+
export type CanWriteNow = boolean | "never" | {
|
|
126
|
+
retryAt: Date;
|
|
127
|
+
};
|
|
128
|
+
/** `false` — правила выключены: агент пишет первым без тихих часов и потолка. Не писать первым — `canWriteNow: () => "never"`. */
|
|
129
|
+
export type FirstMessagesSetting = Partial<FirstMessagesRules> | false;
|
|
130
|
+
export declare const DEFAULT_FIRST_MESSAGES: Readonly<Omit<FirstMessagesRules, "canWriteNow">>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export * from "./flow-run.js";
|
|
2
|
+
export { nextTransition, type FlowEvent } from "./next-transition.js";
|
|
3
|
+
export { startRun, applyTransition, noteHumanMessage, noteAgentAnswer, noteRejectedClaim, claimAllowed, noteSideQuestion, } from "./run-updates.js";
|
|
4
|
+
export { dataConditionHolds, fieldValueFits } from "./data-conditions.js";
|
|
5
|
+
export { nextDue, nextWake, dueReasons, timerDueAt, FLOW_DEADLINE_EXIT, FLOW_FIRST_EXIT, FLOW_GIVE_UP_EXIT, type DueReasons, type FlowDue } from "./timers.js";
|
|
6
|
+
export { returnTarget } from "./targets.js";
|
|
7
|
+
export { isFinal, isTouch, commonApplies, activeExits, fieldById, type ActiveExit, type FieldPlace } from "./flow-graph.js";
|
|
8
|
+
export { firstMessageSlot, resolveFirstMessages, localDay, type FirstMessageInput } from "./first-messages.js";
|
|
9
|
+
export { sideQuestion, isFieldStale, type SideQuestion, type SideQuestionInput } from "./side-questions.js";
|
|
10
|
+
export { migrateRun, type StateMap } from "./migrate-run.js";
|
|
11
|
+
export { dayOf, dayInProgress, dayStartAt, dayAnchor, stateDaysDue, flowDay, deadlineAt, withDayAnchor, beforeFirstNight, type FlowDayInfo } from "./flow-days.js";
|
|
12
|
+
export { stateNudges, nextNudge, type FlowFirstReason, type NudgeDue } from "./nudges.js";
|
|
13
|
+
export { frameState, type FrameState } from "./day-frame.js";
|
|
14
|
+
export { openSideTasks, type OpenSideTasksInput, type SideTaskAttempts } from "./side-tasks.js";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AgentFlow } from "../format/flow-format.js";
|
|
2
|
+
import type { FlowRun } from "./flow-run.js";
|
|
3
|
+
/** Куда перевести чаты из состояний, которых нет в новой версии: id старого → id нового. */
|
|
4
|
+
export type StateMap = Record<string, string>;
|
|
5
|
+
/**
|
|
6
|
+
* Переводит чат на новую версию сценария (→ В11). Состояние есть в новой версии — часы и путь целы. Удалено — вход в
|
|
7
|
+
* состояние из `map`; без цели — ошибка (её ловит перевод чатов раньше). Заметки чата — по совпадающим `id`.
|
|
8
|
+
* Удалённые состояния в пути и в остановленных часах переименовываются по `map`: так «назад» ведёт туда, куда автор
|
|
9
|
+
* отправил удалённое состояние.
|
|
10
|
+
*/
|
|
11
|
+
export declare function migrateRun(run: FlowRun, next: AgentFlow, map: StateMap, now: number): FlowRun;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { AgentFlow, FlowCatalog, FlowCondition, FlowEventType } from "../format/flow-format.js";
|
|
2
|
+
import { type FlowRun, type Transition } from "./flow-run.js";
|
|
3
|
+
/** Что случилось в чате: на это движок ищет переход. */
|
|
4
|
+
export type FlowEvent =
|
|
5
|
+
/** Сообщение человека, нажатая кнопка, вызванный инструмент, событие приложения. */
|
|
6
|
+
{
|
|
7
|
+
type: "event";
|
|
8
|
+
event: FlowEventType;
|
|
9
|
+
name?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Изменились данные: проверить условия по ним. `field` — какое поле изменилось (нет — все условия по данным).
|
|
13
|
+
* Заметки чата движок берёт из `run.notes`, карточку клиента приносит событие.
|
|
14
|
+
*/
|
|
15
|
+
| {
|
|
16
|
+
type: "data";
|
|
17
|
+
field?: string;
|
|
18
|
+
card?: Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
/** Судья подтвердил условие словами: по заявке агента (`claim`) или сам после ответа (`judge`). `why` — слова агента из заявки. */
|
|
21
|
+
| {
|
|
22
|
+
type: "verdict";
|
|
23
|
+
exitId: string;
|
|
24
|
+
probability: number;
|
|
25
|
+
decidedBy: "claim" | "judge";
|
|
26
|
+
why?: string;
|
|
27
|
+
}
|
|
28
|
+
/** Наступил таймер из `nextDue`. Пояс человека нужен, чтобы перепроверить срок: человек мог успеть ответить. */
|
|
29
|
+
| {
|
|
30
|
+
type: "timer";
|
|
31
|
+
exitId: string;
|
|
32
|
+
timeZone: string;
|
|
33
|
+
};
|
|
34
|
+
/** Условие человеческими словами: для служебного сообщения модели и для причины перехода. С каталогом — подписи событий. */
|
|
35
|
+
export declare function describeCondition(flow: AgentFlow, when: FlowCondition, catalog?: Pick<FlowCatalog, "events">): string;
|
|
36
|
+
/**
|
|
37
|
+
* Следующий переход или `null` — агент остаётся (→ В2). Порядок: свои условия, потом общие (→ В3); «назад» — в последнее
|
|
38
|
+
* основное состояние (→ В1). После `FLOW_CHAIN_LIMIT` переходов подряд без ответа агента и сообщения человека — `null`.
|
|
39
|
+
*/
|
|
40
|
+
export declare function nextTransition(flow: AgentFlow, run: FlowRun, event: FlowEvent, now: number): Transition | null;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { AgentFlow, FlowNudges } from "../format/flow-format.js";
|
|
2
|
+
import type { FlowRun } from "./flow-run.js";
|
|
3
|
+
/** Почему агент пишет первым. Причины одного срока собираются в один ход. */
|
|
4
|
+
export type FlowFirstReason =
|
|
5
|
+
/** Переход по таймеру в новую ноду. */
|
|
6
|
+
{
|
|
7
|
+
kind: "transition";
|
|
8
|
+
stateId: string;
|
|
9
|
+
}
|
|
10
|
+
/** Утреннее сообщение (`schedule.firstMessages.morning`). */
|
|
11
|
+
| {
|
|
12
|
+
kind: "morning";
|
|
13
|
+
}
|
|
14
|
+
/** Касание по тишине: номер шага ряда `afterSilence`, с 1. */
|
|
15
|
+
| {
|
|
16
|
+
kind: "silence";
|
|
17
|
+
step: number;
|
|
18
|
+
}
|
|
19
|
+
/** Касание по часам (`dailyAt`). */
|
|
20
|
+
| {
|
|
21
|
+
kind: "daily";
|
|
22
|
+
at: string;
|
|
23
|
+
}
|
|
24
|
+
/** Сообщения человека остались без ответа (после жёсткой рамки дня, при лимите расходов) — ответить на накопленное. */
|
|
25
|
+
| {
|
|
26
|
+
kind: "night_messages";
|
|
27
|
+
count: number;
|
|
28
|
+
}
|
|
29
|
+
/** Прощание при «срок вышел» (`schedule.farewellOnDeadline`, → В5). */
|
|
30
|
+
| {
|
|
31
|
+
kind: "farewell";
|
|
32
|
+
};
|
|
33
|
+
/** Ближайшее касание; `give_up` — конец разговора «не завершил» без сообщения. */
|
|
34
|
+
export interface NudgeDue {
|
|
35
|
+
at: number;
|
|
36
|
+
reason: FlowFirstReason | {
|
|
37
|
+
kind: "give_up";
|
|
38
|
+
};
|
|
39
|
+
/** Касание своего ряда ноды на N дней (`nudges.days`): его шаг не идёт в счёт общего ряда. */
|
|
40
|
+
own?: boolean;
|
|
41
|
+
}
|
|
42
|
+
/** Касания ноды: свои, «off», общие из «Дней и времени», общие сценария. Нет ни тех, ни других — `null`. */
|
|
43
|
+
export declare function stateNudges(flow: AgentFlow, stateId: string): FlowNudges | null;
|
|
44
|
+
/** Порог утреннего по умолчанию: человек писал за 3 ч до него — утреннее завтра. */
|
|
45
|
+
export declare const DEFAULT_SKIP_MORNING_MIN = 180;
|
|
46
|
+
/** То, чего нет в месте чата: пауза сотрудника из записи и сообщения человека без ответа из истории. */
|
|
47
|
+
export interface FirstWakeContext {
|
|
48
|
+
/** Пауза сотрудника до этого момента (мс): тишина считается от её конца, утро на паузе пропускается. */
|
|
49
|
+
pausedUntil?: number | null;
|
|
50
|
+
/** Сообщения человека после последнего ответа агента, записанные без хода (ночь, рамка дня, пауза). */
|
|
51
|
+
unanswered?: number;
|
|
52
|
+
/** Последнее касание не доставлено (мс): оно не засчитано, а следующий срок — не раньше этого момента. */
|
|
53
|
+
undeliveredAt?: number | null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Ближайшее касание чата: ряд `afterSilence` от последнего ответа агента, после ряда — часы `dailyAt`. `give_up`
|
|
57
|
+
* («не завершил») — `giveUpAfter` тишины человека; побеждает, если наступает не позже касания. Касаний в ноде нет,
|
|
58
|
+
* человек ответил или писал без ответа, агент ещё не писал, разговор закончен — `null`.
|
|
59
|
+
*/
|
|
60
|
+
export declare function nextNudge(flow: AgentFlow, run: FlowRun, now: number, timeZone: string, context?: FirstWakeContext): NudgeDue | null;
|
|
61
|
+
/**
|
|
62
|
+
* Когда наступит «не завершил» (`giveUpAfter` тишины человека), независимо от касаний: отложенное или не начатое
|
|
63
|
+
* касание конец разговора не двигает. Нет `giveUpAfter` или тишина не идёт — `null`.
|
|
64
|
+
*/
|
|
65
|
+
export declare function giveUpAt(flow: AgentFlow, run: FlowRun, timeZone: string, context?: FirstWakeContext): number | null;
|
|
66
|
+
/**
|
|
67
|
+
* Утреннее сообщение: начало следующего дня после последних слов агента. Человек писал меньше чем за
|
|
68
|
+
* `skipMorningIfHumanWithinMin` до него или на нём стояла пауза сотрудника — утреннее следующего дня.
|
|
69
|
+
*/
|
|
70
|
+
export declare function nextMorning(flow: AgentFlow, run: FlowRun, timeZone: string, context?: FirstWakeContext): number | null;
|
|
71
|
+
/**
|
|
72
|
+
* До какого момента молчат касания в начале дня: человек писал до начала дня и меньше `skipMorningIfHumanWithinMin`
|
|
73
|
+
* назад — как утреннее, ждут и касание тишины, перенесённое ночью на утро, и касание по часам. Переход ноды по сроку и
|
|
74
|
+
* ответ на ночные сообщения — по делу, они не ждут. Ждать не нужно — `null`.
|
|
75
|
+
*/
|
|
76
|
+
export declare function dayStartHoldUntil(flow: AgentFlow, run: FlowRun, now: number, timeZone: string, reasons: readonly FlowFirstReason[]): number | null;
|
|
77
|
+
/** Ответить на накопленное: в начале дня после последних записанных в место слов. Сообщений без ответа нет — `null`. */
|
|
78
|
+
export declare function nextNightReply(flow: AgentFlow, run: FlowRun, timeZone: string, context?: FirstWakeContext): number | null;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { AgentFlow } from "../format/flow-format.js";
|
|
2
|
+
import { type FlowPathEntry, type FlowRun, type Transition } from "./flow-run.js";
|
|
3
|
+
/** Чат начинает сценарий в стартовом состоянии. */
|
|
4
|
+
export declare function startRun(flow: AgentFlow, now: number): FlowRun;
|
|
5
|
+
/** Добавляет шаг в путь, храня последние `FLOW_PATH_LIMIT`. */
|
|
6
|
+
export declare function appendPath(path: FlowPathEntry[], entry: FlowPathEntry): FlowPathEntry[];
|
|
7
|
+
/**
|
|
8
|
+
* Применяет переход из `nextTransition`. Часы «времени в состоянии» (→ В5): уходя из основного состояния в касание, движок
|
|
9
|
+
* запоминает, сколько там пробыли; «назад» продолжает отсчёт с этого места, обычный вход — с нуля.
|
|
10
|
+
*/
|
|
11
|
+
export declare function applyTransition(flow: AgentFlow, run: FlowRun, transition: Transition): FlowRun;
|
|
12
|
+
/**
|
|
13
|
+
* Пришло сообщение человека: тишина прервана, счёт переходов подряд — заново, ряд касаний — с первого шага.
|
|
14
|
+
* `dayKey` — местная дата дня сценария («ГГГГ-ММ-ДД»), только у сценариев с днями: по нему считаются рамки дня.
|
|
15
|
+
*/
|
|
16
|
+
export declare function noteHumanMessage(run: FlowRun, now: number, dayKey?: string, count?: number): FlowRun;
|
|
17
|
+
/** Агент ответил (или написал первым): от этого момента считается тишина, счёт переходов подряд — заново. */
|
|
18
|
+
export declare function noteAgentAnswer(run: FlowRun, now: number): FlowRun;
|
|
19
|
+
/**
|
|
20
|
+
* Ответ касания не доставлен (FR-309): касание не засчитано — шаг ряда, последние слова агента и счёт ответов как до
|
|
21
|
+
* него. `undeliveredAt` — когда касание было: раньше него следующий срок не наступает. Пометка не меняется — откат тот же
|
|
22
|
+
* сколько ни считай.
|
|
23
|
+
*/
|
|
24
|
+
export declare function withoutUndeliveredTouch(run: FlowRun, undelivered: ReadonlySet<string>): {
|
|
25
|
+
run: FlowRun;
|
|
26
|
+
undeliveredAt: number | null;
|
|
27
|
+
};
|
|
28
|
+
/** Судья не подтвердил заявку агента: тот же выход можно заявить снова после нового сообщения человека. */
|
|
29
|
+
export declare function noteRejectedClaim(run: FlowRun, exitId: string): FlowRun;
|
|
30
|
+
/** Можно ли заявить выход: его не отклоняли с последнего сообщения человека. */
|
|
31
|
+
export declare function claimAllowed(run: FlowRun, exitId: string): boolean;
|
|
32
|
+
/** Агент спросил о человеке между делом: следующий такой вопрос — по темпу сценария. */
|
|
33
|
+
export declare function noteSideQuestion(run: FlowRun): FlowRun;
|
|
34
|
+
/** Место без пометки «шаг насчитан своим рядом ноды». */
|
|
35
|
+
export declare function withoutOwnStep<R extends FlowRun>(run: R): R;
|
|
36
|
+
/** Шаг ряда касаний после хода «пишет первым»: `own` — его насчитал свой ряд ноды на N дней. */
|
|
37
|
+
export declare function withNudgeStep<R extends FlowRun>(run: R, step: number, own: boolean): R;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AgentFlow, ClientCardField } from "../format/flow-format.js";
|
|
2
|
+
import type { FlowRun } from "./flow-run.js";
|
|
3
|
+
export interface SideQuestionInput {
|
|
4
|
+
/** Карточка клиента: id поля → значение и когда записано (мс). */
|
|
5
|
+
card: Record<string, {
|
|
6
|
+
value: unknown;
|
|
7
|
+
updatedAt: number;
|
|
8
|
+
}>;
|
|
9
|
+
now: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* О чём спросить человека: `learn` — «узнать здесь», спросить прямо; `stale` — известно давно, мягко уточнить;
|
|
13
|
+
* `unknown` — следующее неизвестное поле карточки, спросить между делом.
|
|
14
|
+
*/
|
|
15
|
+
export interface SideQuestion {
|
|
16
|
+
fieldId: string;
|
|
17
|
+
reason: "learn" | "stale" | "unknown";
|
|
18
|
+
}
|
|
19
|
+
/** Пора ли уточнить поле: прошло больше `refreshAfterMonths` месяцев с записи. Без срока поле не устаревает. */
|
|
20
|
+
export declare function isFieldStale(field: Pick<ClientCardField, "refreshAfterMonths">, updatedAt: number, now: number): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Что спросить сейчас или `null`. «Узнать здесь» — прямо и вне темпа. Дальше — только если состояние не «без вопросов» и
|
|
23
|
+
* с прошлого вопроса между делом прошло `pace.sideQuestionEveryMessages` сообщений человека: сначала устаревшее, потом
|
|
24
|
+
* первое неизвестное поле карточки по порядку. В конце сценария не спрашиваем.
|
|
25
|
+
*/
|
|
26
|
+
export declare function sideQuestion(flow: AgentFlow, run: FlowRun, input: SideQuestionInput): SideQuestion | null;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type AgentFlow, type FlowSideTask } from "../format/flow-format.js";
|
|
2
|
+
import type { FlowRun } from "./flow-run.js";
|
|
3
|
+
/** Попытки задачи, как их отдаёт хранилище: на человека (`chatId: null`) или на разговор. */
|
|
4
|
+
export interface SideTaskAttempts {
|
|
5
|
+
taskId: string;
|
|
6
|
+
chatId: string | null;
|
|
7
|
+
asks: number;
|
|
8
|
+
doneAt: string | null;
|
|
9
|
+
}
|
|
10
|
+
/** Встроенная задача: пока пояс человека неизвестен, в первый день до ночи узнать город (В1). Первая по важности. */
|
|
11
|
+
export declare const TIME_ZONE_TASK_ID = "ask_time_zone";
|
|
12
|
+
export declare const TIME_ZONE_TASK: FlowSideTask;
|
|
13
|
+
/** Задача по id: встроенная «узнать город» — только у сценария с «Днями и временем», иначе задача сценария. */
|
|
14
|
+
export declare function sideTaskById(flow: AgentFlow, id: string): FlowSideTask | undefined;
|
|
15
|
+
/** Есть ли у сценария попутные задачи: свои или встроенная. Нет — ни инструмента, ни правила, ни строки (как в 0.48). */
|
|
16
|
+
export declare const hasSideTasks: (flow: AgentFlow) => boolean;
|
|
17
|
+
export interface SideTaskContext {
|
|
18
|
+
flow: AgentFlow;
|
|
19
|
+
run: FlowRun;
|
|
20
|
+
/** Разговор, в котором идёт ход: по нему считаются попытки задач «заново в каждом разговоре». */
|
|
21
|
+
chatId: string;
|
|
22
|
+
attempts: readonly SideTaskAttempts[];
|
|
23
|
+
/** Значения карточки клиента по `id` поля. Заметки чата берутся из `run.notes`. */
|
|
24
|
+
card: Readonly<Record<string, unknown>>;
|
|
25
|
+
/** Пояс человека неизвестен, а сегодня его первый день до первой ночи: тогда открыта встроенная задача «узнать город». Отдаёт этап 4. */
|
|
26
|
+
askTimeZone?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export type OpenSideTasksInput = SideTaskContext;
|
|
29
|
+
/** Решена ли задача: отмечена или её поле уже известно. Потрачена ли: попытки кончились. Иначе — открыта. */
|
|
30
|
+
export type SideTaskStanding = "open" | "done" | "spent";
|
|
31
|
+
/** Попытки задачи: на человека — запись без разговора, у «заново в каждом разговоре» — запись этого разговора. */
|
|
32
|
+
export declare function sideTaskRecord(task: FlowSideTask, chatId: string, attempts: readonly SideTaskAttempts[]): SideTaskAttempts | undefined;
|
|
33
|
+
/** Известно ли поле задачи: значение подходит типу поля. Поля нет в сценарии — не известно. */
|
|
34
|
+
export declare function sideTaskFieldKnown(task: FlowSideTask, context: Pick<SideTaskContext, "flow" | "run" | "card">): boolean;
|
|
35
|
+
/** Где задача сейчас — без учёта темпа и места в сценарии. */
|
|
36
|
+
export declare function sideTaskStanding(task: FlowSideTask, context: SideTaskContext): SideTaskStanding;
|
|
37
|
+
/** Прошло ли с прошлого вопроса или задачи между делом столько сообщений человека, сколько велит `pace`. */
|
|
38
|
+
export declare function sideTaskPaceReached(flow: AgentFlow, run: FlowRun): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Задачи, которые агент может предложить сейчас: открытые, и только если темп позволяет, состояние не «без вопросов» и
|
|
41
|
+
* сценарий не кончился. Порядок — как в сценарии. Встроенная «узнать город» — первой и вне общего темпа: у неё только
|
|
42
|
+
* первый день до ночи. Задач нет — пусто, как в 0.48.
|
|
43
|
+
*/
|
|
44
|
+
export declare function openSideTasks(input: OpenSideTasksInput): FlowSideTask[];
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type AgentFlow, type FlowState } from "../format/flow-format.js";
|
|
2
|
+
import type { FlowRun } from "./flow-run.js";
|
|
3
|
+
/** Куда ведёт «назад»: последнее в пути основное состояние, касания пропускаются. Такого нет — старт (→ В1). */
|
|
4
|
+
export declare function returnTarget(flow: AgentFlow, run: FlowRun): FlowState | undefined;
|
|
5
|
+
/** Состояние, в которое ведёт условие, или `undefined`: цели нет, она удалена или «назад» ведёт туда же, где чат. */
|
|
6
|
+
export declare function exitTarget(flow: AgentFlow, run: FlowRun, to: string | null): {
|
|
7
|
+
state: FlowState;
|
|
8
|
+
returned: boolean;
|
|
9
|
+
} | undefined;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { AgentFlow, FlowSchedule, TimerCondition } from "../format/flow-format.js";
|
|
2
|
+
import type { FlowRun } from "./flow-run.js";
|
|
3
|
+
import { type FirstWakeContext, type FlowFirstReason } from "./nudges.js";
|
|
4
|
+
/** `exitId` срока «срок вышел» в `FlowDue`: это не выход ноды, а конец разговора (`schedule.lengthDays`). */
|
|
5
|
+
export declare const FLOW_DEADLINE_EXIT = "@deadline";
|
|
6
|
+
export interface FlowDue {
|
|
7
|
+
/** Когда сработает, мс с 1970 года. */
|
|
8
|
+
at: number;
|
|
9
|
+
exitId: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Срок одного таймера в текущем состоянии чата; `null` — сейчас не идёт (тишины нет: человек ответил или агент ещё не писал).
|
|
13
|
+
* «Нода длится N дней» и «наступил день N» считаются по «Дням и времени»: без `schedule` не идут.
|
|
14
|
+
*/
|
|
15
|
+
export declare function timerDueAt(condition: TimerCondition, run: FlowRun, timeZone: string, schedule?: FlowSchedule): number | null;
|
|
16
|
+
/**
|
|
17
|
+
* Выход по таймеру, который уже наступил к входу в состояние и срок которого от входа не зависит: срабатывает сразу, в том
|
|
18
|
+
* же шаге, а не отдельным ходом. Тишина, время в состоянии, «длится N дней», время суток — нет: их срок от входа. Нет — `null`.
|
|
19
|
+
*/
|
|
20
|
+
export declare function overdueOnEntry(flow: AgentFlow, run: FlowRun, now: number, timeZone: string): string | null;
|
|
21
|
+
/**
|
|
22
|
+
* Ближайший таймер чата: побеждает наступивший раньше, при равенстве — таймер состояния. «Срок вышел» побеждает и при
|
|
23
|
+
* равенстве: разговор кончается, а не переходит. Законченный разговор сроков не имеет. `timeZone` — пояс человека.
|
|
24
|
+
*/
|
|
25
|
+
export declare function nextDue(flow: AgentFlow, run: FlowRun, _now: number, timeZone: string): FlowDue | null;
|
|
26
|
+
/** `exitId` срока «пишет первым» в `FlowDue`: касание, утреннее или ответ на накопленное, без перехода. */
|
|
27
|
+
export declare const FLOW_FIRST_EXIT = "@first";
|
|
28
|
+
/** `exitId` срока «не завершил»: конец разговора без сообщения. */
|
|
29
|
+
export declare const FLOW_GIVE_UP_EXIT = "@give_up";
|
|
30
|
+
/**
|
|
31
|
+
* Ближайший срок чата: переход ноды, «срок вышел», «не завершил» или «пишет первым». При равенстве побеждает «срок
|
|
32
|
+
* вышел», затем «не завершил» (разговор кончается), затем таймер ноды: причины «пишет первым» того же момента он заберёт с собой.
|
|
33
|
+
*/
|
|
34
|
+
export declare function nextWake(flow: AgentFlow, run: FlowRun, now: number, timeZone: string, context?: FirstWakeContext): FlowDue | null;
|
|
35
|
+
/** Что наступило к `now`: конец разговора, переход ноды и все причины написать первым — на один ход. */
|
|
36
|
+
export interface DueReasons {
|
|
37
|
+
/** «Срок вышел»: остальное не считается. */
|
|
38
|
+
deadline: boolean;
|
|
39
|
+
/** «Не завершил»: конец без сообщения. */
|
|
40
|
+
giveUp: boolean;
|
|
41
|
+
/** Наступивший выход ноды по таймеру. */
|
|
42
|
+
exitId: string | null;
|
|
43
|
+
/** Утро, накопленное, касание — по порядку. Переход ноды в них не входит: его причину даёт сам переход. */
|
|
44
|
+
reasons: FlowFirstReason[];
|
|
45
|
+
/** Касание в причинах — своего ряда ноды на N дней: шаг помечается, общий ряд потом начнётся сначала. */
|
|
46
|
+
ownNudge?: boolean;
|
|
47
|
+
}
|
|
48
|
+
export declare function dueReasons(flow: AgentFlow, run: FlowRun, now: number, timeZone: string, context?: FirstWakeContext): DueReasons;
|
|
49
|
+
/** Ближайший срок «пишет первым» строго после `now`: касание, утреннее, накопленное. Нет — `null`. */
|
|
50
|
+
export declare function nextFirstMessageAfter(flow: AgentFlow, run: FlowRun, now: number, timeZone: string, context?: FirstWakeContext): number | null;
|
|
51
|
+
/** Ближайший конец разговора после `now`: «срок вышел» или «не завершил». Нет — `null`. */
|
|
52
|
+
export declare function endingWake(flow: AgentFlow, run: FlowRun, now: number, timeZone: string, context: FirstWakeContext): FlowDue | null;
|
|
53
|
+
/**
|
|
54
|
+
* Касание отложено (нельзя писать сейчас, ход не начался): срок — повтор `retry`, но не позже ближайшего срока, который не
|
|
55
|
+
* касание: выход ноды, «срок вышел», «не завершил». Конец разговора не зависит от того, дошло ли касание. Сроки не позже
|
|
56
|
+
* `now` (наступивший выход, который ждёт хода) не в счёт. `retry.at: null` — повтора нет. Ничего нет — `null`.
|
|
57
|
+
*/
|
|
58
|
+
export declare function deferredWake(flow: AgentFlow, run: FlowRun, now: number, timeZone: string, context: FirstWakeContext, retry: {
|
|
59
|
+
at: number | null;
|
|
60
|
+
exitId: string;
|
|
61
|
+
}): FlowDue | null;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface ZonedDate {
|
|
2
|
+
year: number;
|
|
3
|
+
/** 1…12 */
|
|
4
|
+
month: number;
|
|
5
|
+
day: number;
|
|
6
|
+
}
|
|
7
|
+
export interface ZonedParts extends ZonedDate {
|
|
8
|
+
hour: number;
|
|
9
|
+
minute: number;
|
|
10
|
+
second: number;
|
|
11
|
+
}
|
|
12
|
+
/** Дата и часы на часах человека в момент `at`. */
|
|
13
|
+
export declare function zonedParts(at: number, timeZone: string): ZonedParts;
|
|
14
|
+
/** Момент, когда на часах человека будет `date` и `minutes` минут от полуночи. */
|
|
15
|
+
export declare function zonedTime(date: ZonedDate, minutes: number, timeZone: string): number;
|
|
16
|
+
/** Следующий календарный день. */
|
|
17
|
+
export declare function nextDate(date: ZonedDate, days?: number): ZonedDate;
|
|
18
|
+
/** «ЧЧ:ММ» → минуты от полуночи; не то — `null`. */
|
|
19
|
+
export declare function parseClock(clock: string): number | null;
|
|
20
|
+
/** Минуты от полуночи на часах человека. */
|
|
21
|
+
export declare function clockMinutes(at: number, timeZone: string): number;
|
|
22
|
+
/** Первый момент строго после `after`, когда на часах человека `minutes` минут от полуночи. */
|
|
23
|
+
export declare function nextClockTime(after: number, minutes: number, timeZone: string): number;
|
|
24
|
+
/** Начало следующих суток на часах человека. */
|
|
25
|
+
export declare function startOfNextDay(at: number, timeZone: string): number;
|
|
26
|
+
/** Сутки человека: «ГГГГ-ММ-ДД» в его поясе. */
|
|
27
|
+
export declare function localDay(at: number, timeZone: string): string;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FlowCatalog } from "./flow-format.js";
|
|
2
|
+
/** Имена кнопок и событий приложения — каталог даёт их строками или объектами `{ name, label }`. */
|
|
3
|
+
export declare function catalogEventNames(catalog: Pick<FlowCatalog, "events">): string[];
|
|
4
|
+
/** Подпись события из каталога; нет каталога, события или подписи — `undefined`, и показывают имя. */
|
|
5
|
+
export declare function catalogEventLabel(catalog: Pick<FlowCatalog, "events"> | undefined, name: string): string | undefined;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type AgentFlow } from "./flow-format.js";
|
|
2
|
+
type Json = Record<string, unknown>;
|
|
3
|
+
/**
|
|
4
|
+
* JSON сценария без значений по умолчанию — так его хранят и показывают в окне JSON.
|
|
5
|
+
* `parseFlow(compactFlow(flow))` возвращает тот же сценарий.
|
|
6
|
+
*/
|
|
7
|
+
export declare function compactFlow(flow: AgentFlow): Json;
|
|
8
|
+
export {};
|