@ykurilov/agent-chat-core 0.63.2 → 0.64.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 +6 -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-EWEEYX6U.js} +149 -12
- package/dist/chunk-EWEEYX6U.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 +12 -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/conversation/types.d.ts +19 -6
- package/dist/types/index.d.ts +1 -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,22 @@ 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` выключено и оно.
|
|
11
14
|
*/
|
|
12
|
-
export type ChatCapability = "edit" | "regenerate" | "retry" | "branches" | "modelChoice" | "answerEditing" | "chatList" | "compact" | "attachments" | "voice" | "reasoning" | "toolDetails" | "steer" | "modelDetails";
|
|
15
|
+
export type ChatCapability = "edit" | "regenerate" | "retry" | "branches" | "modelChoice" | "answerEditing" | "chatList" | "compact" | "attachments" | "voice" | "reasoning" | "toolDetails" | "steer" | "modelDetails" | "errorDetails";
|
|
13
16
|
/**
|
|
14
|
-
* Права, как их отдаёт `resolveChatCapabilities`. `modelDetails`
|
|
15
|
-
* собранный до
|
|
17
|
+
* Права, как их отдаёт `resolveChatCapabilities`. `modelDetails` (нет — `true`) и `errorDetails` (нет — `false`) в типе
|
|
18
|
+
* необязательны: свой литерал прав, собранный до этих прав, остаётся верным. Ядро и история заполняют их всегда.
|
|
16
19
|
*/
|
|
17
|
-
export type ChatCapabilities = Record<Exclude<ChatCapability, "modelDetails">, boolean> & {
|
|
20
|
+
export type ChatCapabilities = Record<Exclude<ChatCapability, "modelDetails" | "errorDetails">, boolean> & {
|
|
18
21
|
modelDetails?: boolean;
|
|
22
|
+
errorDetails?: boolean;
|
|
19
23
|
};
|
|
20
24
|
/**
|
|
21
|
-
* Права в чате от приложения: частичный список, пропущенное — `true
|
|
25
|
+
* Права в чате от приложения: частичный список, пропущенное — `true` (`errorDetails` — `false`). Тот же вход, что у `beforeTurn` (чат с данными
|
|
22
26
|
* объекта). Не булево значение, неизвестное право или исключение — ошибка приложения.
|
|
23
27
|
*/
|
|
24
28
|
export type ChatCapabilitiesHandler = (input: {
|
|
@@ -27,8 +31,8 @@ export type ChatCapabilitiesHandler = (input: {
|
|
|
27
31
|
}) => Partial<ChatCapabilities> | void | Promise<Partial<ChatCapabilities> | void>;
|
|
28
32
|
export declare const CHAT_CAPABILITIES: readonly ChatCapability[];
|
|
29
33
|
/**
|
|
30
|
-
* Все
|
|
31
|
-
* или неизвестное право — `TypeError`.
|
|
34
|
+
* Все права, кроме `errorDetails`, разрешены и дополнены ответом приложения; `modelDetails: false` выключает и
|
|
35
|
+
* `modelChoice`, и `errorDetails`. Не булево значение или неизвестное право — `TypeError`.
|
|
32
36
|
*/
|
|
33
37
|
export declare function resolveChatCapabilities(given: Partial<ChatCapabilities> | void | null): Required<ChatCapabilities>;
|
|
34
38
|
/** Действие запрещено правами чата: сервер отвечает 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`: для срока хода, который не должен обрывать хук. */
|
|
@@ -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";
|
|
@@ -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`.
|