@blade-hq/agent-client 2610.0.0-beta.50 → 2610.0.0-beta.52
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 +100 -2
- package/dist/blade-client.d.ts +6 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.js +472 -68
- package/dist/index.js.map +1 -1
- package/dist/resources/sessions.d.ts +101 -0
- package/dist/resources/site-visits.d.ts +32 -0
- package/dist/rest.d.ts +8 -0
- package/dist/schemas/mcp-app.d.ts +30 -0
- package/dist/session/agent-session.d.ts +35 -11
- package/dist/session/events.d.ts +2 -0
- package/dist/session/queue.d.ts +92 -0
- package/dist/session/state.d.ts +8 -0
- package/dist/shared/tool-ui-card.d.ts +58 -0
- package/dist/types/socket-events.d.ts +163 -2
- package/package.json +1 -1
- package/public-api.md +321 -6
package/README.md
CHANGED
|
@@ -174,6 +174,41 @@ await client.sessions.getSessionTurnsPage(id, { before: page.nextBefore! })
|
|
|
174
174
|
会话插件可通过 `client.sessions.listSessionPlugins(id)` 查询,并用
|
|
175
175
|
`client.sessions.setSessionPluginActivation(id, name, active)` 切换当前会话。列表项为 `SessionPlugin`;修改结果为 `SessionPluginActivation`,只返回选择和准备状态,安装事实需从列表获取。
|
|
176
176
|
|
|
177
|
+
插件可以在包内 `cn.com.bladeai.agent/config.schema.json` 用标准 JSON Schema
|
|
178
|
+
(Draft 2020-12)声明账号、token 或任意业务配置。声明了配置的插件用
|
|
179
|
+
`client.sessions.getSessionPluginConfig(id, name)` 读取声明与当前值,用
|
|
180
|
+
`client.sessions.updateSessionPluginConfig(id, name, { expected_revision, set, remove })`
|
|
181
|
+
保存;两者都要等到插件包已准备(即已激活过)才有内容,没有声明的插件返回
|
|
182
|
+
`state: "not_required"`。
|
|
183
|
+
|
|
184
|
+
```ts
|
|
185
|
+
const { config } = await client.sessions.getSessionPluginConfig(id, "crm")
|
|
186
|
+
// config: SessionPluginConfigState
|
|
187
|
+
// state "not_required" | "required" | "configured" | "error"
|
|
188
|
+
// schema 包内声明的 JSON Schema(Draft 2020-12)
|
|
189
|
+
// values 已存值,writeOnly 字段已被平台剔除
|
|
190
|
+
// write_only 当前有值的秘密字段 JSON Pointer
|
|
191
|
+
// revision 乐观并发用的版本号
|
|
192
|
+
// errors SessionPluginConfigError[],逐条 { path, message },不含用户输入
|
|
193
|
+
// 列表项 SessionPlugin.config 是 SessionPluginConfigSummary
|
|
194
|
+
// (SessionPluginConfigStateName 之外多一个 "unchecked":列表只报本地已知事实,
|
|
195
|
+
// 不伪报已配置)
|
|
196
|
+
|
|
197
|
+
await client.sessions.updateSessionPluginConfig(id, "crm", {
|
|
198
|
+
expected_revision: config.revision,
|
|
199
|
+
set: [{ path: "/login/password", value: password }], // SessionPluginConfigSet[]
|
|
200
|
+
remove: [],
|
|
201
|
+
} satisfies SessionPluginConfigUpdate)
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
图标用 `client.sessions.fetchSessionPluginIcon(id, name)` 取 `Blob`(自带凭据),
|
|
205
|
+
或 `client.sessions.sessionPluginIconUrl(id, name)` 取已鉴权 URL。
|
|
206
|
+
|
|
207
|
+
`set`/`remove` 只表达显式改动:没出现的字段保持原值,因此表单不需要回传秘密;
|
|
208
|
+
`null` 是一个合法值,不是删除。校验不通过或版本过期时请求被拒绝,磁盘上的旧
|
|
209
|
+
配置保持不变。平台只写用户 Home 下的 `~/.plugin/<plugin_id>/config.json`,不会
|
|
210
|
+
重启 MCP、清缓存或刷新 token。
|
|
211
|
+
|
|
177
212
|
### 会话回放(演示 / 彩排)
|
|
178
213
|
|
|
179
214
|
拿一个已经聊完的会话当素材,重现当时的回复和工具调用,**完全不调用模型**。
|
|
@@ -362,6 +397,7 @@ chat.getState()
|
|
|
362
397
|
// connection, 连接状态:"connected" | "connecting" | "reconnecting" | "disconnected"
|
|
363
398
|
// errorMessage, 最近一次运行错误
|
|
364
399
|
// replay, 回放状态:{ isReplay, speed, sourceSessionId } | null
|
|
400
|
+
// queue, 等待消息队列快照:{ session_id, revision, paused, pause_reason, items }
|
|
365
401
|
// viewerRole, "owner" | "viewer" | null(只读身份改不动会话)
|
|
366
402
|
// nextBefore, loadingOlder, 历史分页游标与加载状态
|
|
367
403
|
// turns, askAnswers, agentLoops, activeCompaction 进阶字段
|
|
@@ -377,8 +413,8 @@ const unsubscribe = chat.subscribe(() => rerender(chat.getState()))
|
|
|
377
413
|
```ts
|
|
378
414
|
const accepted = await chat.send("你好") // 服务端接受后为 true;拒绝时为 false
|
|
379
415
|
await chat.send("换个方案", { mode: "planning" }) // 指定模式/模型等选项
|
|
380
|
-
chat.
|
|
381
|
-
await chat.stop() //
|
|
416
|
+
await chat.queueMessage("补充:预算不超过 5 万") // 运行中入队;返回服务端确认结果与冲突原因
|
|
417
|
+
await chat.stop() // 停止当前回复(同时暂停队列,需 resumeQueue 继续)
|
|
382
418
|
await chat.compact() // 手动压缩上下文
|
|
383
419
|
if (chat.hasOlderHistory) await chat.loadOlderHistory()
|
|
384
420
|
chat.dispose() // 彻底释放(什么时候该调见下方说明)
|
|
@@ -388,6 +424,28 @@ chat.dispose() // 彻底释放(什么时候
|
|
|
388
424
|
> 1. 用户明确关闭或删除了这个会话,之后不会再回来;
|
|
389
425
|
> 2. 页面长期开着并且会不断创建一次性会话(比如批量任务面板),需要主动回收。
|
|
390
426
|
|
|
427
|
+
### 等待消息队列
|
|
428
|
+
|
|
429
|
+
队列由服务端持久化:运行中发送、暂停期间发送都进入队尾,按顺序逐条执行;关掉页面不影响已确认的入队,重新打开恢复真实状态。等待消息**不会**提前伪装成聊天记录——它只在队列区域展示,真正被接收后才进入消息流。
|
|
430
|
+
|
|
431
|
+
```ts
|
|
432
|
+
const result = await chat.queueMessage("顺便看下这个报错") // 入队(运行中排队 / 暂停期间照常入队)
|
|
433
|
+
// result: { ok, conflict, snapshot, message }
|
|
434
|
+
|
|
435
|
+
await chat.updateQueuedMessage(item.id, item.version, "改好的正文")
|
|
436
|
+
await chat.reorderQueuedMessages(queue.revision, pendingIdsInNewOrder) // ordered_ids 必须是当前 pending 条目 id 的完整集合
|
|
437
|
+
await chat.cancelQueuedMessage(item.id, item.version)
|
|
438
|
+
await chat.deliverQueuedMessage(item.id, item.version) // 立即补充:交给当前运行在下一个接收点消费
|
|
439
|
+
await chat.resumeQueue() // 暂停后继续执行
|
|
440
|
+
await chat.refreshQueue() // 手动拉一份权威快照(首次连接与每次重连已自动拉取)
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
`chat.getState().queue` 是 `SessionQueueSnapshot`:`{ session_id, revision, paused, pause_reason, items }`。它只会被 revision 更新的快照替换——乱序到达的旧广播不会把新状态顶回去。`items` 只包含 `pending`(待执行)与 `delivering`(等待接收)。
|
|
444
|
+
|
|
445
|
+
- **冲突处理**:`conflict` 表示乐观并发或状态校验失败,服务端快照已自动刷新到本地,此时保留用户草稿并说明原因即可;`ok=false` 且 `snapshot` 为 null(例如鉴权失败)时不要改动本地队列。`queueMessage` 结果未知(ack 超时)时会用同一个 `client_request_id` 重试一次,不会制造第二条。
|
|
446
|
+
- **可操作性判定**:`canEditQueuedMessage` / `canCancelQueuedMessage` / `canDeliverQueuedMessage` 只对 `pending` 返回 true;文案用 `queuedMessageStatusLabel` 与 `queuePauseReasonLabel`。
|
|
447
|
+
- **自己处理广播**:需要绕过状态机时用 `isSessionQueueSnapshot` + `shouldApplySnapshot` + `EMPTY_SESSION_QUEUE`;解析自定义 ack 用 `parseQueueAck`,返回统一的 `QueueOperationResult`(`QueueAck` 是 ack 的线格式)。
|
|
448
|
+
|
|
391
449
|
### 页面协作:让智能体和你的页面互动
|
|
392
450
|
|
|
393
451
|
**页面状态与业务后端 → 智能体**:
|
|
@@ -596,6 +654,38 @@ transformSlashCommand(skillId, prompt, { local: false, installed: false })
|
|
|
596
654
|
|
|
597
655
|
不传第三个参数时按本地已有处理,和不带这个参数的老用法结果一致。
|
|
598
656
|
|
|
657
|
+
### MCP App 卡片
|
|
658
|
+
|
|
659
|
+
MCP 工具可以通过 `_meta.ui` 在消息流里产出交互卡片(`tool_ui` block)。卡片的
|
|
660
|
+
实例、守卫、可见性、身份和终态规则全部收敛在这一份共享判定里——内置 Web 与
|
|
661
|
+
SDK 渲染的是同一批卡片,不要自己再写一份判断:
|
|
662
|
+
|
|
663
|
+
```ts
|
|
664
|
+
import {
|
|
665
|
+
collectInlineToolUiCards,
|
|
666
|
+
collectPreviewToolUiCards,
|
|
667
|
+
resolveToolUiCardContent,
|
|
668
|
+
buildToolUiCardKey,
|
|
669
|
+
isToolUiCard,
|
|
670
|
+
} from "@blade-hq/agent-client"
|
|
671
|
+
|
|
672
|
+
// 按可见性分类:inline 进消息流,preview 交给你的侧栏/面板(也随 toolPreview 事件推送)
|
|
673
|
+
const inlineCards = collectInlineToolUiCards(messages) // [{ key, toolCallId, card }]
|
|
674
|
+
const previewCards = collectPreviewToolUiCards(messages) // [{ key, toolCall, card, blocks }]
|
|
675
|
+
|
|
676
|
+
// 渲染前解析实际内容;archived 留档卡片只用留档 HTML,绝不回退 resourceUri
|
|
677
|
+
// (历史恢复/刷新不会因此重放一次 MCP 资源读取)
|
|
678
|
+
const resolved = resolveToolUiCardContent(card) // { type: "resource-html" | "resource-uri", content } | null
|
|
679
|
+
|
|
680
|
+
// 实例去重键:uri 卡片按内容、html 卡片按 toolCallId,与 toolPreview 事件、内置侧栏一致
|
|
681
|
+
const key = buildToolUiCardKey(toolCallId, resolved.type, resolved.content)
|
|
682
|
+
```
|
|
683
|
+
|
|
684
|
+
单个 block 判有效用 `isToolUiCard`(严格守卫:`target`/`height` 缺失、archived 无留档
|
|
685
|
+
HTML 一律判无效);`isInternalStatusToolUiCard` 识别内部「阶段进度」卡片(不对用户展示),
|
|
686
|
+
`isAppDevToolUiCard` 识别应用开发会话的预览卡。相关类型:`ToolUiCard`、
|
|
687
|
+
`ToolUiCardContentType`、`InlineToolUiCardEntry`、`PreviewToolUiCardEntry`。
|
|
688
|
+
|
|
599
689
|
## 常见问题
|
|
600
690
|
|
|
601
691
|
| 现象 | 原因与解法 |
|
|
@@ -617,11 +707,19 @@ transformSlashCommand(skillId, prompt, { local: false, installed: false })
|
|
|
617
707
|
- **声明式会话**:`SessionDefinition`、`SolutionDefinition`、`SkillDefinition`、`SessionConfig`、`TextFile`、`SessionSetupError`、`SessionSetupStage`
|
|
618
708
|
- **模型目录**:`ModelsResource`、`ModelCatalog`、`ModelOption`
|
|
619
709
|
- **聊天项目资源(REST)**:`ChatProjectsResource`、`ChatProject`(含 `delete` 永久删除)
|
|
710
|
+
- **全站访问统计(REST)**:`SiteVisitsResource`、`SiteVisitsSummary`(`client.siteVisits.record()` 上报一次页面访问、`client.siteVisits.summary()` 只读快照)。这两个操作走独立匿名传输:不带 bearer、不触发 401 登录刷新,只依赖匿名访客 Cookie,供内置 Web 同源使用。
|
|
620
711
|
- **会话资源(REST)**:`SessionsResource`、`CreateSessionRequest`、`ImportSessionOptions`、`AppCliDefinition`、`AppCliAttachment`、`AttachAppOptions`、`PaginatedSessionsResult`、`GlobalSearchResult`、`GlobalSearchResultItem`、`GlobalSearchConversationResult`、`GlobalSearchFileResult`、`SessionHistory`、`SessionContextStats`、`ResultFeedback`、`ResultFeedbackReason`、`ShareLinkResult`、`FileEntry`、`UploadFileEntry`、`UploadFilesOptions`、`SessionProfile`、`SessionDetail`、`SessionInfo`、`SessionStatus`、`SessionPortMapping`、`ModeId`、`TemplateId`、`PrimarySkillSnapshot`、`PrimarySkillParallelMode`
|
|
621
712
|
- **会话回放**:`ReplayState`、`ReplaySpeed`、`ReplayPreview`、`ReplaySnapshot`、`toReplaySnapshot`、`DEFAULT_REPLAY_SPEED`
|
|
622
713
|
- **会话状态机**:`SessionHub`、`SessionConnectOptions`、`SessionState`、`SendOptions`、`ConnectionStatus`、`AskUserAnswerData`、`AgentLoopInfo`、`ActiveCompactionState`、`createInitialSessionState`、`AgentSessionEventName`
|
|
714
|
+
- **会话消息队列**:`SessionQueueSnapshot`、`QueuedMessage`、`QueuedMessageStatus`、`QueueAck`、`QueueOperationResult`、`EMPTY_SESSION_QUEUE`、`isSessionQueueSnapshot`、`shouldApplySnapshot`、`parseQueueAck`、`canEditQueuedMessage`、`canCancelQueuedMessage`、`canDeliverQueuedMessage`、`queuedMessageStatusLabel`、`queuePauseReasonLabel`
|
|
623
715
|
- **页面协作**:`EmbeddedChat`、`EmbeddedChatOptions`、`CommandHandler`、`CommandEnvelope`、`InboundAction`、`InboundEnvelope`、`isCommandEnvelope`、`isInboundEnvelope`
|
|
624
716
|
- **消息与投影协议**:`MessageContent`、`MessageContentPart`、`TextContentPart`、`ImageUrlContentPart`、`FileContentPart`、`ToolCallInfo`、`ToolBridgeContent`、`CompactionInfo`、`ContextProjectionData`、`ContextProjectionFields`、`ContextDisplayState`、`ContextGroupDisplayState`、`ContextAction`、`ContextSourceInfo`、`MemoryRefInfo`、`ArchivedFileInfo`、`ArchivedToolCallInfo`、`TurnProjection`、`ContentBlock`、`PatchEnvelope`、`MemoryRef`、`PostChatFollowup`、`FinalArtifact`、`contextProjectionData`、`getContextDisplayState`、`getContextGroupDisplayState`、`groupAdjacentContextRuns`、`latestPostChatFollowup`、`buildMessageContent`、`normalizeMessageContent`、`isHiddenInternalMessage`、`transformSlashCommand`、`SkillMentionAvailability`、`extractTextAttachments`、`ParsedTextAttachment`、`ParsedTextContext`
|
|
717
|
+
- **MCP Apps 留档与卡片判定**:`McpAppData`、`isMcpAppData`、`McpAppContextState`、`McpAppContextUpdate`、`ToolUiCard`、`ToolUiCardContentType`、`InlineToolUiCardEntry`、`PreviewToolUiCardEntry`、`isToolUiCard`、`resolveToolUiCardContent`、`buildToolUiCardKey`、`isInternalStatusToolUiCard`、`isAppDevToolUiCard`、`collectInlineToolUiCards`、`collectPreviewToolUiCards`(`McpAppContextState` / `McpAppContextUpdate` 配合 `sessions.getMcpAppContext` / `sessions.updateMcpAppContext`:App 保存的状态在下一个新运行才进入模型上下文)
|
|
625
718
|
- **Solution / 任务协议**:`Solution`、`SolutionAppField`、`SolutionAppState`、`SolutionAppUiConfig`、`SolutionRef`、`PublishedSolutionRef`、`ExistingSolutionRef`、`PreparedSolution`、`PreparedSolutionAsset`、`LayoutType`、`BizRole`、`TaskStatus`、`BackgroundTask`、`BackgroundTaskStopResult`
|
|
626
719
|
- **Headless**:`HeadlessResource`、`RunOptions`、`RunResult`、`RunTrace`
|
|
627
720
|
- **低层通道(apps/web 等高级集成)**:`createSocket`、`CreateSocketOptions`、`TypedSocket`、`AsrAudioPayload`、`AuthBusyReconnect`、`authBusyRetryDelayMs`、`ClientProjectionBuilder`、`RawEvent`、`acknowledgeTurnEvents`、`hasChatRunEvent`、`acceptedPostChatFollowupCompletesLatestRun`、`reconcileOptimisticUserTurns`、`reconcileHistoricalUserTurns`
|
|
721
|
+
### MCP App 留档
|
|
722
|
+
|
|
723
|
+
`McpAppArchive` 是 `client.sessions.getMcpApp(sessionId, sourceId)` 经鉴权返回的归档,包含保存的 HTML 与最新留档输入/结果。`callMcpApp` 在会话 sandbox 内调用该卡片的归档能力;`onMcpAppChanged` 订阅结果变化,返回取消订阅函数。
|
|
724
|
+
|
|
725
|
+
最新调用失败或完成状态未知时,归档同时提供 `previousToolInput` / `previousToolResult`,用于先恢复最后成功的界面再展示错误。读取这些留档不会重新执行工具。
|
package/dist/blade-client.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { ComputersResource } from "./resources/computers";
|
|
|
6
6
|
import { ModelsResource } from "./resources/models";
|
|
7
7
|
import { SessionsResource } from "./resources/sessions";
|
|
8
8
|
import { ChatProjectsResource } from "./resources/chat-projects";
|
|
9
|
+
import { SiteVisitsResource } from "./resources/site-visits";
|
|
9
10
|
import { SessionHub } from "./session/hub";
|
|
10
11
|
import { type TypedSocket } from "./socket";
|
|
11
12
|
export interface BladeClientOptions {
|
|
@@ -39,6 +40,11 @@ export declare class BladeClient {
|
|
|
39
40
|
readonly models: ModelsResource;
|
|
40
41
|
readonly sessions: SessionsResource;
|
|
41
42
|
readonly chatProjects: ChatProjectsResource;
|
|
43
|
+
/**
|
|
44
|
+
* 全站访问统计:匿名读写,不带 bearer 也不触发登录刷新。
|
|
45
|
+
* 只有内置 Web 的同源页面使用,第三方宿主页面不会被自动统计。
|
|
46
|
+
*/
|
|
47
|
+
readonly siteVisits: SiteVisitsResource;
|
|
42
48
|
/** 实时会话中枢:client.sessions.connect() 内部使用,一般不直接访问。 */
|
|
43
49
|
readonly hub: SessionHub;
|
|
44
50
|
constructor(options: BladeClientOptions);
|
|
@@ -87,7 +93,6 @@ export declare class BladeClient {
|
|
|
87
93
|
private buildHeaders;
|
|
88
94
|
private buildUrl;
|
|
89
95
|
private baseUrlWithTrailingSlash;
|
|
90
|
-
private toBaseRelativePath;
|
|
91
96
|
private isSameBackendUrl;
|
|
92
97
|
private shouldRefreshFor401;
|
|
93
98
|
private hasExplicitBearerToken;
|
package/dist/index.d.ts
CHANGED
|
@@ -11,10 +11,14 @@ export type { AttachAppOptions, SendOptions } from "./session/agent-session";
|
|
|
11
11
|
export { SessionHub } from "./session/hub";
|
|
12
12
|
export type { SessionConnectOptions } from "./session/hub";
|
|
13
13
|
export type { AgentSessionEvents, AgentSessionEventName } from "./session/events";
|
|
14
|
+
export { isMcpAppData } from "./schemas/mcp-app";
|
|
15
|
+
export type { McpAppArchive, McpAppContextState, McpAppContextUpdate, McpAppData, } from "./schemas/mcp-app";
|
|
14
16
|
export { SessionSetupError } from "./session/definition";
|
|
15
17
|
export type { SessionConfig, SessionDefinition, SessionSetupStage, SkillDefinition, TextFile, SolutionDefinition, } from "./session/definition";
|
|
16
18
|
export { createInitialSessionState, reconcileHistoricalUserTurns, reconcileOptimisticUserTurns, toReplaySnapshot, } from "./session/state";
|
|
17
19
|
export type { AskUserAnswerData, AgentLoopInfo, ActiveCompactionState, ConnectionStatus, ReplaySnapshot, SessionState, } from "./session/state";
|
|
20
|
+
export { EMPTY_SESSION_QUEUE, canCancelQueuedMessage, canDeliverQueuedMessage, canEditQueuedMessage, isSessionQueueSnapshot, parseQueueAck, queuePauseReasonLabel, queuedMessageStatusLabel, shouldApplySnapshot, } from "./session/queue";
|
|
21
|
+
export type { QueueAck, QueueOperationResult, QueuedMessage, QueuedMessageStatus, SessionQueueSnapshot, } from "./session/queue";
|
|
18
22
|
export { connectEmbedded } from "./commands/embedded";
|
|
19
23
|
export type { EmbeddedChat, EmbeddedChatOptions } from "./commands/embedded";
|
|
20
24
|
export type { CommandHandler } from "./commands/registry";
|
|
@@ -29,8 +33,10 @@ export { ModelsResource } from "./resources/models";
|
|
|
29
33
|
export type { ModelCatalog, ModelOption } from "./resources/models";
|
|
30
34
|
export type { SessionsResource } from "./resources/sessions";
|
|
31
35
|
export type { SessionPlugin, SessionPluginActivation } from "./resources/sessions";
|
|
36
|
+
export type { SessionPluginConfigError, SessionPluginConfigSet, SessionPluginConfigState, SessionPluginConfigStateName, SessionPluginConfigSummary, SessionPluginConfigUpdate, } from "./resources/sessions";
|
|
32
37
|
export { ChatProjectsResource } from "./resources/chat-projects";
|
|
33
38
|
export type { ChatProject } from "./resources/chat-projects";
|
|
39
|
+
export type { SiteVisitsResource, SiteVisitsSummary } from "./resources/site-visits";
|
|
34
40
|
export { hasChatRunEvent } from "./shared/projection";
|
|
35
41
|
export type { CreateSessionRequest, AppCliAttachment, AppCliDefinition, FileEntry, ImportSessionOptions, PaginatedSessionsResult, GlobalSearchConversationResult, GlobalSearchFileResult, GlobalSearchResult, GlobalSearchResultItem, ResultFeedback, ResultFeedbackReason, HistoricalCommand, SessionContextStats, SessionHistory, SessionTurnsPage, ShareLinkResult, UploadFileEntry, UploadFilesOptions, } from "./resources/sessions";
|
|
36
42
|
export type { ArchivedFileInfo, ArchivedToolCallInfo, ChatMessage, CompactionInfo, FileContentPart, ImageUrlContentPart, MemoryRefInfo, MessageContent, MessageContentPart, TextContentPart, ToolBridgeContent, ToolCallInfo, } from "./schemas/message";
|
|
@@ -40,6 +46,8 @@ export type { ContextAction, ContextDisplayState, ContextGroupDisplayState, Cont
|
|
|
40
46
|
export type { ParsedTextAttachment, ParsedTextContext, SkillMentionAvailability, } from "./schemas/message-utils";
|
|
41
47
|
export type { ContentBlock, FinalArtifact, MemoryRef, PatchEnvelope, PostChatFollowup, TurnProjection, } from "./schemas/projection";
|
|
42
48
|
export { latestPostChatFollowup } from "./schemas/projection-utils";
|
|
49
|
+
export { buildToolUiCardKey, collectInlineToolUiCards, collectPreviewToolUiCards, isAppDevToolUiCard, isInternalStatusToolUiCard, isToolUiCard, resolveToolUiCardContent, } from "./shared/tool-ui-card";
|
|
50
|
+
export type { InlineToolUiCardEntry, PreviewToolUiCardEntry, ToolUiCard, ToolUiCardContentType, } from "./shared/tool-ui-card";
|
|
43
51
|
export { prependOlder, replaceWindow } from "./session/history-page";
|
|
44
52
|
export type { LiveRevisionState } from "./session/history-page";
|
|
45
53
|
export { DEFAULT_REPLAY_SPEED } from "./schemas/session";
|