@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,100 @@
1
+ import {
2
+ fieldById,
3
+ fieldValueFits,
4
+ isFieldStale,
5
+ sideQuestion
6
+ } from "./chunk-BOV6FJGU.js";
7
+
8
+ // src/runtime/client-facts.ts
9
+ var FACT_PREFIX = "fact:";
10
+ var MAX_FACTS = 30;
11
+ var MAX_FACT_LENGTH = 200;
12
+ var normalized = (text) => text.trim().toLowerCase().replace(/\s+/g, " ");
13
+ function factId(text) {
14
+ let hash = 2166136261;
15
+ for (const char of normalized(text)) {
16
+ hash ^= char.codePointAt(0);
17
+ hash = Math.imul(hash, 16777619) >>> 0;
18
+ }
19
+ return `f${hash.toString(16).padStart(8, "0")}`;
20
+ }
21
+ var sameFact = (left, right) => normalized(left) === normalized(right);
22
+ var isFactEntry = (fieldId) => fieldId.startsWith(FACT_PREFIX);
23
+ var byWriteOrder = (left, right) => left.updatedAt.localeCompare(right.updatedAt) || left.id.localeCompare(right.id);
24
+ function moduleFacts(store) {
25
+ const read = async (ownerId) => {
26
+ const entries = await store.readCard(ownerId);
27
+ return entries.filter((entry) => isFactEntry(entry.fieldId)).map((entry) => ({ id: entry.fieldId.slice(FACT_PREFIX.length), text: String(entry.value), updatedAt: entry.updatedAt, chatId: entry.chatId, flowId: entry.flowId })).sort(byWriteOrder);
28
+ };
29
+ return {
30
+ read,
31
+ add: ({ ownerId, fact, chatId, flowId, at }) => store.writeCardField({ ownerId, fieldId: `${FACT_PREFIX}${fact.id}`, value: fact.text, chatId, flowId, at: at.toISOString() }),
32
+ async forget(ownerId, id) {
33
+ if (id !== "all") return store.forgetCard(ownerId, `${FACT_PREFIX}${id}`);
34
+ for (const fact of await read(ownerId)) await store.forgetCard(ownerId, `${FACT_PREFIX}${fact.id}`);
35
+ }
36
+ };
37
+ }
38
+ function clientFactStore(store, adapter) {
39
+ const own = adapter?.facts;
40
+ if (!own) return moduleFacts(store);
41
+ return {
42
+ read: async (ownerId) => [...await own.read(ownerId)].sort(byWriteOrder),
43
+ add: (input) => own.add(input),
44
+ forget: (ownerId, id) => own.forget(ownerId, id)
45
+ };
46
+ }
47
+ var factEntry = (fact) => ({ fieldId: `${FACT_PREFIX}${fact.id}`, value: fact.text, updatedAt: fact.updatedAt, chatId: fact.chatId, flowId: fact.flowId });
48
+
49
+ // src/prompt/client-card-block.ts
50
+ function fieldValueText(value) {
51
+ if (typeof value === "string") return value.trim();
52
+ if (typeof value === "number") return String(value);
53
+ if (typeof value === "boolean") return value ? "\u0434\u0430" : "\u043D\u0435\u0442";
54
+ return JSON.stringify(value);
55
+ }
56
+ function questionLine(flow, run, card, now) {
57
+ const question = sideQuestion(flow, run, { card, now });
58
+ const found = question && fieldById(flow, question.fieldId);
59
+ if (!question || !found) return "\u0421\u0435\u0439\u0447\u0430\u0441 \u043D\u0435 \u0441\u043F\u0440\u0430\u0448\u0438\u0432\u0430\u0439 \u043D\u0438\u0447\u0435\u0433\u043E \u043E \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0435 \u043C\u0435\u0436\u0434\u0443 \u0434\u0435\u043B\u043E\u043C: \u043E\u0442\u0432\u0435\u0442\u044C \u043D\u0430 \u0442\u043E, \u0447\u0442\u043E \u043E\u043D \u043F\u0438\u0448\u0435\u0442.";
60
+ const { field } = found;
61
+ const noted = `flow_note { asked: "${field.id}" }`;
62
+ if (question.reason === "learn") return `\u0421\u043D\u0430\u0447\u0430\u043B\u0430 \u0443\u0437\u043D\u0430\u0439: \xAB${field.name}\xBB \u2014 ${field.about} \u0417\u0430\u043F\u0438\u0448\u0438 \u043E\u0442\u0432\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 flow_note.`;
63
+ if (question.reason === "stale") {
64
+ return `\u0414\u0430\u0432\u043D\u043E \u043D\u0435 \u0443\u0442\u043E\u0447\u043D\u044F\u043B\u0438: \xAB${field.name}\xBB (\u0441\u0435\u0439\u0447\u0430\u0441 \u0437\u0430\u043F\u0438\u0441\u0430\u043D\u043E: ${fieldValueText(card[field.id].value)}). \u041C\u044F\u0433\u043A\u043E \u0441\u0432\u0435\u0440\u044C \u043E\u0434\u043D\u0438\u043C \u043A\u043E\u0440\u043E\u0442\u043A\u0438\u043C \u0432\u043E\u043F\u0440\u043E\u0441\u043E\u043C \u043A \u043C\u0435\u0441\u0442\u0443. \u0421\u043F\u0440\u043E\u0441\u0438\u043B \u2014 \u043E\u0442\u043C\u0435\u0442\u044C ${noted}; \u0435\u0441\u043B\u0438 \u0438\u0437\u043C\u0435\u043D\u0438\u043B\u043E\u0441\u044C \u2014 \u0437\u0430\u043F\u0438\u0448\u0438 \u043D\u043E\u0432\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 flow_note.`;
65
+ }
66
+ return `\u041C\u043E\u0436\u043D\u043E \u0441\u043F\u0440\u043E\u0441\u0438\u0442\u044C \u043C\u0435\u0436\u0434\u0443 \u0434\u0435\u043B\u043E\u043C: \xAB${field.name}\xBB \u2014 ${field.about} \u041E\u0434\u0438\u043D \u043A\u043E\u0440\u043E\u0442\u043A\u0438\u0439 \u0432\u043E\u043F\u0440\u043E\u0441 \u043A \u043C\u0435\u0441\u0442\u0443, \u043D\u0435 \u0432 \u043B\u043E\u0431. \u0421\u043F\u0440\u043E\u0441\u0438\u043B \u2014 \u043E\u0442\u043C\u0435\u0442\u044C ${noted}.`;
67
+ }
68
+ function clientCardBlock(input) {
69
+ const { flow, run, now } = input;
70
+ const facts = input.facts ?? [];
71
+ if (flow.clientCard.length === 0 && flow.chatNotes.length === 0 && facts.length === 0) return "";
72
+ const byId = new Map(input.card.map((entry) => [entry.fieldId, { value: entry.value, updatedAt: Date.parse(entry.updatedAt) }]));
73
+ const known = (field, value) => fieldValueFits(field, value);
74
+ const cardLines = flow.clientCard.flatMap((field) => {
75
+ const entry = byId.get(field.id);
76
+ if (!entry || !known(field, entry.value)) return [];
77
+ const stale = isFieldStale(field, entry.updatedAt, now) ? " (\u0437\u0430\u043F\u0438\u0441\u0430\u043D\u043E \u0434\u0430\u0432\u043D\u043E, \u043C\u043E\u0433\u043B\u043E \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C\u0441\u044F)" : "";
78
+ return [`- ${field.name}: ${fieldValueText(entry.value)}${stale}`];
79
+ });
80
+ const noteLines = flow.chatNotes.flatMap((field) => known(field, run.notes[field.id]) ? [`- ${field.name}: ${fieldValueText(run.notes[field.id])}`] : []);
81
+ const lines = ["\u0427\u0442\u043E \u0438\u0437\u0432\u0435\u0441\u0442\u043D\u043E \u043E \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0435 (\u043A\u0430\u0440\u0442\u043E\u0447\u043A\u0430 \u043A\u043B\u0438\u0435\u043D\u0442\u0430):", ...cardLines.length > 0 ? cardLines : facts.length > 0 ? [] : ["- \u043F\u043E\u043A\u0430 \u043D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u0437\u0430\u043F\u0438\u0441\u0430\u043D\u043E"]];
82
+ if (facts.length > 0) lines.push("", "\u0424\u0430\u043A\u0442\u044B \u043E \u0447\u0435\u043B\u043E\u0432\u0435\u043A\u0435:", ...facts.map((fact) => `- ${fact.text}`));
83
+ if (noteLines.length > 0) lines.push("", "\u0417\u0430\u043C\u0435\u0442\u043A\u0438 \u044D\u0442\u043E\u0433\u043E \u0447\u0430\u0442\u0430:", ...noteLines);
84
+ lines.push("", questionLine(flow, run, Object.fromEntries(byId), now));
85
+ return lines.join("\n");
86
+ }
87
+
88
+ export {
89
+ fieldValueText,
90
+ clientCardBlock,
91
+ FACT_PREFIX,
92
+ MAX_FACTS,
93
+ MAX_FACT_LENGTH,
94
+ factId,
95
+ sameFact,
96
+ isFactEntry,
97
+ clientFactStore,
98
+ factEntry
99
+ };
100
+ //# sourceMappingURL=chunk-3PTJI2XY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/client-facts.ts","../src/prompt/client-card-block.ts"],"sourcesContent":["import type { ClientFact, FlowStore } from \"../store/flow-store\";\nimport type { ClientCardStore, ClientFactStore } from \"./flow-types\";\n\n/** Факт в таблице карточки модуля — запись с `fieldId` = `fact:<id>`; приложение не должно называть так свои поля. */\nexport const FACT_PREFIX = \"fact:\";\nexport const MAX_FACTS = 30;\nexport const MAX_FACT_LENGTH = 200;\n\nconst normalized = (text: string) => text.trim().toLowerCase().replace(/\\s+/g, \" \");\n\n/** Тот же факт (с точностью до регистра и пробелов) — тот же id: `f` и восемь шестнадцатеричных цифр. */\nexport function factId(text: string): string {\n let hash = 0x811c9dc5;\n for (const char of normalized(text)) {\n hash ^= char.codePointAt(0)!;\n hash = Math.imul(hash, 0x01000193) >>> 0;\n }\n return `f${hash.toString(16).padStart(8, \"0\")}`;\n}\n\nexport const sameFact = (left: string, right: string) => normalized(left) === normalized(right);\n\nexport const isFactEntry = (fieldId: string) => fieldId.startsWith(FACT_PREFIX);\n\n/** Факты по времени записи, раньше — выше: начало блока для модели не меняется, пока не пишут новое. */\nexport const byWriteOrder = (left: ClientFact, right: ClientFact) => left.updatedAt.localeCompare(right.updatedAt) || left.id.localeCompare(right.id);\n\n/** Факты в таблице модуля: рядом с полями карточки, под префиксом. Своей таблицы и миграции не нужно. */\nfunction moduleFacts(store: FlowStore): ClientFactStore {\n const read = async (ownerId: string): Promise<ClientFact[]> => {\n const entries = await store.readCard(ownerId);\n return entries\n .filter((entry) => isFactEntry(entry.fieldId))\n .map((entry) => ({ id: entry.fieldId.slice(FACT_PREFIX.length), text: String(entry.value), updatedAt: entry.updatedAt, chatId: entry.chatId, flowId: entry.flowId }))\n .sort(byWriteOrder);\n };\n return {\n read,\n add: ({ ownerId, fact, chatId, flowId, at }) => store.writeCardField({ ownerId, fieldId: `${FACT_PREFIX}${fact.id}`, value: fact.text, chatId, flowId, at: at.toISOString() }),\n async forget(ownerId, id) {\n if (id !== \"all\") return store.forgetCard(ownerId, `${FACT_PREFIX}${id}`);\n for (const fact of await read(ownerId)) await store.forgetCard(ownerId, `${FACT_PREFIX}${fact.id}`);\n },\n };\n}\n\n/** Факты человека: у приложения (`clientCard.facts`) или в таблице модуля. */\nexport function clientFactStore(store: FlowStore, adapter?: ClientCardStore): ClientFactStore {\n const own = adapter?.facts;\n if (!own) return moduleFacts(store);\n return {\n read: async (ownerId) => [...(await own.read(ownerId))].sort(byWriteOrder),\n add: (input) => own.add(input),\n forget: (ownerId, id) => own.forget(ownerId, id),\n };\n}\n\n/** Факт как запись карточки: так его видят `readClientCard` и экран («Что агент знает о вас»). */\nexport const factEntry = (fact: ClientFact) => ({ fieldId: `${FACT_PREFIX}${fact.id}`, value: fact.text, updatedAt: fact.updatedAt, chatId: fact.chatId, flowId: fact.flowId });\n","import type { AgentFlow, FlowField } from \"../format/flow-format\";\nimport type { FlowRun } from \"../engine/flow-run\";\nimport { fieldValueFits } from \"../engine/data-conditions\";\nimport { fieldById } from \"../engine/flow-graph\";\nimport { isFieldStale, sideQuestion } from \"../engine/side-questions\";\nimport type { ClientCardEntry, ClientFact } from \"../store/flow-store\";\n\n/** Значение поля готовой строкой: для блока модели, ответа `client_card` и экрана. */\nexport function fieldValueText(value: unknown): string {\n if (typeof value === \"string\") return value.trim();\n if (typeof value === \"number\") return String(value);\n if (typeof value === \"boolean\") return value ? \"да\" : \"нет\";\n return JSON.stringify(value);\n}\n\nfunction questionLine(flow: AgentFlow, run: FlowRun, card: Record<string, { value: unknown; updatedAt: number }>, now: number): string {\n const question = sideQuestion(flow, run, { card, now });\n const found = question && fieldById(flow, question.fieldId);\n if (!question || !found) return \"Сейчас не спрашивай ничего о человеке между делом: ответь на то, что он пишет.\";\n const { field } = found;\n const noted = `flow_note { asked: \"${field.id}\" }`;\n if (question.reason === \"learn\") return `Сначала узнай: «${field.name}» — ${field.about} Запиши ответ через flow_note.`;\n if (question.reason === \"stale\") {\n return `Давно не уточняли: «${field.name}» (сейчас записано: ${fieldValueText(card[field.id]!.value)}). Мягко сверь одним коротким вопросом к месту. Спросил — отметь ${noted}; если изменилось — запиши новое значение через flow_note.`;\n }\n return `Можно спросить между делом: «${field.name}» — ${field.about} Один короткий вопрос к месту, не в лоб. Спросил — отметь ${noted}.`;\n}\n\n/**\n * Блок `flow:client`: что известно о человеке, что устарело, о чём можно спросить между делом. Известное и заметки идут\n * по порядку полей сценария (порядок = что важнее). Значение не по типу поля считается неизвестным.\n */\nexport function clientCardBlock(input: { flow: AgentFlow; run: FlowRun; card: ClientCardEntry[]; facts?: ClientFact[]; now: number }): string {\n const { flow, run, now } = input;\n const facts = input.facts ?? [];\n if (flow.clientCard.length === 0 && flow.chatNotes.length === 0 && facts.length === 0) return \"\";\n\n const byId = new Map(input.card.map((entry) => [entry.fieldId, { value: entry.value, updatedAt: Date.parse(entry.updatedAt) }]));\n const known = (field: FlowField, value: unknown) => fieldValueFits(field, value);\n\n const cardLines = flow.clientCard.flatMap((field) => {\n const entry = byId.get(field.id);\n if (!entry || !known(field, entry.value)) return [];\n const stale = isFieldStale(field, entry.updatedAt, now) ? \" (записано давно, могло измениться)\" : \"\";\n return [`- ${field.name}: ${fieldValueText(entry.value)}${stale}`];\n });\n const noteLines = flow.chatNotes.flatMap((field) => (known(field, run.notes[field.id]) ? [`- ${field.name}: ${fieldValueText(run.notes[field.id])}`] : []));\n\n const lines = [\"Что известно о человеке (карточка клиента):\", ...(cardLines.length > 0 ? cardLines : facts.length > 0 ? [] : [\"- пока ничего не записано\"])];\n if (facts.length > 0) lines.push(\"\", \"Факты о человеке:\", ...facts.map((fact) => `- ${fact.text}`));\n if (noteLines.length > 0) lines.push(\"\", \"Заметки этого чата:\", ...noteLines);\n lines.push(\"\", questionLine(flow, run, Object.fromEntries(byId), now));\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,9 @@
1
+ // src/store/migration-settings.ts
2
+ var FLOWS_MIGRATIONS_TABLE = "__flows_migrations";
3
+ var FLOWS_MIGRATION_LOCK_KEY = 7311900447;
4
+
5
+ export {
6
+ FLOWS_MIGRATIONS_TABLE,
7
+ FLOWS_MIGRATION_LOCK_KEY
8
+ };
9
+ //# sourceMappingURL=chunk-BNMQUNSI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/store/migration-settings.ts"],"sourcesContent":["/** Своя таблица учёта: хранилище чатов, песочница, фон и мессенджеры живут в той же базе и ведут свои. */\nexport const FLOWS_MIGRATIONS_TABLE = \"__flows_migrations\";\n\n/**\n * Постоянное число для блокировки базы миграциями сценариев. Не совпадает с ключами ядра (…442), песочницы (…443),\n * фона (…444), мессенджеров (…445) и картинок (…446).\n */\nexport const FLOWS_MIGRATION_LOCK_KEY = 7_311_900_447;\n"],"mappings":";AACO,IAAM,yBAAyB;AAM/B,IAAM,2BAA2B;","names":[]}