@ykurilov/agent-chat-core 0.63.2 → 0.65.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 +12 -0
- package/README.md +2 -2
- package/dist/access.js +2 -2
- package/dist/{chunk-FBULM4V6.js → chunk-5UUWSY6V.js} +2 -2
- package/dist/{chunk-FOAIG4DY.js → chunk-CVRDB3NM.js} +1 -1
- package/dist/chunk-CVRDB3NM.js.map +1 -0
- package/dist/{chunk-4Y26SCCM.js → chunk-SA3DXJYB.js} +186 -16
- package/dist/chunk-SA3DXJYB.js.map +1 -0
- package/dist/index.js +3 -3
- package/dist/storage-contract.js +13 -2
- package/dist/storage-contract.js.map +1 -1
- package/dist/types/access/chat-capabilities.d.ts +16 -8
- package/dist/types/access/client-visibility.d.ts +2 -2
- package/dist/types/agent-run/run-agent-turn.d.ts +2 -4
- package/dist/types/app-state/state-messages.d.ts +10 -2
- package/dist/types/chat-service.d.ts +7 -0
- package/dist/types/conversation/types.d.ts +19 -6
- package/dist/types/index.d.ts +2 -1
- package/dist/types/provider-errors/provider-error-details.d.ts +18 -0
- package/dist/types/text/scrub-secrets.d.ts +3 -1
- package/dist/types/turn-hooks/turn-hooks.d.ts +3 -4
- package/package.json +1 -1
- package/dist/chunk-4Y26SCCM.js.map +0 -1
- package/dist/chunk-FOAIG4DY.js.map +0 -1
- /package/dist/{chunk-FBULM4V6.js.map → chunk-5UUWSY6V.js.map} +0 -0
|
@@ -7,18 +7,26 @@ import type { Chat } from "../conversation/types.js";
|
|
|
7
7
|
* `metadata: { showOnScreen: true }` и вызовы с запросом подтверждения видны всегда. Запрет `reasoning` и `toolDetails` прячет их из истории и потока, модель и
|
|
8
8
|
* хранилище получают всё. `steer` — поправка к идущему ответу (`POST …/steer`). `modelDetails` — модель, провайдер,
|
|
9
9
|
* уровень рассуждений, расход токенов, метаданные поставщика, владелец чата и текст сводок сжатия в истории и потоке;
|
|
10
|
-
* запрет выключает и `modelChoice`: выбирать невидимую модель нельзя.
|
|
10
|
+
* запрет выключает и `modelChoice`: выбирать невидимую модель нельзя. `errorDetails` — подробности сбоя провайдера
|
|
11
|
+
* (провайдер, модель, код, причина, когда снимут предел) в истории и потоке; единственное право, выключенное по
|
|
12
|
+
* умолчанию: подробности видны любому через инструменты разработчика, открывать их — только админу. При
|
|
13
|
+
* `modelDetails: false` выключено и оно. `appNotices` — служебные пометки приложения (`kind: "app"`: касание после
|
|
14
|
+
* молчания, срок шага сценария) на экране — без текста для модели, только те, у кого есть проекция для экрана
|
|
15
|
+
* (`appNoticeViews` службы), и только её данные; тоже выключено по умолчанию: клиент в боевом чате их не видит,
|
|
16
|
+
* включают в проверке и тестовом чате. При `modelDetails: false` выключено и оно.
|
|
11
17
|
*/
|
|
12
|
-
export type ChatCapability = "edit" | "regenerate" | "retry" | "branches" | "modelChoice" | "answerEditing" | "chatList" | "compact" | "attachments" | "voice" | "reasoning" | "toolDetails" | "steer" | "modelDetails";
|
|
18
|
+
export type ChatCapability = "edit" | "regenerate" | "retry" | "branches" | "modelChoice" | "answerEditing" | "chatList" | "compact" | "attachments" | "voice" | "reasoning" | "toolDetails" | "steer" | "modelDetails" | "errorDetails" | "appNotices";
|
|
13
19
|
/**
|
|
14
|
-
* Права, как их отдаёт `resolveChatCapabilities`. `modelDetails`
|
|
15
|
-
* собранный до
|
|
20
|
+
* Права, как их отдаёт `resolveChatCapabilities`. `modelDetails` (нет — `true`), `errorDetails` и `appNotices` (нет — `false`) в типе
|
|
21
|
+
* необязательны: свой литерал прав, собранный до этих прав, остаётся верным. Ядро и история заполняют их всегда.
|
|
16
22
|
*/
|
|
17
|
-
export type ChatCapabilities = Record<Exclude<ChatCapability, "modelDetails">, boolean> & {
|
|
23
|
+
export type ChatCapabilities = Record<Exclude<ChatCapability, "modelDetails" | "errorDetails" | "appNotices">, boolean> & {
|
|
18
24
|
modelDetails?: boolean;
|
|
25
|
+
errorDetails?: boolean;
|
|
26
|
+
appNotices?: boolean;
|
|
19
27
|
};
|
|
20
28
|
/**
|
|
21
|
-
* Права в чате от приложения: частичный список, пропущенное — `true
|
|
29
|
+
* Права в чате от приложения: частичный список, пропущенное — `true` (`errorDetails` и `appNotices` — `false`). Тот же вход, что у `beforeTurn` (чат с данными
|
|
22
30
|
* объекта). Не булево значение, неизвестное право или исключение — ошибка приложения.
|
|
23
31
|
*/
|
|
24
32
|
export type ChatCapabilitiesHandler = (input: {
|
|
@@ -27,8 +35,8 @@ export type ChatCapabilitiesHandler = (input: {
|
|
|
27
35
|
}) => Partial<ChatCapabilities> | void | Promise<Partial<ChatCapabilities> | void>;
|
|
28
36
|
export declare const CHAT_CAPABILITIES: readonly ChatCapability[];
|
|
29
37
|
/**
|
|
30
|
-
* Все
|
|
31
|
-
* или неизвестное право — `TypeError`.
|
|
38
|
+
* Все права, кроме `errorDetails` и `appNotices`, разрешены и дополнены ответом приложения; `modelDetails: false` выключает и
|
|
39
|
+
* `modelChoice`, `errorDetails` и `appNotices`. Не булево значение или неизвестное право — `TypeError`.
|
|
32
40
|
*/
|
|
33
41
|
export declare function resolveChatCapabilities(given: Partial<ChatCapabilities> | void | null): Required<ChatCapabilities>;
|
|
34
42
|
/** Действие запрещено правами чата: сервер отвечает 403 `action_forbidden`. */
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { UIMessageChunk } from "ai";
|
|
2
2
|
import type { ChatCapabilities } from "./chat-capabilities.js";
|
|
3
3
|
/**
|
|
4
|
-
* Что из ответа видит браузер по правам `reasoning`, `toolDetails` и `
|
|
4
|
+
* Что из ответа видит браузер по правам `reasoning`, `toolDetails`, `modelDetails` и `errorDetails`. Хранилище, модель и хуки получают
|
|
5
5
|
* ответ целиком: видимость — только на выходе к клиенту (история, поток, повтор кусков после переподключения).
|
|
6
6
|
*/
|
|
7
7
|
export interface ClientVisibility {
|
|
@@ -38,4 +38,4 @@ export declare const SHOW_ON_SCREEN_KEY = "showOnScreen";
|
|
|
38
38
|
* Видимость для прав зрителя. При `toolDetails: false` видны вызовы с пометкой `showOnScreen`, инструменты SDK, которым
|
|
39
39
|
* нужен экран (`sdkScreenTool`: виджеты, браузерные), и вызовы, спросившие подтверждения.
|
|
40
40
|
*/
|
|
41
|
-
export declare function clientVisibilityOf(capabilities: Pick<ChatCapabilities, "reasoning" | "toolDetails" | "modelDetails">, sdkScreenTool: (toolName: string) => boolean): ClientVisibility;
|
|
41
|
+
export declare function clientVisibilityOf(capabilities: Pick<ChatCapabilities, "reasoning" | "toolDetails" | "modelDetails" | "errorDetails">, sdkScreenTool: (toolName: string) => boolean): ClientVisibility;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ToolSet, UIMessageChunk } from "ai";
|
|
2
2
|
import type { MessageAttachments } from "../attachments/message-attachments.js";
|
|
3
3
|
import type { AgentAudience, AgentChannel, ChatSubject, GroupTurn, UsageSource } from "../conversation/types.js";
|
|
4
|
-
import type { AgentChatMessage,
|
|
4
|
+
import type { AgentChatMessage, ChatError, FinalAnswerStatus, TokenUsage } from "../conversation/types.js";
|
|
5
5
|
import type { AgentHelper } from "../helpers/helper-types.js";
|
|
6
6
|
import type { DataChange, ScreenPlace } from "../page-context/page-context.js";
|
|
7
7
|
import type { ModelCatalog, ModelProfile } from "../models/model-catalog.js";
|
|
@@ -261,9 +261,7 @@ export interface AgentTurnInput {
|
|
|
261
261
|
status: FinalAnswerStatus;
|
|
262
262
|
parts: AgentChatMessage["parts"];
|
|
263
263
|
usage: TokenUsage | null;
|
|
264
|
-
error:
|
|
265
|
-
kind: ChatErrorKind;
|
|
266
|
-
} | null;
|
|
264
|
+
error: ChatError | null;
|
|
267
265
|
providerId: string;
|
|
268
266
|
}, stopWaiting: AbortSignal) => Promise<AppEvent[]>;
|
|
269
267
|
/** Итог ответа записан в хранилище, до расхода и `afterTurn`: для срока хода, который не должен обрывать хук. */
|
|
@@ -38,7 +38,8 @@ export declare function publicAppStateParts<P extends {
|
|
|
38
38
|
}>(parts: readonly P[], hidden?: HiddenStateKey): P[];
|
|
39
39
|
/**
|
|
40
40
|
* Сообщения для браузера: части без служебных ключей, без застывших блоков контекста, отметки `endTurn` и служебных
|
|
41
|
-
* сообщений вида `app` (они только для
|
|
41
|
+
* сообщений вида `app` (они только для модели; с `appNoticeViews` — остаются те, у кого есть проекция для экрана: без
|
|
42
|
+
* текста для модели, `data` — проекция);
|
|
42
43
|
* сообщение человека, у которого не осталось частей, не уходит. Служебное сообщение состояния (`isStateMessage`) перед
|
|
43
44
|
* обычным не показывается: его открытые записи едут в начале этого сообщения, и экран сворачивает то же состояние.
|
|
44
45
|
*/
|
|
@@ -47,9 +48,16 @@ export declare function publicMessages<M extends {
|
|
|
47
48
|
parts: ReadonlyArray<{
|
|
48
49
|
type: string;
|
|
49
50
|
}>;
|
|
50
|
-
}>(messages: readonly M[], hidden?: HiddenStateKey
|
|
51
|
+
}>(messages: readonly M[], hidden?: HiddenStateKey, options?: {
|
|
52
|
+
appNoticeViews?: AppNoticeViews;
|
|
53
|
+
}): M[];
|
|
51
54
|
/** Кусок потока для браузера: запись состояния без скрытых ключей; ничего не осталось — `undefined`. */
|
|
52
55
|
export declare function publicStateChunk(chunk: UIMessageChunk, hidden?: HiddenStateKey): UIMessageChunk | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* Проекции пометок приложения для экрана (`appNoticeViews` службы): имя пометки → безопасные для браузера данные из
|
|
58
|
+
* `data`. Нет проекции, она вернула `undefined` или упала — пометка в браузер не уходит.
|
|
59
|
+
*/
|
|
60
|
+
export type AppNoticeViews = Readonly<Record<string, (data: unknown) => unknown>>;
|
|
53
61
|
/** Части только для модели: застывшие блоки контекста и отметка конца хода инструментом без слов. */
|
|
54
62
|
export declare function isModelOnlyPart(part: {
|
|
55
63
|
type: string;
|
|
@@ -27,6 +27,7 @@ import type { CompactionSettings } from "./compaction/compaction-settings.js";
|
|
|
27
27
|
import type { ChatGreeting, ImportChatInput, OpenSubjectChatInput, OpenSubjectChatResult } from "./subject-chats/subject-chats.js";
|
|
28
28
|
import type { AppStateValues } from "./app-state/app-state.js";
|
|
29
29
|
import type { StateChangedHandler } from "./app-state/state-changed.js";
|
|
30
|
+
import type { AppNoticeViews } from "./app-state/state-messages.js";
|
|
30
31
|
import type { BranchFork } from "./conversation/branches.js";
|
|
31
32
|
import type { AnswerEdit } from "./conversation/answer-edit.js";
|
|
32
33
|
import type { ReplyChecksSetting } from "./agent-run/reply-check-types.js";
|
|
@@ -454,6 +455,12 @@ export interface ChatServiceOptions {
|
|
|
454
455
|
* @throws TypeError (при создании службы) неверное имя.
|
|
455
456
|
*/
|
|
456
457
|
privateStateKeys?: readonly string[];
|
|
458
|
+
/**
|
|
459
|
+
* Проекции пометок приложения (`kind: "app"`) для экрана при праве `appNotices`: имя пометки → безопасные данные
|
|
460
|
+
* (`(data) => ({ silentMs })`). Пометка без проекции в браузер не уходит, даже с правом. Сценарии (`flow.withChat`)
|
|
461
|
+
* добавляют свои сами.
|
|
462
|
+
*/
|
|
463
|
+
appNoticeViews?: AppNoticeViews;
|
|
457
464
|
}
|
|
458
465
|
/** Ход, для которого берётся инструкция чата; у сжатия его нет. */
|
|
459
466
|
export interface ChatInstructionsTurn {
|
|
@@ -6,6 +6,23 @@ export declare const CURRENT_FORMAT_VERSION = 1;
|
|
|
6
6
|
export type AnswerStatus = "streaming" | "complete" | "stopped" | "error" | "interrupted" | "awaiting_approval";
|
|
7
7
|
export type FinalAnswerStatus = Exclude<AnswerStatus, "streaming">;
|
|
8
8
|
export type ChatErrorKind = "overloaded" | "rate_limited" | "insufficient_funds" | "invalid_key" | "context_overflow" | "other";
|
|
9
|
+
/**
|
|
10
|
+
* Подробности сбоя провайдера для того, кому приложение их открыло (право `errorDetails`): кто не ответил и почему.
|
|
11
|
+
* `reason` — одна строка до 300 знаков из сообщения провайдера, секреты и параметры адресов вычищены. `resetsAt` — когда
|
|
12
|
+
* провайдер обещал снять предел (ISO), если сообщил.
|
|
13
|
+
*/
|
|
14
|
+
export interface ChatErrorDetails {
|
|
15
|
+
providerId: string;
|
|
16
|
+
modelId: string;
|
|
17
|
+
statusCode?: number;
|
|
18
|
+
reason?: string;
|
|
19
|
+
resetsAt?: string;
|
|
20
|
+
}
|
|
21
|
+
/** Сбой ответа: вид для подписи и, если есть, подробности (хранятся всегда, в браузер — по праву `errorDetails`). */
|
|
22
|
+
export interface ChatError {
|
|
23
|
+
kind: ChatErrorKind;
|
|
24
|
+
details?: ChatErrorDetails;
|
|
25
|
+
}
|
|
9
26
|
export interface TokenUsage {
|
|
10
27
|
inputTokens: number;
|
|
11
28
|
cachedInputTokens: number;
|
|
@@ -97,9 +114,7 @@ export interface ChatMessageMetadata {
|
|
|
97
114
|
usage?: TokenUsage;
|
|
98
115
|
reasoningDurationsMs?: Record<string, number>;
|
|
99
116
|
status?: AnswerStatus;
|
|
100
|
-
error?:
|
|
101
|
-
kind: ChatErrorKind;
|
|
102
|
-
};
|
|
117
|
+
error?: ChatError;
|
|
103
118
|
/** Есть, если озвучку ответа оборвало перебивание. */
|
|
104
119
|
voiceCut?: VoiceCut;
|
|
105
120
|
/** Ответ не дошёл до человека (`markUndelivered`): модель его не видит, экран подписывает «не доставлено». */
|
|
@@ -118,9 +133,7 @@ export interface StoredMessage {
|
|
|
118
133
|
providerId: string | null;
|
|
119
134
|
usage: TokenUsage | null;
|
|
120
135
|
reasoningDurationsMs: Record<string, number>;
|
|
121
|
-
error:
|
|
122
|
-
kind: ChatErrorKind;
|
|
123
|
-
} | null;
|
|
136
|
+
error: ChatError | null;
|
|
124
137
|
/**
|
|
125
138
|
* Отметка обрыва озвучки. Необязательное поле: старые данные и хранилища без голосового режима его не знают;
|
|
126
139
|
* встроенные хранилища читают отсутствие как `null`.
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { BUILT_IN_USAGE_SOURCES, CURRENT_FORMAT_VERSION } from "./conversation/types.js";
|
|
2
|
-
export type { AfterTurnState, AgentAudience, AgentChannel, AgentChatMessage, AnswerAliveMark, AnswerStatus, Chat, ChatErrorKind, ChatMessageMetadata, ChatSubject, ExternalChannel, FinalAnswerStatus, GroupTurn, PendingStepUsage, StoredBranchSelection, StoredCompaction, StoredMessage, TokenUsage, UsageByChatFilter, UsageChatSum, UsageFilter, UsageRecord, UsageSource, BuiltInUsageSource, UsageSum, VoiceCut, } from "./conversation/types.js";
|
|
2
|
+
export type { AfterTurnState, AgentAudience, AgentChannel, AgentChatMessage, AnswerAliveMark, AnswerStatus, Chat, ChatError, ChatErrorDetails, ChatErrorKind, ChatMessageMetadata, ChatSubject, ExternalChannel, FinalAnswerStatus, GroupTurn, PendingStepUsage, StoredBranchSelection, StoredCompaction, StoredMessage, TokenUsage, UsageByChatFilter, UsageChatSum, UsageFilter, UsageRecord, UsageSource, BuiltInUsageSource, UsageSum, VoiceCut, } from "./conversation/types.js";
|
|
3
3
|
export type { AgentHelper, HelperPendingApproval, HelperProgress, HelperStep, HelperStepReport, RunHelper, RunHelperInput, RunHelperResult, } from "./helpers/helper-types.js";
|
|
4
4
|
export { runHelper } from "./helpers/run-helper.js";
|
|
5
5
|
export { AGENT_NOTICE_PART_TYPE } from "./notices/agent-notice.js";
|
|
@@ -60,6 +60,7 @@ export { accessRefusedResponse, allowedUser } from "./access/resolved-user.js";
|
|
|
60
60
|
export type { AccessRefusal, ResolvedUser } from "./access/resolved-user.js";
|
|
61
61
|
export { ActionForbiddenError, CHAT_CAPABILITIES, resolveChatCapabilities } from "./access/chat-capabilities.js";
|
|
62
62
|
export type { ChatCapabilities, ChatCapabilitiesHandler, ChatCapability } from "./access/chat-capabilities.js";
|
|
63
|
+
export type { AppNoticeViews } from "./app-state/state-messages.js";
|
|
63
64
|
export { CHAT_CLOSED_PART_TYPE, ChatClosedError, normalizeChatClosure } from "./access/chat-closure.js";
|
|
64
65
|
export type { ChatClosure } from "./access/chat-closure.js";
|
|
65
66
|
export { ChatCreationRefusedError } from "./access/chat-creation.js";
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ChatErrorDetails } from "../conversation/types.js";
|
|
2
|
+
import type { ModelCatalog } from "../models/model-catalog.js";
|
|
3
|
+
export interface ProviderErrorDetailsContext {
|
|
4
|
+
providerId: string;
|
|
5
|
+
modelId: string;
|
|
6
|
+
/** Окружение сервера: значения ключей провайдеров вычищаются из причины. */
|
|
7
|
+
env: Record<string, string | undefined>;
|
|
8
|
+
catalog: ModelCatalog;
|
|
9
|
+
/** Часы хода, мс: «через N секунд» и проверка, что дата обнуления в будущем. По умолчанию — сейчас. */
|
|
10
|
+
now?: () => number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Подробности сбоя для админа: провайдер, модель, код, причина одной строкой (сообщение провайдера из тела ответа, без
|
|
14
|
+
* секретов и параметров адресов) и когда провайдер снимет предел — из метаданных (`limit_reset`, `resets_at`) или
|
|
15
|
+
* текста сообщения о пределе («Key limit exceeded … resets 2026-11-01»). Дата принимается только в будущем и не дальше
|
|
16
|
+
* двух лет; время без пояса — UTC.
|
|
17
|
+
*/
|
|
18
|
+
export declare function providerErrorDetails(error: unknown, context: ProviderErrorDetailsContext): ChatErrorDetails;
|
|
@@ -4,7 +4,9 @@ export declare const MIN_SECRET_LENGTH = 8;
|
|
|
4
4
|
/**
|
|
5
5
|
* Вычищает секреты из текста, который уходит человеку, в базу, в журнал или модели: известные значения
|
|
6
6
|
* (`knownSecrets`, например ключи провайдеров из окружения), пароль в адресе `схема://логин:пароль@`,
|
|
7
|
-
* заголовок `Authorization`,
|
|
7
|
+
* заголовок `Authorization`, `Bearer …` в любом регистре, `key=…`, поля вроде `password=…`, `password: …` и `"token": "…"`,
|
|
8
|
+
* слово ключа через пробел перед похожим на секрет значением (`token abc123def456`), узнаваемые ключи сервисов и их
|
|
9
|
+
* маски со звёздочками.
|
|
8
10
|
*/
|
|
9
11
|
export declare function scrubSecrets(text: string, knownSecrets?: Iterable<string | undefined>): string;
|
|
10
12
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AgentChannel, Chat,
|
|
1
|
+
import type { AgentChannel, Chat, ChatError, ChatSubject, FinalAnswerStatus, StoredMessage, TokenUsage } from "../conversation/types.js";
|
|
2
2
|
/** Что человек делает с чатом, когда приложение решает, пускать ли ход. */
|
|
3
3
|
export type TurnAction = "send" | "edit" | "retry" | "regenerate" | "approval" | "widget" | "notice";
|
|
4
4
|
/** Отказ приложения в ходе: код для программы, текст для человека. */
|
|
@@ -130,9 +130,8 @@ export interface TurnResult {
|
|
|
130
130
|
usage: TokenUsage | null;
|
|
131
131
|
/** Цена хода в долларах; `null` — у модели нет цены. */
|
|
132
132
|
costUsd: number | null;
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
};
|
|
133
|
+
/** Вид сбоя и подробности провайдера (`details`): хук на сервере получает их всегда. */
|
|
134
|
+
error?: ChatError;
|
|
136
135
|
/**
|
|
137
136
|
* Каким действием начат ход (см. `TurnAction`). `null` — итог доделан после перезапуска (`recovered`), а ядро не
|
|
138
137
|
* помнит действие; ход по служебному сообщению и тогда — `notice`.
|