@ykurilov/agent-chat-react 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 (106) hide show
  1. package/CHANGELOG.md +1670 -0
  2. package/LICENSE +21 -0
  3. package/README.md +128 -2
  4. package/dist/chunk-JZQ7ZOJI.js +6959 -0
  5. package/dist/chunk-JZQ7ZOJI.js.map +1 -0
  6. package/dist/index.js +501 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/panel.js +399 -0
  9. package/dist/panel.js.map +1 -0
  10. package/dist/types/agent-chat-extensions.d.ts +76 -0
  11. package/dist/types/agent-chat.d.ts +103 -0
  12. package/dist/types/agent-panel/agent-panel-hooks.d.ts +14 -0
  13. package/dist/types/agent-panel/agent-panel-provider.d.ts +24 -0
  14. package/dist/types/agent-panel/agent-panel-skin.d.ts +41 -0
  15. package/dist/types/agent-panel/agent-panel.d.ts +13 -0
  16. package/dist/types/agent-panel/index.d.ts +8 -0
  17. package/dist/types/agent-panel/panel-context.d.ts +46 -0
  18. package/dist/types/agent-panel/panel-state.d.ts +12 -0
  19. package/dist/types/answer-editing/answer-editing.d.ts +25 -0
  20. package/dist/types/app-bridge/app-bridge.d.ts +50 -0
  21. package/dist/types/app-bridge/browser-calls.d.ts +24 -0
  22. package/dist/types/app-bridge/create-app-bridge.d.ts +35 -0
  23. package/dist/types/app-bridge/remembered-ids.d.ts +6 -0
  24. package/dist/types/app-bridge/tab-id.d.ts +10 -0
  25. package/dist/types/app-events.d.ts +39 -0
  26. package/dist/types/app-refusal.d.ts +21 -0
  27. package/dist/types/attachments-contract.d.ts +82 -0
  28. package/dist/types/background-tasks/use-background-tasks.d.ts +53 -0
  29. package/dist/types/chat-access.d.ts +33 -0
  30. package/dist/types/chat-list/active-chat-memory.d.ts +5 -0
  31. package/dist/types/chat-list/chat-list-client.d.ts +35 -0
  32. package/dist/types/chat-list/chat-list-skin.d.ts +63 -0
  33. package/dist/types/chat-list/chat-workspace.d.ts +17 -0
  34. package/dist/types/chat-list/use-chat-list-view.d.ts +12 -0
  35. package/dist/types/chat-list/use-chat-list.d.ts +47 -0
  36. package/dist/types/chat-list/use-workspace-list-sync.d.ts +7 -0
  37. package/dist/types/chat-state/chat-state.d.ts +27 -0
  38. package/dist/types/chat-types.d.ts +85 -0
  39. package/dist/types/chat-watch/chat-watch.d.ts +57 -0
  40. package/dist/types/close-stopped-tool-calls.d.ts +8 -0
  41. package/dist/types/composer-actions.d.ts +29 -0
  42. package/dist/types/diagrams/diagram-renders.d.ts +16 -0
  43. package/dist/types/diagrams/mermaid-blocks.d.ts +18 -0
  44. package/dist/types/diagrams/unique-svg-ids.d.ts +6 -0
  45. package/dist/types/diagrams/use-diagram-blocks.d.ts +25 -0
  46. package/dist/types/diagrams/use-diagram-colors.d.ts +8 -0
  47. package/dist/types/dictation-field.d.ts +19 -0
  48. package/dist/types/expanded-parts.d.ts +11 -0
  49. package/dist/types/feed-announcement.d.ts +7 -0
  50. package/dist/types/helpers/helper-call.d.ts +57 -0
  51. package/dist/types/index.d.ts +53 -0
  52. package/dist/types/labels.d.ts +468 -0
  53. package/dist/types/live-demos/answer-fences.d.ts +25 -0
  54. package/dist/types/live-demos/live-demo-document.d.ts +42 -0
  55. package/dist/types/live-demos/live-demo-frame.d.ts +14 -0
  56. package/dist/types/live-demos/use-live-demo-blocks.d.ts +18 -0
  57. package/dist/types/liveness/connection-errors.d.ts +15 -0
  58. package/dist/types/liveness/reconnect-attempts.d.ts +14 -0
  59. package/dist/types/liveness/request-deadline.d.ts +16 -0
  60. package/dist/types/liveness/silence-watchdog.d.ts +21 -0
  61. package/dist/types/media-viewer/answer-file-images.d.ts +18 -0
  62. package/dist/types/media-viewer/collect-viewer-items.d.ts +16 -0
  63. package/dist/types/media-viewer/generated-images.d.ts +18 -0
  64. package/dist/types/media-viewer/media-viewer-types.d.ts +17 -0
  65. package/dist/types/media-viewer/open-attachments.d.ts +9 -0
  66. package/dist/types/media-viewer/use-media-viewer.d.ts +23 -0
  67. package/dist/types/memory/agent-memory.d.ts +13 -0
  68. package/dist/types/memory/memory-client.d.ts +19 -0
  69. package/dist/types/memory/memory-skin.d.ts +103 -0
  70. package/dist/types/memory/memory-tree.d.ts +17 -0
  71. package/dist/types/memory/memory-types.d.ts +77 -0
  72. package/dist/types/memory/use-memory-notes.d.ts +23 -0
  73. package/dist/types/message-actions.d.ts +45 -0
  74. package/dist/types/message-feed.d.ts +27 -0
  75. package/dist/types/notices/agent-notices.d.ts +40 -0
  76. package/dist/types/pause.d.ts +2 -0
  77. package/dist/types/server-refusal.d.ts +16 -0
  78. package/dist/types/skin-contract.d.ts +673 -0
  79. package/dist/types/spending-status.d.ts +76 -0
  80. package/dist/types/steering/corrections.d.ts +19 -0
  81. package/dist/types/step-reset.d.ts +15 -0
  82. package/dist/types/subject-chat/subject-chat-loading.d.ts +8 -0
  83. package/dist/types/subject-chat/use-subject-chat-id.d.ts +21 -0
  84. package/dist/types/thinking-status/thinking-status.d.ts +33 -0
  85. package/dist/types/turn-finished.d.ts +14 -0
  86. package/dist/types/use-agent-chat.d.ts +228 -0
  87. package/dist/types/use-model-choice.d.ts +31 -0
  88. package/dist/types/use-voice-dialog.d.ts +18 -0
  89. package/dist/types/use-voice-dictation.d.ts +17 -0
  90. package/dist/types/voice-dialog.d.ts +103 -0
  91. package/dist/types/voice-input.d.ts +47 -0
  92. package/dist/types/voice-tags.d.ts +18 -0
  93. package/dist/types/voice-turn.d.ts +11 -0
  94. package/dist/types/widgets/custom-widget-guard.d.ts +21 -0
  95. package/dist/types/widgets/form-check.d.ts +29 -0
  96. package/dist/types/widgets/suggested-replies.d.ts +6 -0
  97. package/dist/types/widgets/use-widget-answer.d.ts +54 -0
  98. package/dist/types/widgets/widget-answer-keys.d.ts +14 -0
  99. package/dist/types/widgets/widget-messages.d.ts +14 -0
  100. package/dist/types/widgets/widget-part.d.ts +17 -0
  101. package/dist/types/widgets/widget-view.d.ts +50 -0
  102. package/dist/types/without-markdown.d.ts +1 -0
  103. package/dist/types/work-view/step-phrases.d.ts +37 -0
  104. package/dist/types/work-view/work-layout.d.ts +57 -0
  105. package/dist/types/work-view/work-steps-part.d.ts +15 -0
  106. package/package.json +53 -3
@@ -0,0 +1,57 @@
1
+ import type { DynamicToolUIPart, ToolUIPart } from "ai";
2
+ import type { ApprovalDecision, ApprovalFailureKind } from "../chat-types.js";
3
+ import type { HelperCallView } from "../skin-contract.js";
4
+ /** Шаг помощника: вызов его инструмента или кусок текста. */
5
+ export type HelperStep = {
6
+ type: "tool";
7
+ toolName: string;
8
+ input: unknown;
9
+ output?: unknown;
10
+ error?: string;
11
+ } | {
12
+ type: "text";
13
+ text: string;
14
+ };
15
+ /** Ход помощника, как его пишет сервер в вывод вызова `helper_*` (в том числе промежуточный). */
16
+ export interface HelperProgress {
17
+ task: string;
18
+ steps: HelperStep[];
19
+ text: string;
20
+ status: "running" | "awaiting_approval" | "done" | "failed" | "background";
21
+ pendingApproval?: {
22
+ approvalId: string;
23
+ toolName: string;
24
+ title?: string;
25
+ input: unknown;
26
+ };
27
+ taskId?: string;
28
+ error?: string;
29
+ /** Только на экране: решение человека по подтверждению помощника, пока сервер не прислал продолжение. */
30
+ decided?: "allowed" | "always" | "denied";
31
+ }
32
+ /** Приставка имени инструмента-помощника; часть протокола, слово не менять. */
33
+ export declare const HELPER_TOOL_PREFIX = "helper_";
34
+ type ToolPart = ToolUIPart | DynamicToolUIPart;
35
+ export declare const isHelperToolName: (name: string) => boolean;
36
+ export declare const isHelperPart: (part: ToolPart) => boolean;
37
+ /** Ход помощника из вывода вызова; нет вывода или он чужой формы — `undefined`. */
38
+ export declare function helperProgressOf(part: {
39
+ output?: unknown;
40
+ }): HelperProgress | undefined;
41
+ /** Id запроса подтверждения внутри помощника, который ждёт человека. */
42
+ export declare function pendingHelperApprovalId(part: {
43
+ output?: unknown;
44
+ }): string | undefined;
45
+ export interface HelperCallControls {
46
+ onApproval: (approvalId: string, decision: ApprovalDecision) => void;
47
+ approvalPendingId: string | null;
48
+ approvalFailure: {
49
+ id: string;
50
+ kind: ApprovalFailureKind;
51
+ text?: string;
52
+ } | null;
53
+ failureText: (kind: ApprovalFailureKind) => string;
54
+ }
55
+ /** Что рисует `skin.HelperCallRow`, кроме раскрытия: имя без приставки, задание, шаги, итог, статус, подтверждение и его действие. */
56
+ export declare function helperCallViewOf(part: ToolPart, controls: HelperCallControls): Omit<HelperCallView, "open" | "onOpenChange">;
57
+ export {};
@@ -0,0 +1,53 @@
1
+ export { AgentChat } from "./agent-chat.js";
2
+ export { STEP_RESET_PART_TYPE, withoutResetSteps } from "./step-reset.js";
3
+ export type { AttachmentsController, AttachmentsPlugin, ComposerAttachmentItem, ComposerAttachments, MessageAttachmentItem, MessageAttachmentsView, } from "./attachments-contract.js";
4
+ export type { AgentChatProps } from "./agent-chat.js";
5
+ export type { AgentChatExtensions, CustomWidgets, DiagramsClient, ImagesClient, VideosClient } from "./agent-chat-extensions.js";
6
+ export type { MediaViewerItem } from "./media-viewer/media-viewer-types.js";
7
+ export type { MessageAction, MessageActionContext, MessageActionTarget } from "./message-actions.js";
8
+ export type { ComposerActions, ComposerHelper } from "./composer-actions.js";
9
+ export type { TurnFinishedEvent } from "./turn-finished.js";
10
+ export type { AppEvent, AppEventHandler, AppEventInfo, AppEventViews } from "./app-events.js";
11
+ /** Блоки ```mermaid в тексте ответа: скин делит ими текст и нумерует схемы так же, как слой поведения. */
12
+ export { splitMermaidBlocks } from "./diagrams/mermaid-blocks.js";
13
+ export type { MarkdownSegment } from "./diagrams/mermaid-blocks.js";
14
+ /** Блоки ```mermaid и ```html-demo вместе: скин со схемами и демонстрациями делит текст одним разбором. */
15
+ export { LIVE_DEMO_LANGUAGE, splitAnswerFences } from "./live-demos/answer-fences.js";
16
+ export type { AnswerFenceKinds, AnswerSegment } from "./live-demos/answer-fences.js";
17
+ export { LIVE_DEMO_CSP, LIVE_DEMO_SANDBOX, MAX_LIVE_DEMO_BYTES } from "./live-demos/live-demo-document.js";
18
+ export type { AgentChatMessage, AnswerStatus, ApprovalDecision, BranchFork, ChatErrorKind, ChatMessageMetadata, ErrorNoticeKind, ChatModelChoice, CompactionMarker, ReasoningLevelId, TokenUsage, VoiceCut, VoiceSound, } from "./chat-types.js";
19
+ export { ChatLabelsProvider, englishLabels, englishWorkLabels, englishWorkViewLabels, russianLabels, useChatLabels, voiceErrorText } from "./labels.js";
20
+ export { useThinkingStatus } from "./thinking-status/thinking-status.js";
21
+ export type { ThinkingStatus } from "./thinking-status/thinking-status.js";
22
+ export type { ChatLabels, DiagramLabels, HelperLabels, LiveDemoLabels, ImageLabels, MessengerStatusLabels, NoticeLabels, ResolvedChatLabels, TaskLabels, VideoLabels, ViewerLabels, VoiceDialogLabels, VoiceErrorLabels, VoiceSpeechLabels, WidgetLabels, WorkViewLabels, } from "./labels.js";
23
+ export type { StepCall, StepPhrase, StepPhrases, StepPhraseText, WorkView } from "./work-view/step-phrases.js";
24
+ export type { SpendingInfo, SpendingPeriod, SpendingRefusalReason, SpendingScope, SpendingView, SpendingWindowInfo } from "./spending-status.js";
25
+ export type { AgentNoticeViewKind, AgentNoticeViewProps, AgentVideoView, ChatOriginView, ChatSkin, CustomWidgetProps, DiagramColors, DiagramView, FormFieldView, LiveDemoColors, LiveDemoView, GeneratedImagesView, HelperCallStatus, HelperCallView, HelperStepView, MediaViewerProps, MessageActionView, ModelChoiceView, StaffMessageView, TaskCardView, TaskStatusView, ToolApprovalView, ToolCallState, VoiceInputView, WidgetView, WorkStepsView, } from "./skin-contract.js";
26
+ export type { AgentAppBridge, AppDataChange, BrowserCall, BrowserCallResult, ScreenPlace } from "./app-bridge/app-bridge.js";
27
+ export { useAgentChat } from "./use-agent-chat.js";
28
+ export type { AppRefusal, AppRefusalKind } from "./app-refusal.js";
29
+ export type { ChatAccess, ChatCapabilities, ChatCapability, ChatClosure } from "./chat-access.js";
30
+ export { useChatState } from "./chat-state/chat-state.js";
31
+ export type { ChatStateValues } from "./chat-state/chat-state.js";
32
+ export type { ServerRefusal } from "./server-refusal.js";
33
+ export type { AgentChatState, ChatRefusal, ConnectionState, EditNotStartedReason, EditOutcome, EditRefusalReason, LivenessOptions, UseAgentChatOptions } from "./use-agent-chat.js";
34
+ export { useModelChoice } from "./use-model-choice.js";
35
+ export type { UseModelChoiceOptions } from "./use-model-choice.js";
36
+ export type { DictatedText, VoiceErrorDetails, VoiceErrorKind, VoiceInput, VoiceListener, VoiceSession, VoiceStartContext } from "./voice-input.js";
37
+ export { ChatWorkspace } from "./chat-list/chat-workspace.js";
38
+ export type { ChatWorkspaceProps } from "./chat-list/chat-workspace.js";
39
+ export type { ChatListDeleteRequestView, ChatListItemView, ChatListSkin } from "./chat-list/chat-list-skin.js";
40
+ export { useChatList } from "./chat-list/use-chat-list.js";
41
+ export type { ChatListActionError, ChatListState, ChatListStatus, UseChatListOptions } from "./chat-list/use-chat-list.js";
42
+ export type { ChatListEntry } from "./chat-list/chat-list-client.js";
43
+ export type { AnswerEnd, AssistantActivity, AssistantTextDelta, DialogChatBridge, VoiceDialogEngine, VoiceDialogError, VoiceDialogOpenOptions, VoiceDialogState, VoiceDialogView, VoiceDialogVoice, VoiceDialogVoices, } from "./voice-dialog.js";
44
+ export { AgentMemory } from "./memory/agent-memory.js";
45
+ export type { AgentMemoryProps } from "./memory/agent-memory.js";
46
+ export { createMemoryApi, MemoryRequestError } from "./memory/memory-client.js";
47
+ export type { MemoryConfirmTarget, MemoryMergeGroupView, MemoryNoteEditorErrors, MemorySkin } from "./memory/memory-skin.js";
48
+ export type { MemoryActionResult, MemoryApi, MemoryCounts, MemoryFailure, MemoryMerge, MemoryMergeGroup, MemoryNote, MemoryNoteInput, MemoryStatus, } from "./memory/memory-types.js";
49
+ export { useMemoryNotes } from "./memory/use-memory-notes.js";
50
+ export type { MemoryNotesState } from "./memory/use-memory-notes.js";
51
+ export { splitVoiceTags, stripVoiceTags } from "./voice-tags.js";
52
+ export { voiceAnswerIds } from "./voice-turn.js";
53
+ export type { SplitVoiceTags, VoiceTagMatch, VoiceTagOptions } from "./voice-tags.js";
@@ -0,0 +1,468 @@
1
+ import type { ReactNode } from "react";
2
+ import type { ErrorNoticeKind, ReasoningLevelId } from "./chat-types.js";
3
+ import type { MemoryFailure } from "./memory/memory-types.js";
4
+ import type { ChatOriginView, HelperCallStatus, TaskStatusView } from "./skin-contract.js";
5
+ import type { SpendingInfo } from "./spending-status.js";
6
+ import type { VoiceDialogError, VoiceDialogState } from "./voice-dialog.js";
7
+ import type { VoiceErrorDetails, VoiceErrorKind } from "./voice-input.js";
8
+ /** Почему правка не ушла или не принята: идёт ответ, нет связи, сервер не принял. */
9
+ export type EditErrorKind = "busy" | "offline" | "rejected" | "spendingLimit" | "signedOut" | "tooManyTurns" | "forbiddenOrigin";
10
+ /** Надписи голосового режима (договор скина, версия 10). */
11
+ export interface VoiceDialogLabels {
12
+ /** Кнопка включения режима. */
13
+ start: string;
14
+ /** Кнопка выхода из режима. */
15
+ exit: string;
16
+ /** Название меню голосов и подпись кнопки. */
17
+ voiceMenu: string;
18
+ /** Состояние режима словами. */
19
+ states: Record<VoiceDialogState, string>;
20
+ errors: Record<VoiceDialogError, string>;
21
+ /** Отметка у ответа, озвучку которого оборвали: «Вы перебили: озвучено до «…»». */
22
+ interruptedMark: (spokenTail: string) => string;
23
+ }
24
+ /** Надписи виджетов агента (договор скина, версия 13). */
25
+ export interface WidgetLabels {
26
+ /** Пометка у виджета, на который человек ответил сообщением. */
27
+ answeredByMessage: string;
28
+ /** Кнопка отправки выбора, оценки и формы. */
29
+ submit: string;
30
+ /** Подсказка под вариантами: ответ можно написать словами. */
31
+ choose: string;
32
+ /** Подпись одной звезды или деления шкалы для экранного диктора: «Оценка 3 из 5». */
33
+ ratingStars: (value: number, total: number) => string;
34
+ /** Ответ не отправился. */
35
+ answerFailed: string;
36
+ /** Виджет из другой ветки: нажать его нельзя. */
37
+ notCurrentBranch: string;
38
+ /** Запасной вид, когда у скина нет виджета: ответить можно сообщением. */
39
+ fallback: string;
40
+ /** Пометка обязательного поля формы и ошибка пустого обязательного поля. */
41
+ formRequired: string;
42
+ /** Для экранного диктора, когда ход остановился на виджете. */
43
+ asked: string;
44
+ /** Для экранного диктора, когда ответ ушёл на сервер. */
45
+ answerSent: string;
46
+ /** Кнопка отправки формы. */
47
+ formSubmit: string;
48
+ /** Пределы выбора нескольких вариантов: «Выберите от 1 до 3». */
49
+ choiceRange: (min: number, max: number) => string;
50
+ /** Число или дата вне пределов; нет одного края — `undefined`. */
51
+ formOutOfRange: (min: string | undefined, max: string | undefined) => string;
52
+ /** В поле числа не число. */
53
+ formNotNumber: string;
54
+ /** В поле даты не дата. */
55
+ formNotDate: string;
56
+ /** Текст длиннее предела. */
57
+ formTooLong: (max: number) => string;
58
+ /** Сервер ответил, что вопрос уже не ждёт: на него ответили в другой вкладке или закрыли. */
59
+ alreadyAnswered: string;
60
+ /** Сервер не принял ответ (не прошёл проверку). */
61
+ answerRejected: string;
62
+ /** Проверка ответа на сервере не уложилась в срок: ответ не принят, виджет открыт. */
63
+ answerCheckTimeout: string;
64
+ }
65
+ /** Надписи схем (договор скина, версия 13). */
66
+ export interface DiagramLabels {
67
+ loading: string;
68
+ failed: string;
69
+ /** Подпись кнопки «открыть схему во весь экран». */
70
+ open: string;
71
+ }
72
+ /** Надписи живых демонстраций (договор скина, версия 22). */
73
+ export interface LiveDemoLabels {
74
+ /** Плашка, пока блок дописывается. */
75
+ loading: string;
76
+ /** Подпись рамки для диктора. */
77
+ title: string;
78
+ /** Пометка под кодом: демонстрация больше предела. */
79
+ tooLarge: string;
80
+ /** Пометка под кодом: ответ закончился, а блок не закрыт. */
81
+ unfinished: string;
82
+ /** Пометка под кодом: демонстрация попыталась уйти со своей страницы. */
83
+ leftPage: string;
84
+ /** Пометка под кодом: в чате есть чужой текст (интернет, файл), демонстрации в нём не запускаются. */
85
+ externalContent: string;
86
+ }
87
+ /** Надписи картинок агента и вложений-картинок (договор скина, версия 13). */
88
+ export interface ImageLabels {
89
+ loading: string;
90
+ /** Подпись упавшей картинки; причину добавляет скин. */
91
+ failed: string;
92
+ /** Создание остановлено кнопкой «Стоп». */
93
+ stopped: string;
94
+ /** Подпись кнопки «открыть картинку в окне просмотра». */
95
+ open: string;
96
+ }
97
+ /** Надписи видео агента (договор скина, версия 14). */
98
+ export interface VideoLabels {
99
+ /** Подпись кнопки-карточки, которая запускает плеер. */
100
+ play: string;
101
+ /** «с 3:20» — с какой минуты начнётся видео. */
102
+ from: (time: string) => string;
103
+ fullscreen: string;
104
+ }
105
+ /** Надписи помощников (договор скина, версия 18). */
106
+ export interface HelperLabels {
107
+ /** Заголовок задания помощнику: «Поручено». */
108
+ assigned: string;
109
+ /** Заголовок итога помощника: «Вернул». */
110
+ returned: string;
111
+ status: Record<HelperCallStatus, string>;
112
+ }
113
+ /** Надписи фоновых задач (договор скина, версия 18). */
114
+ export interface TaskLabels {
115
+ status: Record<TaskStatusView, string>;
116
+ cancel: string;
117
+ /** Пока отмена идёт. */
118
+ canceling: string;
119
+ /** «идёт 2 мин 5 сек» у идущей задачи, «заняла 2 мин 5 сек» у законченной. */
120
+ elapsed: (ms: number, finished: boolean) => string;
121
+ }
122
+ /** Надписи служебных сообщений (договор скина, версия 18). */
123
+ export interface NoticeLabels {
124
+ taskDone: string;
125
+ taskFailed: string;
126
+ taskCanceled: string;
127
+ taskInterrupted: string;
128
+ taskTimedOut: string;
129
+ taskAwaitingApproval: string;
130
+ conversationStarted: string;
131
+ /** Подпись реплики живого сотрудника у скина без `StaffMessage` (версия 25): «Сотрудник Ольга». */
132
+ staffSaid: (staffName: string | undefined) => string;
133
+ /** Служебное сообщение одной строкой — у скина без `AgentNoticeView`: «Отчёт»: задача готова. Без названия — только `status`. */
134
+ line: (title: string, status: string) => string;
135
+ }
136
+ /** Строки статуса хода в мессенджерах: что делает агент, пока ответа ещё нет (договор скина, версия 18). */
137
+ export interface MessengerStatusLabels {
138
+ thinking: string;
139
+ /** «Использую инструмент: поиск в памяти». */
140
+ usingTool: (title: string) => string;
141
+ /** «Помощник «Аналитик» работает». */
142
+ helperWorking: (name: string) => string;
143
+ /** «Задача «Отчёт» ушла в фон». */
144
+ taskInBackground: (title: string) => string;
145
+ waitingForApproval: string;
146
+ }
147
+ /** Надписи простого вида работы агента (`workView: "simple"`, договор скина, версия 23). */
148
+ export interface WorkViewLabels {
149
+ /** Шаг идёт, а фразы для инструмента нет: «Работаю». Без многоточия: его добавляет `live`. */
150
+ stepRunning: string;
151
+ /** Шаг готов, а фразы нет: «Сделал шаг». */
152
+ stepDone: string;
153
+ /** Шаг не получился: «Делаю календарь — не вышло»; `running` — фраза «идёт» без многоточия. */
154
+ stepFailed: (running: string) => string;
155
+ /** Шаг без фразы не получился: «Шаг не получился». */
156
+ stepFailedUnknown: string;
157
+ /** Ответ закончился посреди шага («Стоп», обрыв): «Делаю календарь — не закончил». */
158
+ stepUnfinished: (running: string) => string;
159
+ /** То же без фразы: «Шаг не закончен». */
160
+ stepUnfinishedUnknown: string;
161
+ /** Одинаковые шаги подряд одной строкой: «Поискал в интернете ×5». */
162
+ stepRepeated: (phrase: string, count: number) => string;
163
+ /** Модель думает: «Думаю». */
164
+ thinking: string;
165
+ /** Живая строка: «Рисую календарь…». */
166
+ live: (phrase: string) => string;
167
+ /** Свёрнутые шаги: «Сделано 3 шага»; `count` — число вызовов, вместе с повторами. */
168
+ stepsDone: (count: number) => string;
169
+ /** Помощник работает и закончил, если приложение не дало фраз: «Помощник «Аналитик» работает». */
170
+ helperRunning: (name: string) => string;
171
+ helperDone: (name: string) => string;
172
+ }
173
+ /** Надписи окна просмотра (договор скина, версия 13). */
174
+ export interface ViewerLabels {
175
+ close: string;
176
+ next: string;
177
+ previous: string;
178
+ /** Кнопка «вписать в экран» после масштабирования. */
179
+ fit: string;
180
+ /** Счётчик «3 из 12»; только при нескольких элементах. */
181
+ counter: (position: number, total: number) => string;
182
+ }
183
+ /** Надписи для голоса вне голосового режима (договор скина, версия 13). */
184
+ export interface VoiceSpeechLabels {
185
+ /** Что слышно вместо блока схемы. */
186
+ diagramOnScreen: string;
187
+ /** Что слышно на месте карточки видео (версия 14). */
188
+ videoOnScreen: string;
189
+ /** Фраза к озвучке ждущего выбора: вопрос и варианты. */
190
+ widgetChoices: (question: string, options: readonly string[]) => string;
191
+ /** Фраза к озвучке ждущей формы, оценки или своего виджета; `title` — вопрос или заголовок, если есть. */
192
+ widgetOnScreen: (title?: string) => string;
193
+ }
194
+ /**
195
+ * Все надписи интерфейса чата. Скин берёт их отсюда и сам строк не пишет. Группы версии 13 (`widgets`, `diagram`, `images`,
196
+ * `viewer`, `voice`) и версии 14 (`videos`) необязательные: словарь приложения, написанный раньше, работает, недостающее берётся из `russianLabels`;
197
+ * внутри группы можно перекрыть любой один ключ.
198
+ */
199
+ export interface ChatLabels {
200
+ /**
201
+ * Язык словаря (BCP 47): `ru` у `russianLabels`, `en` у `englishLabels`. Скин по нему выбирает свои надписи — например,
202
+ * Тандем ставит словарь дизайн-системы на том же языке. Нет — скин решает сам (Тандем: русский или словарь приложения).
203
+ */
204
+ locale?: string;
205
+ composerPlaceholder: string;
206
+ /** Подпись поля ввода для экранного диктора. */
207
+ composerLabel: string;
208
+ send: string;
209
+ stop: string;
210
+ copyAnswer: string;
211
+ copied: string;
212
+ copyCode: string;
213
+ reasoningRunning: string;
214
+ reasoningDone: (seconds: number) => string;
215
+ /**
216
+ * Фразы, которые сменяют друг друга каждые 3–4 с, пока модель думает и текста ответа ещё нет. Пустой набор — одна
217
+ * `reasoningRunning`. Нет — русские по умолчанию, а если `reasoningRunning` своя (словарь на другом языке) — она одна.
218
+ */
219
+ thinkingPhrases?: readonly string[];
220
+ /** Время ожидания ответа рядом с фразой: «12 с», «1 мин 5 с». Нет, а `reasoningRunning` своя — «0:12», «1:05». */
221
+ thinkingElapsed?: (seconds: number) => string;
222
+ toolRunning: (toolName: string) => string;
223
+ toolDone: (toolName: string) => string;
224
+ toolError: (toolName: string) => string;
225
+ /** Подпись картинки со снимком страницы для экранного диктора. */
226
+ screenshotAlt: string;
227
+ /** Снимок страницы не загрузился: вместо картинки этот текст и ссылка на страницу. */
228
+ screenshotUnavailable: string;
229
+ answerStopped: string;
230
+ answerInterrupted: string;
231
+ answerEmpty: string;
232
+ /** Подпись ссылки вместо картинки с чужого адреса, если у картинки нет своей подписи. Нет — русская по умолчанию. */
233
+ externalImageLink?: string;
234
+ /** Отметка у ответа, который модель не дописала: упёрлась в предел длины ответа. Нет — русская по умолчанию. */
235
+ answerCutByLength?: string;
236
+ /** Отметка у ответа агента, который исправил человек (версия 15). Нет — русская по умолчанию. */
237
+ answerEdited?: string;
238
+ /** Серая отметка у ответа, который не дошёл до человека (версия 24). Нет — русская по умолчанию. */
239
+ answerUndelivered?: string;
240
+ /** Отметка у вызова инструмента, чей результат исправил человек (версия 15). Нет — русская по умолчанию. */
241
+ toolOutputEdited?: string;
242
+ /** Кнопка «изменить» у ответа агента (версия 15). Нет — русская по умолчанию. */
243
+ editAnswer?: string;
244
+ /** Пометка у поправки, которую агент ещё не взял (версия 21): «учтёт на следующем шаге». Нет — русская по умолчанию. */
245
+ steeringPending?: string;
246
+ retry: string;
247
+ /** Идут попытки подключиться к серверу. */
248
+ reconnecting: string;
249
+ /** Попытки исчерпаны: сервер недоступен. */
250
+ connectionLost: string;
251
+ /** Чат чужой или его нет: сервер не различает эти случаи. */
252
+ chatNotFound: string;
253
+ errors: Record<ErrorNoticeKind, string>;
254
+ /** Названия уровней рассуждений в меню выбора; названия моделей и провайдеров приходят с сервера. */
255
+ reasoningLevels: Record<ReasoningLevelId, string>;
256
+ /** Разделитель на границе сжатой истории. */
257
+ historyCompacted: string;
258
+ /** Пояснение под разделителем, когда открыта сводка. */
259
+ historyCompactedHint: string;
260
+ /** Где сейчас переключатель веток, для экранного диктора: «Вариант 2 из 3». */
261
+ branchPosition: (position: number, count: number) => string;
262
+ previousBranch: string;
263
+ nextBranch: string;
264
+ /** Кнопка у последнего ответа: новый ответ на тот же вопрос. */
265
+ regenerate: string;
266
+ /** Кнопка у отправленного сообщения и подпись поля правки. */
267
+ editMessage: string;
268
+ /** Отправить исправленное сообщение. */
269
+ saveEdit: string;
270
+ cancelEdit: string;
271
+ /** Под полем правки, когда правку не удалось отправить; текст в поле остаётся. */
272
+ editErrors: Record<EditErrorKind, string>;
273
+ /** Под полем правки, когда сервер отказал по лимиту сообщений (у денег — `editErrors.spendingLimit`). */
274
+ editMessageLimit?: string;
275
+ /** Не удалось сохранить выбор модели. */
276
+ modelChoiceFailed: string;
277
+ /** Не удалось получить список моделей. */
278
+ modelMenuFailed: string;
279
+ /** Кнопка микрофона в покое. */
280
+ voiceStart: string;
281
+ /** Кнопка микрофона, пока идёт запись. */
282
+ voiceStop: string;
283
+ /** Кнопка микрофона, пока готовится запись: нажатие отменяет. */
284
+ voiceConnecting: string;
285
+ /** Кнопка микрофона, пока сервер причёсывает надиктованный текст (убирает «э-э», расставляет знаки). */
286
+ voicePolishing: string;
287
+ voiceErrors: VoiceErrorLabels;
288
+ voiceDialog: VoiceDialogLabels;
289
+ /** Заголовок карточки: что агент хочет сделать (`action` — название действия). */
290
+ approvalRequested: (action: string) => string;
291
+ /** Пока человек не решил. */
292
+ approvalWaiting: string;
293
+ approvalAllow: string;
294
+ approvalDeny: string;
295
+ approvalAlways: string;
296
+ /** Ответ не дошёл до сервера. */
297
+ approvalFailed: string;
298
+ /** Ответ не принят: лимит расходов исчерпан. */
299
+ approvalSpendingLimit: string;
300
+ /** Ответ не принят: в чате идёт другой ход. */
301
+ approvalBusy: string;
302
+ /** Ответ не принят: у человека уже идут ответы в других чатах. */
303
+ approvalTooManyTurns: string;
304
+ approvalAllowedMark: string;
305
+ approvalAlwaysMark: string;
306
+ approvalDeniedMark: string;
307
+ /** Для экранного диктора, когда ход остановился на запросе. */
308
+ approvalAnnouncement: string;
309
+ /** Расход подошёл к лимиту, но чат ещё работает: «Использовано 80% лимита на месяц». */
310
+ spendingWarning: (info: SpendingInfo) => string;
311
+ /** Лимит исчерпан, новые сообщения не отправляются: «Лимит на месяц исчерпан, обновится 1 ноября». */
312
+ spendingExhausted: (info: SpendingInfo) => string;
313
+ /** Окно сообщений подошло к лимиту (`unit: "messages"`): «Осталось 2 сообщения». */
314
+ spendingMessagesLeft?: (remaining: number, info: SpendingInfo) => string;
315
+ /** Окно сообщений исчерпано: «Лимит сообщений исчерпан, обновится 8 октября». */
316
+ spendingMessagesExhausted?: (info: SpendingInfo) => string;
317
+ /** Заголовок списка чатов и кнопка «Чаты» на узком экране. */
318
+ chatListHeading: string;
319
+ chatListNewChat: string;
320
+ /** Название чата, в котором ещё ничего не писали. */
321
+ chatListUntitled: string;
322
+ /** Пометка чата, начатого в мессенджере: «Telegram», «ВКонтакте», «MAX». */
323
+ chatListOrigin: Record<ChatOriginView, string>;
324
+ /** Пометка закрытого чата в списке (причину скин берёт из `closed.message`). */
325
+ chatListClosed: string;
326
+ chatListLoading: string;
327
+ chatListLoadFailed: string;
328
+ chatListCreateFailed: string;
329
+ chatListRenameFailed: string;
330
+ chatListDeleteFailed: string;
331
+ /** Кнопка меню строки: «Действия с чатом …». */
332
+ chatListRowMenu: (title: string) => string;
333
+ chatListRename: string;
334
+ chatListRenameField: string;
335
+ chatListDelete: string;
336
+ chatListDeleteTitle: string;
337
+ chatListDeleteBody: (title: string) => string;
338
+ chatListDeleteConfirm: string;
339
+ chatListDeleteCancel: string;
340
+ /** Экран памяти агента: заголовок и счётчик «Записей: 12 из 200». */
341
+ memoryHeading: string;
342
+ memoryCount: (total: number, limit: number) => string;
343
+ /** Подсказка, когда в запрос агента попадают не все записи: остальное он находит поиском. */
344
+ memoryShownHint: (shown: number, total: number) => string;
345
+ memoryAdd: string;
346
+ memoryClearAll: string;
347
+ memoryLoading: string;
348
+ memoryEmpty: string;
349
+ /** Сервер ответил 404: память в этом приложении не включена. */
350
+ memoryUnavailable: string;
351
+ memoryLoadFailed: string;
352
+ memoryEdit: string;
353
+ memoryDelete: string;
354
+ /** Подписи кнопок записи для экранного диктора: «Изменить запись «Любит чай»». */
355
+ memoryEditNote: (content: string) => string;
356
+ memoryDeleteNote: (content: string) => string;
357
+ /** Заголовок группы записей для экранного диктора: «Работа, записей: 3». */
358
+ memoryGroupLabel: (name: string, count: number) => string;
359
+ memoryNewNoteTitle: string;
360
+ memoryEditNoteTitle: string;
361
+ memoryPathField: string;
362
+ memoryPathHint: string;
363
+ memoryContentField: string;
364
+ memorySave: string;
365
+ memoryCancel: string;
366
+ /** Ошибки полей: проверка до отправки. */
367
+ memoryFieldErrors: {
368
+ pathRequired: string;
369
+ pathTooMany: string;
370
+ pathTooLong: string;
371
+ contentRequired: string;
372
+ contentTooLong: string;
373
+ };
374
+ /** Почему действие с памятью не удалось. */
375
+ memoryErrors: Record<MemoryFailure, string>;
376
+ memoryDeleteTitle: string;
377
+ memoryDeleteBody: (content: string) => string;
378
+ memoryClearTitle: string;
379
+ memoryClearBody: (total: number) => string;
380
+ memoryConfirmDelete: string;
381
+ memoryConfirmClear: string;
382
+ memoryConfirmCancel: string;
383
+ /** Блок «Объединено»: агент склеил повторы; «было» — скрытые оригиналы, «стало» — запись в списке. */
384
+ memoryMergesHeading: string;
385
+ /** Когда слияние сделано: «30 сентября в 12:05» (по местному времени). */
386
+ memoryMergeDate: (finishedAt: Date) => string;
387
+ memoryMergeBefore: string;
388
+ memoryMergeAfter: string;
389
+ memoryMergeRevert: string;
390
+ /** Имя кнопки для экранного диктора: у каждого слияния своя, «Вернуть как было (30 сентября в 12:05)». */
391
+ memoryMergeRevertFor: (when: string) => string;
392
+ /** Вместо кнопки, когда результат склейки с тех пор менялся. */
393
+ memoryMergeNotRevertible: string;
394
+ /** Когда «Вернуть как было» отклонено: памяти не хватит места или запись, что вернулась бы, уже добавлена заново. */
395
+ memoryRevertErrors: Record<"limit_reached" | "duplicate", string>;
396
+ /** Панель агента (договор скина версии 12): кнопка в углу страницы, подписи панели и списка чатов над чатом. */
397
+ agentPanelLauncher: string;
398
+ agentPanelOpen: string;
399
+ agentPanelClose: string;
400
+ agentPanelLabel: string;
401
+ agentPanelChats: string;
402
+ agentPanelBackToChat: string;
403
+ /** Значок на кнопке, пока идёт ответ. */
404
+ agentPanelBusy: string;
405
+ /** Ответ модели, когда браузерного инструмента нет на этой странице (функции нет у `AgentPanelProvider`). */
406
+ agentPanelToolUnavailable: string;
407
+ widgets?: Partial<WidgetLabels>;
408
+ diagram?: Partial<DiagramLabels>;
409
+ demo?: Partial<LiveDemoLabels>;
410
+ images?: Partial<ImageLabels>;
411
+ videos?: Partial<VideoLabels>;
412
+ viewer?: Partial<ViewerLabels>;
413
+ voice?: Partial<VoiceSpeechLabels>;
414
+ helpers?: Partial<HelperLabels>;
415
+ tasks?: Partial<TaskLabels>;
416
+ notices?: Partial<NoticeLabels>;
417
+ messengerStatus?: Partial<MessengerStatusLabels>;
418
+ workView?: Partial<WorkViewLabels>;
419
+ }
420
+ /** Словарь, в котором есть и необязательные надписи: их подставляет `ChatLabelsProvider`. */
421
+ export type ResolvedChatLabels = Omit<ChatLabels, "widgets" | "diagram" | "demo" | "images" | "videos" | "viewer" | "voice" | "helpers" | "tasks" | "notices" | "messengerStatus" | "workView"> & Required<Pick<ChatLabels, "externalImageLink" | "answerCutByLength" | "answerEdited" | "answerUndelivered" | "toolOutputEdited" | "editAnswer" | "steeringPending" | "thinkingPhrases" | "thinkingElapsed" | "spendingMessagesLeft" | "spendingMessagesExhausted" | "editMessageLimit">> & {
422
+ widgets: WidgetLabels;
423
+ diagram: DiagramLabels;
424
+ demo: LiveDemoLabels;
425
+ images: ImageLabels;
426
+ videos: VideoLabels;
427
+ viewer: ViewerLabels;
428
+ voice: VoiceSpeechLabels;
429
+ helpers: HelperLabels;
430
+ tasks: TaskLabels;
431
+ notices: NoticeLabels;
432
+ messengerStatus: MessengerStatusLabels;
433
+ workView: WorkViewLabels;
434
+ };
435
+ /**
436
+ * Подписи ошибок голоса. `time_limit` — строка или функция от предела записи, названного сервером (секунды).
437
+ * `limit`, `forbidden`, `too_long` можно не задавать: возьмутся подписи по умолчанию на языке словаря (`locale`).
438
+ */
439
+ export type VoiceErrorLabels = Record<Exclude<VoiceErrorKind, "time_limit" | "limit" | "forbidden" | "too_long">, string> & {
440
+ time_limit: string | ((maxSessionSeconds: number) => string);
441
+ limit?: string;
442
+ forbidden?: string;
443
+ too_long?: string;
444
+ };
445
+ /** Подпись ошибки голоса для человека. */
446
+ export declare function voiceErrorText(errors: VoiceErrorLabels, kind: VoiceErrorKind, details?: VoiceErrorDetails): string;
447
+ /** Английские надписи простого вида работы агента (версия 23); входят в `englishLabels`. */
448
+ export declare const englishWorkViewLabels: WorkViewLabels;
449
+ /** Английские надписи версий 18 и 21 для приложений, которые подключают их через `ChatLabels`. */
450
+ export declare const englishWorkLabels: Pick<ResolvedChatLabels, "helpers" | "tasks" | "notices" | "messengerStatus" | "steeringPending">;
451
+ export declare const russianLabels: ResolvedChatLabels;
452
+ /** Полный английский словарь чата: `<ChatLabelsProvider labels={englishLabels}>`. Свои поправки — поверх него. */
453
+ export declare const englishLabels: ResolvedChatLabels;
454
+ /**
455
+ * Тексты закрытых «Стопом» вызовов: те же, что записывает сервер (core: `HANGING_TOOL_CALL_REASON`, `INTERRUPTED_REASON`,
456
+ * `RESULT_UNKNOWN_REASON`).
457
+ * Не надписи для человека, а часть ответа; лежат здесь, потому что надписи в коде вне словаря запрещены.
458
+ */
459
+ export declare const stoppedToolCallReasons: {
460
+ readonly hanging: "Вызов инструмента оборвался до результата: действие могло выполниться частично или целиком. Не повторяй его, не проверив, что уже сделано";
461
+ readonly interrupted: "Ход прерван раньше, чем пользователь ответил на запрос. Действие не выполнялось.";
462
+ readonly resultUnknown: "Пользователь разрешил действие, но ход прервался до результата. Неизвестно, выполнено оно или нет; не повторяй его, не проверив.";
463
+ };
464
+ export declare function ChatLabelsProvider({ labels, children }: {
465
+ labels: ChatLabels;
466
+ children: ReactNode;
467
+ }): import("react").JSX.Element;
468
+ export declare function useChatLabels(): ResolvedChatLabels;
@@ -0,0 +1,25 @@
1
+ /** Кусок текста ответа: обычная разметка, схема ```mermaid или живая демонстрация ```html-demo. */
2
+ export type AnswerSegment = {
3
+ kind: "markdown";
4
+ markdown: string;
5
+ }
6
+ /** `source` — текст блока без ограждений; `closed` — блок закрыт; `markdown` — блок целиком, как в тексте. */
7
+ | {
8
+ kind: "mermaid" | "demo";
9
+ source: string;
10
+ closed: boolean;
11
+ markdown: string;
12
+ };
13
+ /** Какие блоки выделять: схемы (`diagrams`) и живые демонстрации (`demos`). Остальные остаются разметкой. */
14
+ export interface AnswerFenceKinds {
15
+ diagrams?: boolean;
16
+ demos?: boolean;
17
+ }
18
+ /** Язык блока живой демонстрации. */
19
+ export declare const LIVE_DEMO_LANGUAGE = "html-demo";
20
+ /**
21
+ * Делит Markdown на обычные куски и блоки ```mermaid и ```html-demo верхнего уровня (по правилам ограждений CommonMark):
22
+ * блок внутри другого блока кода и блок с отступом в четыре пробела — обычный код. Номер блока — его порядок среди
23
+ * кусков того же вида; им скин зовёт `renderDiagram`/`renderDemo`, и слой поведения считает так же.
24
+ */
25
+ export declare function splitAnswerFences(markdown: string, kinds: AnswerFenceKinds): AnswerSegment[];