@turingflow/agent-kit 0.0.0-stage → 0.1.1
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/README.md +592 -2
- package/dist/agent.d.ts +27 -0
- package/dist/agent.js +31 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.js +105 -0
- package/dist/handlers.d.ts +92 -0
- package/dist/handlers.js +211 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +10 -0
- package/dist/sdk.d.ts +106 -0
- package/dist/sdk.js +309 -0
- package/dist/server/agent.d.ts +27 -0
- package/dist/server/agent.js +31 -0
- package/dist/server/artifact-hooks.d.ts +6 -0
- package/dist/server/artifact-hooks.js +37 -0
- package/dist/server/artifact-tool-tracker.d.ts +24 -0
- package/dist/server/artifact-tool-tracker.js +347 -0
- package/dist/server/artifacts.d.ts +227 -0
- package/dist/server/artifacts.js +1061 -0
- package/dist/server/auth/config.d.ts +34 -0
- package/dist/server/auth/config.js +82 -0
- package/dist/server/auth/db.d.ts +159 -0
- package/dist/server/auth/db.js +680 -0
- package/dist/server/auth/handlers.d.ts +27 -0
- package/dist/server/auth/handlers.js +297 -0
- package/dist/server/auth/index.d.ts +15 -0
- package/dist/server/auth/index.js +14 -0
- package/dist/server/auth/login-options.d.ts +14 -0
- package/dist/server/auth/login-options.js +50 -0
- package/dist/server/auth/providers/dingtalk.d.ts +16 -0
- package/dist/server/auth/providers/dingtalk.js +177 -0
- package/dist/server/auth/providers/feishu.d.ts +15 -0
- package/dist/server/auth/providers/feishu.js +100 -0
- package/dist/server/auth/providers/index.d.ts +13 -0
- package/dist/server/auth/providers/index.js +24 -0
- package/dist/server/auth/session.d.ts +48 -0
- package/dist/server/auth/session.js +108 -0
- package/dist/server/auth/types.d.ts +118 -0
- package/dist/server/auth/types.js +7 -0
- package/dist/server/browser-agent-mcp.d.ts +67 -0
- package/dist/server/browser-agent-mcp.js +608 -0
- package/dist/server/cli.d.ts +6 -0
- package/dist/server/cli.js +112 -0
- package/dist/server/debug-log.d.ts +25 -0
- package/dist/server/debug-log.js +86 -0
- package/dist/server/handlers.d.ts +141 -0
- package/dist/server/handlers.js +523 -0
- package/dist/server/index.d.ts +30 -0
- package/dist/server/index.js +28 -0
- package/dist/server/kit-api.d.ts +23 -0
- package/dist/server/kit-api.js +153 -0
- package/dist/server/model-sources.d.ts +32 -0
- package/dist/server/model-sources.js +58 -0
- package/dist/server/oa.d.ts +87 -0
- package/dist/server/oa.js +397 -0
- package/dist/server/providers/openrouter.d.ts +51 -0
- package/dist/server/providers/openrouter.js +283 -0
- package/dist/server/render-markdown.d.ts +2 -0
- package/dist/server/render-markdown.js +50 -0
- package/dist/server/sdk.d.ts +269 -0
- package/dist/server/sdk.js +2025 -0
- package/dist/server/session-access.d.ts +5 -0
- package/dist/server/session-access.js +68 -0
- package/dist/server/session-fork.d.ts +10 -0
- package/dist/server/session-fork.js +142 -0
- package/dist/server/session-store.d.ts +56 -0
- package/dist/server/session-store.js +148 -0
- package/dist/server/sessions.d.ts +24 -0
- package/dist/server/sessions.js +541 -0
- package/dist/server/share.d.ts +15 -0
- package/dist/server/share.js +433 -0
- package/dist/server/tool-activity.d.ts +2 -0
- package/dist/server/tool-activity.js +26 -0
- package/dist/server/transcription/xiaomi-mimo.d.ts +8 -0
- package/dist/server/transcription/xiaomi-mimo.js +86 -0
- package/dist/server/upload.d.ts +13 -0
- package/dist/server/upload.js +81 -0
- package/dist/server/user-files.d.ts +28 -0
- package/dist/server/user-files.js +311 -0
- package/dist/server/voice.d.ts +25 -0
- package/dist/server/voice.js +61 -0
- package/dist/server/web-fetch.d.ts +71 -0
- package/dist/server/web-fetch.js +330 -0
- package/dist/styles.css +3354 -0
- package/dist/transcription/xiaomi-mimo.d.ts +8 -0
- package/dist/transcription/xiaomi-mimo.js +86 -0
- package/dist/ui/index.d.ts +358 -0
- package/dist/ui/index.js +7730 -0
- package/dist/upload.d.ts +13 -0
- package/dist/upload.js +81 -0
- package/dist/voice.d.ts +25 -0
- package/dist/voice.js +61 -0
- package/package.json +74 -4
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-kit · 小米 MiMo 语音识别 —— 复用 @summersmile/voice-dictation SDK 通道。
|
|
3
|
+
* 真正的识别与留痕/运营都在 BrandAgent 平台侧完成。
|
|
4
|
+
*
|
|
5
|
+
* 链路:本 provider 仅作为 SDK 的 VoiceTranscriber 通道,把音频经
|
|
6
|
+
* POST <AGENT_KIT_ASR_HOST>/api/external/asr/transcribe(multipart file)
|
|
7
|
+
* 递交到平台;平台负责 ffmpeg 归一化 + mimo 主源 + 兜底链 + 留痕。
|
|
8
|
+
* 令牌由 <AGENT_KIT_ASR_HOST>/api/external/asr/token 用长期 ASR_API_KEY 换取,
|
|
9
|
+
* 短时有效(默认 600s),401 时 SDK 会自动强刷重试。
|
|
10
|
+
*
|
|
11
|
+
* 环境变量(兼容旧名 BRANDAGENT_*):
|
|
12
|
+
* AGENT_KIT_ASR_HOST 平台地址,如 https://agent.aotsea.com
|
|
13
|
+
* AGENT_KIT_ASR_API_KEY 长期密钥
|
|
14
|
+
*/
|
|
15
|
+
import { createDictationTranscriber } from "@summersmile/voice-dictation";
|
|
16
|
+
const REQUEST_TIMEOUT_MS = 120_000;
|
|
17
|
+
const ASR_SOURCE = "asr_xiaomi_mimo";
|
|
18
|
+
function brandAgentHost() {
|
|
19
|
+
const v = process.env.AGENT_KIT_ASR_HOST?.trim() || process.env.BRANDAGENT_ASR_HOST?.trim();
|
|
20
|
+
const clean = v?.replace(/\/$/, "");
|
|
21
|
+
if (!clean)
|
|
22
|
+
throw new Error("未配置 AGENT_KIT_ASR_HOST / BRANDAGENT_ASR_HOST(ASR 平台地址)");
|
|
23
|
+
return clean;
|
|
24
|
+
}
|
|
25
|
+
function brandAgentApiKey() {
|
|
26
|
+
const v = process.env.AGENT_KIT_ASR_API_KEY?.trim() || process.env.BRANDAGENT_ASR_API_KEY?.trim();
|
|
27
|
+
if (!v)
|
|
28
|
+
throw new Error("未配置 AGENT_KIT_ASR_API_KEY / BRANDAGENT_ASR_API_KEY(ASR 长期密钥)");
|
|
29
|
+
return v;
|
|
30
|
+
}
|
|
31
|
+
// 短时令牌缓存:平台令牌默认 600s,留 30s 余量再刷新
|
|
32
|
+
let tokenCache = { token: null, expiresAt: 0 };
|
|
33
|
+
async function getPlatformToken({ forceRefresh } = {}) {
|
|
34
|
+
if (!forceRefresh && tokenCache.token && tokenCache.expiresAt > Date.now() + 30_000) {
|
|
35
|
+
return tokenCache.token;
|
|
36
|
+
}
|
|
37
|
+
const host = brandAgentHost();
|
|
38
|
+
const apiKey = brandAgentApiKey();
|
|
39
|
+
const res = await fetch(`${host}/api/external/asr/token`, {
|
|
40
|
+
method: "POST",
|
|
41
|
+
headers: {
|
|
42
|
+
Authorization: `Bearer ${apiKey}`,
|
|
43
|
+
"Content-Type": "application/json",
|
|
44
|
+
},
|
|
45
|
+
body: JSON.stringify({ ttlSeconds: 600 }),
|
|
46
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
47
|
+
});
|
|
48
|
+
if (!res.ok) {
|
|
49
|
+
throw new Error(`BrandAgent 转写令牌获取失败 (${res.status})`);
|
|
50
|
+
}
|
|
51
|
+
const j = (await res.json().catch(() => ({})));
|
|
52
|
+
if (!j?.token)
|
|
53
|
+
throw new Error("BrandAgent 转写令牌响应异常");
|
|
54
|
+
tokenCache = { token: j.token, expiresAt: j.expiresAt || Date.now() + 600_000 };
|
|
55
|
+
return j.token;
|
|
56
|
+
}
|
|
57
|
+
let _transcriber = null;
|
|
58
|
+
function getTranscriber() {
|
|
59
|
+
if (!_transcriber) {
|
|
60
|
+
_transcriber = createDictationTranscriber({
|
|
61
|
+
endpoint: `${brandAgentHost()}/api/external/asr/transcribe`,
|
|
62
|
+
getToken: getPlatformToken,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return _transcriber;
|
|
66
|
+
}
|
|
67
|
+
export async function transcribeWithXiaomiMimo({ bytes, mimeType, fileName }) {
|
|
68
|
+
try {
|
|
69
|
+
const blob = new Blob([Uint8Array.from(bytes)], { type: mimeType || "audio/wav" });
|
|
70
|
+
const ext = (fileName || "").split(".").pop()?.toLowerCase() || "wav";
|
|
71
|
+
const text = await getTranscriber()(blob, {
|
|
72
|
+
filename: fileName || "audio.wav",
|
|
73
|
+
extension: ext,
|
|
74
|
+
mime: mimeType || "audio/wav",
|
|
75
|
+
});
|
|
76
|
+
const clean = typeof text === "string" ? text.trim() : "";
|
|
77
|
+
if (!clean) {
|
|
78
|
+
throw new Error("未检测到说话内容");
|
|
79
|
+
}
|
|
80
|
+
return { text: clean, provider: "xiaomi-mimo" };
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
console.error(`[${ASR_SOURCE}] 转写异常:`, e instanceof Error ? e.message : e);
|
|
84
|
+
throw e;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import react__default, { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
/** 模型详情(来自 models.json 的条目,已剔除 apiKey)。键为 models.json 原始字段名。 */
|
|
5
|
+
interface ModelMeta {
|
|
6
|
+
vendor?: string;
|
|
7
|
+
url?: string;
|
|
8
|
+
maxInputTokens?: number;
|
|
9
|
+
maxOutputTokens?: number;
|
|
10
|
+
temperature?: number;
|
|
11
|
+
supportsToolCall?: boolean;
|
|
12
|
+
supportsImages?: boolean;
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
}
|
|
15
|
+
/** 模型选项:兼容「纯 id 字符串」与「{id, name, meta} 对象」两种来源。 */
|
|
16
|
+
type ModelOption = string | {
|
|
17
|
+
id: string;
|
|
18
|
+
name?: string;
|
|
19
|
+
meta?: ModelMeta;
|
|
20
|
+
};
|
|
21
|
+
declare function ModelSelect({ options, value, onChange, }: {
|
|
22
|
+
options: ModelOption[];
|
|
23
|
+
/** 选中项的身份 key(`vendor::id`,见 modelOptionKey);无 vendor 时即纯 id。 */
|
|
24
|
+
value: string;
|
|
25
|
+
/** 回传被点选条目的身份 key(`vendor::id`);调用方发送给引擎前再取纯 id。 */
|
|
26
|
+
onChange: (key: string) => void;
|
|
27
|
+
}): react.JSX.Element;
|
|
28
|
+
|
|
29
|
+
/** Pure file-change aggregation and text comparison shared by the UI and regression checks. */
|
|
30
|
+
type ArtifactType$1 = "html" | "markdown" | "image" | "pdf" | "text" | "word" | "other" | "browser";
|
|
31
|
+
interface ArtifactChange {
|
|
32
|
+
id: string;
|
|
33
|
+
name: string;
|
|
34
|
+
type: ArtifactType$1;
|
|
35
|
+
size?: number;
|
|
36
|
+
change?: "added" | "modified" | "deleted";
|
|
37
|
+
oldContent?: string | null;
|
|
38
|
+
newContent?: string | null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** 产物类型(与服务端 artifacts.ts 的 ArtifactType 保持一致;browser 为右栏浏览器实时预览的虚拟类型) */
|
|
42
|
+
type ArtifactType = "html" | "markdown" | "image" | "pdf" | "text" | "word" | "other" | "browser";
|
|
43
|
+
/** 产物元信息(服务端 /api/artifact 列表返回) */
|
|
44
|
+
interface ArtifactMeta {
|
|
45
|
+
id: string;
|
|
46
|
+
name: string;
|
|
47
|
+
type: ArtifactType;
|
|
48
|
+
/** 文件字节数(前端展示大小) */
|
|
49
|
+
size?: number;
|
|
50
|
+
/** 文件所在真实目录(「打开文件夹」跟随文件用):服务端 list 返回;桌面壳据此 openPath */
|
|
51
|
+
dir?: string;
|
|
52
|
+
}
|
|
53
|
+
/** 场景(顶部场景栏的每一项) */
|
|
54
|
+
interface Scene {
|
|
55
|
+
key: string;
|
|
56
|
+
label: string;
|
|
57
|
+
suggestions: string[];
|
|
58
|
+
}
|
|
59
|
+
/** 登录用户信息(unionId 存在视为已登录) */
|
|
60
|
+
interface ChatUser {
|
|
61
|
+
unionId?: string;
|
|
62
|
+
name?: string;
|
|
63
|
+
avatar?: string;
|
|
64
|
+
/** 登录方式:dingtalk | feishu(分享到 OA 时决定走哪家 JSAPI) */
|
|
65
|
+
provider?: string;
|
|
66
|
+
}
|
|
67
|
+
interface ChatWindowProps {
|
|
68
|
+
/** 登录用户信息 */
|
|
69
|
+
initialUser?: ChatUser;
|
|
70
|
+
/** API 根路径,如 /agent;产物预览/上传/会话等端点都基于它 */
|
|
71
|
+
basePath?: string;
|
|
72
|
+
/** 场景列表;不传用 DEFAULT_SCENES,传 null 隐藏场景 tab(含空态建议) */
|
|
73
|
+
scenes?: Scene[] | null;
|
|
74
|
+
/** 退出登录回调(宿主接管时不再调 /api/logout 跳转) */
|
|
75
|
+
onLogout?: () => void | Promise<void>;
|
|
76
|
+
/** 聊天 SSE 端点覆盖(默认 basePath/api/chat) */
|
|
77
|
+
chatEndpoint?: string;
|
|
78
|
+
/** 上传端点覆盖(默认 basePath/api/upload) */
|
|
79
|
+
uploadEndpoint?: string;
|
|
80
|
+
/** 是否启用语音输入 */
|
|
81
|
+
voiceEnabled?: boolean;
|
|
82
|
+
/** 是否启用附件上传 */
|
|
83
|
+
uploadEnabled?: boolean;
|
|
84
|
+
/** 顶栏标题 */
|
|
85
|
+
title?: string;
|
|
86
|
+
/** 顶栏 Logo */
|
|
87
|
+
logoSrc?: string | null;
|
|
88
|
+
/** 左栏顶部 Logo(宿主传入;不传时显示「会话」标题) */
|
|
89
|
+
sidebarLogo?: string | null;
|
|
90
|
+
/** 可选模型列表(非空时输入区语音按钮左侧显示模型下拉;空=不显示)。
|
|
91
|
+
* 宿主可显式传入以覆盖默认来源;不传时由 agent-kit 前端自动从后端
|
|
92
|
+
* GET /api/models/list 拉取(models.json 自定义模型优先,否则 env AGENT_MODEL_LIST 兜底)。
|
|
93
|
+
* 每项可为纯 id 字符串(env 兜底)或 { id, name, meta }(models.json 自定义模型,
|
|
94
|
+
* 下拉显示 name、悬停展示 meta 详情;meta 已剔除 apiKey)。
|
|
95
|
+
* 用户选择后每轮发送 body 携带 model(始终为 id),服务端 session 流 setModel 运行中切换。 */
|
|
96
|
+
models?: ModelOption[];
|
|
97
|
+
/** 在当前会话的消息列表末尾渲染一次宿主内容(如人工联系人卡片)。
|
|
98
|
+
* 有助手消息且历史加载完成后调用;切换会话时传入对应会话 ID 与消息。 */
|
|
99
|
+
renderSessionFooter?: (context: {
|
|
100
|
+
sessionId: string;
|
|
101
|
+
messages: readonly UiMessage[];
|
|
102
|
+
}) => ReactNode;
|
|
103
|
+
}
|
|
104
|
+
/** 附件(输入框挂载态 / 消息附带) */
|
|
105
|
+
interface UiAttachment {
|
|
106
|
+
url: string;
|
|
107
|
+
name: string;
|
|
108
|
+
size?: number;
|
|
109
|
+
/** 本地文件对象(发送时转 base64 供多模态识别) */
|
|
110
|
+
file?: File;
|
|
111
|
+
/** 本地预览用 object URL(仅上传后、发送前有效) */
|
|
112
|
+
previewUrl?: string;
|
|
113
|
+
}
|
|
114
|
+
interface UiImage {
|
|
115
|
+
base64: string;
|
|
116
|
+
media_type: string;
|
|
117
|
+
}
|
|
118
|
+
interface UiQuestionOption {
|
|
119
|
+
label: string;
|
|
120
|
+
description?: string;
|
|
121
|
+
}
|
|
122
|
+
/** AskUserQuestion 卡片的问题 */
|
|
123
|
+
interface UiQuestion {
|
|
124
|
+
header?: string;
|
|
125
|
+
question: string;
|
|
126
|
+
multiSelect?: boolean;
|
|
127
|
+
options: UiQuestionOption[];
|
|
128
|
+
}
|
|
129
|
+
interface UiTool {
|
|
130
|
+
name: string;
|
|
131
|
+
input?: string;
|
|
132
|
+
/** 从 SDK 完整工具入参提取的运行内容;独立于截断的 JSON 入参。 */
|
|
133
|
+
activity?: string;
|
|
134
|
+
/** 文件编辑工具(Edit/Write/MultiEdit)的增删行统计:步骤卡片显示「已编辑文件 <path> +N -M」 */
|
|
135
|
+
edit?: {
|
|
136
|
+
file: string;
|
|
137
|
+
addedLines: number;
|
|
138
|
+
removedLines: number;
|
|
139
|
+
};
|
|
140
|
+
/** 工具执行状态(豆包 Work 式就地更新):running=执行中 / completed=成功 / failed=失败 */
|
|
141
|
+
status?: "running" | "completed" | "failed";
|
|
142
|
+
/** 关联 tool_use_id(SSE tool 事件与 tool_result 事件配对用) */
|
|
143
|
+
toolUseId?: string;
|
|
144
|
+
/** 工具结果极简摘要(超长内容不展示原文,仅失败时展示错误信息) */
|
|
145
|
+
result?: string;
|
|
146
|
+
/** 结果是否因超长被截断(仅作提示,不展示全文) */
|
|
147
|
+
resultTruncated?: boolean;
|
|
148
|
+
}
|
|
149
|
+
/** 一条思考步骤(thinking/text/tool/ask 与用时) */
|
|
150
|
+
interface UiStep {
|
|
151
|
+
thinking?: string;
|
|
152
|
+
text?: string;
|
|
153
|
+
tool?: UiTool | null;
|
|
154
|
+
ask?: UiQuestion[] | null;
|
|
155
|
+
answered?: string | null;
|
|
156
|
+
secs?: number | null;
|
|
157
|
+
/** control_browser 过程展示(headless 无头浏览器,截图/动作实时进 thinking) */
|
|
158
|
+
browser?: BrowserStepData | null;
|
|
159
|
+
}
|
|
160
|
+
/** control_browser 过程数据:浏览器会话 id + 截图(base64)+ 动作日志 + 状态。
|
|
161
|
+
* ask 人工接管时前端凭 id POST /api/chat/browser-answer 回传答案。 */
|
|
162
|
+
interface BrowserStepData {
|
|
163
|
+
id: string;
|
|
164
|
+
/** base64 截图仅用于右侧边栏实时预览(不再渲染进消息列表) */
|
|
165
|
+
screenshots: string[];
|
|
166
|
+
actions: Array<{
|
|
167
|
+
step: number;
|
|
168
|
+
action: string;
|
|
169
|
+
params?: Record<string, unknown>;
|
|
170
|
+
}>;
|
|
171
|
+
thinking?: string;
|
|
172
|
+
ask?: {
|
|
173
|
+
step: number;
|
|
174
|
+
question: string;
|
|
175
|
+
} | null;
|
|
176
|
+
status?: string;
|
|
177
|
+
finalSummary?: string;
|
|
178
|
+
}
|
|
179
|
+
/** 本轮模型信息(是否走了 fallback 积分模型) */
|
|
180
|
+
interface ModelInfo {
|
|
181
|
+
usedFallback?: boolean;
|
|
182
|
+
fallbackModel?: string;
|
|
183
|
+
models?: string[];
|
|
184
|
+
}
|
|
185
|
+
/** 对话消息(流式内存态 / 历史恢复态共用) */
|
|
186
|
+
interface UiMessage {
|
|
187
|
+
/** 数据库消息 id(历史恢复的消息有,流式新建无) */
|
|
188
|
+
id?: number;
|
|
189
|
+
role: "user" | "assistant";
|
|
190
|
+
content: string;
|
|
191
|
+
/** 遗留字段(消息级思考文本已拆到 steps),保留以兼容初始化对象 */
|
|
192
|
+
thinking?: string;
|
|
193
|
+
createdAt?: string | null;
|
|
194
|
+
attachment?: UiAttachment;
|
|
195
|
+
images?: UiImage[];
|
|
196
|
+
steps?: UiStep[];
|
|
197
|
+
thinkingSecs?: number | null;
|
|
198
|
+
/** 共用时:用户发送该消息开始计时,到全部答复完成 / 用户点击停止为止(秒) */
|
|
199
|
+
elapsedSecs?: number | null;
|
|
200
|
+
modelInfo?: ModelInfo | null;
|
|
201
|
+
/** 本轮消耗信息(result 消息:token usage 与美元成本;积分字段 SDK 未返回) */
|
|
202
|
+
costInfo?: {
|
|
203
|
+
costUsd?: number | null;
|
|
204
|
+
usage?: Record<string, number> | null;
|
|
205
|
+
} | null;
|
|
206
|
+
/** 本轮产物变更(服务端 artifact 事件:added/modified/deleted + 新旧内容) */
|
|
207
|
+
artifacts?: ArtifactChange[];
|
|
208
|
+
}
|
|
209
|
+
/** 待发消息队列项 */
|
|
210
|
+
interface QueueItem {
|
|
211
|
+
id: string;
|
|
212
|
+
text: string;
|
|
213
|
+
attachment: {
|
|
214
|
+
url: string;
|
|
215
|
+
name: string;
|
|
216
|
+
size?: number;
|
|
217
|
+
} | null;
|
|
218
|
+
createdAt: string;
|
|
219
|
+
}
|
|
220
|
+
/** 每个会话独立的运行时状态(切走不杀旧流,旧会话在后台继续 SSE) */
|
|
221
|
+
interface RtState {
|
|
222
|
+
messages: UiMessage[];
|
|
223
|
+
busy: boolean;
|
|
224
|
+
queue: QueueItem[];
|
|
225
|
+
abort: AbortController | null;
|
|
226
|
+
stuckTimer: ReturnType<typeof setInterval> | null;
|
|
227
|
+
thinkingTimer: ReturnType<typeof setInterval> | null;
|
|
228
|
+
thinkingStart: number | null;
|
|
229
|
+
stepStarts: Map<number, number>;
|
|
230
|
+
pendingAnswer: QueueItem | null;
|
|
231
|
+
stuckHint: boolean;
|
|
232
|
+
errorMsg: string | null;
|
|
233
|
+
openThinking: Set<string>;
|
|
234
|
+
lastDataTs: number;
|
|
235
|
+
sessionStarted: boolean;
|
|
236
|
+
sessionRegistered: boolean;
|
|
237
|
+
/** SDK transcript 用的 sessionId:正常 = sid;编辑重发时换新 UUID */
|
|
238
|
+
sdkSid: string;
|
|
239
|
+
/** 共用时计时起点:本条用户消息发送时刻(毫秒时间戳);流结束/停止时算出 elapsedSecs */
|
|
240
|
+
elapsedStart?: number | null;
|
|
241
|
+
}
|
|
242
|
+
/** 侧边栏会话项 */
|
|
243
|
+
interface SessionItem {
|
|
244
|
+
id: string;
|
|
245
|
+
title: string;
|
|
246
|
+
updatedAt?: string | null;
|
|
247
|
+
createdAt?: string | null;
|
|
248
|
+
/** 本会话工作目录(沙箱范围,本地 app 选择后由服务端返回) */
|
|
249
|
+
workspaceDir?: string | null;
|
|
250
|
+
}
|
|
251
|
+
declare const DEFAULT_SCENES: {
|
|
252
|
+
key: string;
|
|
253
|
+
label: string;
|
|
254
|
+
suggestions: string[];
|
|
255
|
+
}[];
|
|
256
|
+
declare function ChatWindow({ initialUser, basePath: basePathProp, scenes, onLogout, chatEndpoint, uploadEndpoint, voiceEnabled, uploadEnabled, title, logoSrc, sidebarLogo, models: modelsProp, renderSessionFooter, }: ChatWindowProps): react.JSX.Element;
|
|
257
|
+
|
|
258
|
+
interface MarkdownProps {
|
|
259
|
+
content?: string | null;
|
|
260
|
+
className?: string;
|
|
261
|
+
/** 对话内搜索:非空时把正文文本节点中匹配该词(大小写不敏感)的片段包成 <mark> 高亮(代码块/行内代码不处理) */
|
|
262
|
+
highlight?: string;
|
|
263
|
+
/** 流式输出中:开启「正在输出」视觉(块级渐入淡入 + 末尾闪烁光标);流结束自动移除 */
|
|
264
|
+
streaming?: boolean;
|
|
265
|
+
}
|
|
266
|
+
declare const Markdown: react__default.NamedExoticComponent<MarkdownProps>;
|
|
267
|
+
|
|
268
|
+
/** Answer actions. Feedback remains local until an upstream reporting API is available. */
|
|
269
|
+
declare function FeedbackButtons({ sessionId, answer, branchAction, onRegenerate, canRegenerate }: {
|
|
270
|
+
sessionId?: string;
|
|
271
|
+
answer?: string;
|
|
272
|
+
branchAction?: ReactNode;
|
|
273
|
+
onRegenerate?: () => void;
|
|
274
|
+
canRegenerate?: boolean;
|
|
275
|
+
}): react.JSX.Element;
|
|
276
|
+
|
|
277
|
+
type SliderMsgLike = {
|
|
278
|
+
role: string;
|
|
279
|
+
content: string;
|
|
280
|
+
};
|
|
281
|
+
declare function MessageSlider({ bodyRef, messages, loading, onJump, }: {
|
|
282
|
+
/** 挂在 .chat-body 滚动容器上的 ref(与 useChatScroll 共享同一个) */
|
|
283
|
+
bodyRef: React.RefObject<HTMLDivElement | null>;
|
|
284
|
+
messages: readonly SliderMsgLike[];
|
|
285
|
+
loading: boolean;
|
|
286
|
+
/** 点击横线后的跳转回调(宿主传 scrollToMsg 即可) */
|
|
287
|
+
onJump: (msgIndex: number) => void;
|
|
288
|
+
}): react.JSX.Element;
|
|
289
|
+
|
|
290
|
+
interface AuthState {
|
|
291
|
+
loading: boolean;
|
|
292
|
+
user: {
|
|
293
|
+
name: string;
|
|
294
|
+
avatar?: string;
|
|
295
|
+
unionId?: string;
|
|
296
|
+
provider?: string;
|
|
297
|
+
sub?: string;
|
|
298
|
+
} | null;
|
|
299
|
+
}
|
|
300
|
+
declare function useAgentAuth(basePath: string): AuthState;
|
|
301
|
+
|
|
302
|
+
interface LoginProviderOption {
|
|
303
|
+
/** 登录方式标识:dingtalk | feishu | builtin(builtin 自建登录待实现,类型先留口子) */
|
|
304
|
+
id: "dingtalk" | "feishu" | "builtin";
|
|
305
|
+
/** 按钮文案,如"飞书登录" */
|
|
306
|
+
name: string;
|
|
307
|
+
}
|
|
308
|
+
interface LoginPageProps {
|
|
309
|
+
/** API 根路径(= cookiePath,如 /agent;登录端点都基于它) */
|
|
310
|
+
basePath: string;
|
|
311
|
+
/** 页面标题(默认 "AI 助手") */
|
|
312
|
+
title?: string;
|
|
313
|
+
/** 副标题(默认 "选择登录方式") */
|
|
314
|
+
tagline?: string;
|
|
315
|
+
/** 登录页 Logo URL(可选) */
|
|
316
|
+
logoUrl?: string;
|
|
317
|
+
/** 登录失败错误码:config/state/network/organization(内置文案映射)或任意文案 */
|
|
318
|
+
error?: string;
|
|
319
|
+
/** 登录成功后的回跳路径(仅接受以 basePath 开头的路径,防开放重定向) */
|
|
320
|
+
next?: string;
|
|
321
|
+
/** 可用的真实登录方式列表(getLoginOptions().providers) */
|
|
322
|
+
providers?: LoginProviderOption[];
|
|
323
|
+
/**
|
|
324
|
+
* 宿主服务端检测的客户端环境(adaptive 场景):
|
|
325
|
+
* - "dingtalk":已在钉钉 App 内 → 不渲染选择器,只显示免登状态与钉钉回退按钮(先检测后登录)
|
|
326
|
+
* - "none" / 缺省:普通浏览器(既不在飞书也不在钉钉)→ 渲染登录方式选择器
|
|
327
|
+
* - "feishu":飞书 App 内由宿主直接 302 OAuth,不会走到本组件渲染
|
|
328
|
+
*/
|
|
329
|
+
detected?: "dingtalk" | "feishu" | "none";
|
|
330
|
+
/** 额外内容(如钉钉免登组件),插在登录按钮列表下方 */
|
|
331
|
+
children?: ReactNode;
|
|
332
|
+
}
|
|
333
|
+
declare function LoginPage({ basePath, title, tagline, logoUrl, error, next, providers, detected, children, }: LoginPageProps): react.JSX.Element;
|
|
334
|
+
|
|
335
|
+
interface DingTalkAutoLoginProps {
|
|
336
|
+
/** API 根路径(决定 sso 端点与回跳路径) */
|
|
337
|
+
basePath: string;
|
|
338
|
+
/** 钉钉微应用 ClientId(AppKey) */
|
|
339
|
+
clientId: string;
|
|
340
|
+
/** 钉钉企业 CorpId */
|
|
341
|
+
corpId: string;
|
|
342
|
+
}
|
|
343
|
+
declare function DingTalkAutoLogin({ basePath, clientId, corpId }: DingTalkAutoLoginProps): react.JSX.Element | null;
|
|
344
|
+
|
|
345
|
+
interface AgentAppProps extends ChatWindowProps {
|
|
346
|
+
/** 加载占位的自定义内容 */
|
|
347
|
+
loadingFallback?: React.ReactNode;
|
|
348
|
+
}
|
|
349
|
+
declare function AgentApp({ loadingFallback, ...chat }: AgentAppProps): string | number | bigint | boolean | Iterable<react.ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<react.ReactNode> | null | undefined> | react.JSX.Element | null;
|
|
350
|
+
|
|
351
|
+
interface AdminUsageProps {
|
|
352
|
+
basePath?: string;
|
|
353
|
+
/** 返回回调(默认 location.href 回 basePath) */
|
|
354
|
+
onBack?: () => void;
|
|
355
|
+
}
|
|
356
|
+
declare function AdminUsage({ basePath, onBack }: AdminUsageProps): react.JSX.Element;
|
|
357
|
+
|
|
358
|
+
export { AdminUsage, type AdminUsageProps, AgentApp, type AgentAppProps, ChatWindow as AgentChat, type ArtifactMeta, type ArtifactType, type AuthState, type ChatUser, ChatWindow, type ChatWindowProps, DEFAULT_SCENES, DingTalkAutoLogin, FeedbackButtons, LoginPage, type LoginPageProps, type LoginProviderOption, Markdown, type MarkdownProps, MessageSlider, type ModelInfo, ModelSelect, type QueueItem, type RtState, type Scene, type SessionItem, type UiAttachment, type UiImage, type UiMessage, type UiQuestion, type UiQuestionOption, type UiStep, type UiTool, useAgentAuth };
|