@blade-hq/agent-client 2612.0.0-beta.27 → 2612.0.0-beta.29
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 +37 -1
- package/dist/application-client.d.ts +19 -0
- package/dist/blade-client.d.ts +3 -8
- package/dist/{chunk-TQGO5CNX.js → chunk-IQ7YLS24.js} +614 -171
- package/dist/chunk-IQ7YLS24.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/internal.js +3 -1
- package/dist/internal.js.map +1 -1
- package/dist/schemas/context-attachments.d.ts +2 -0
- package/dist/session/agent-session.d.ts +1 -83
- package/dist/session/hub.d.ts +0 -24
- package/dist/shared/projection/builder.d.ts +0 -2
- package/dist/types/socket-events.d.ts +4 -0
- package/dist/version.d.ts +0 -1
- package/package.json +1 -1
- package/public-api.md +11 -1
- package/dist/chunk-TQGO5CNX.js.map +0 -1
package/README.md
CHANGED
|
@@ -534,7 +534,7 @@ await chat.attachApp({
|
|
|
534
534
|
})
|
|
535
535
|
```
|
|
536
536
|
|
|
537
|
-
`getContext`
|
|
537
|
+
`getContext` 在启动新一轮的 `send()` 前执行一次;运行中的引导和排队消息沿用当前运行的应用上下文,不重复采集。上下文适合承载路由、当前选中对象等轻量页面状态,不做响应式依赖追踪。完整业务数据由开发者自己的 CLI 查询。`command` 是智能体在 Bash 中直接执行的命令名,不会套在 `blade` 命令下。
|
|
538
538
|
|
|
539
539
|
`runtime: "python"` 使用沙盒系统 Python 运行单文件脚本;`runtime: "executable"` 接受能在 Linux 沙盒运行的可执行文件。`source` 可传 `Blob`、`File` 或浏览器可读取的 URL。应用 CLI 安装成功后随会话工作区保留;运行时可通过 `BLADE_APP_CONTEXT_FILE` 读取同一份页面上下文 JSON。
|
|
540
540
|
|
|
@@ -861,3 +861,39 @@ await session.sendPrepared(request)
|
|
|
861
861
|
```
|
|
862
862
|
|
|
863
863
|
每条消息最多 20 份资料,ID 不重复,每份正文最多 64000 个 Unicode 字符,整个资料 JSON 最多 256 KiB,超限拒绝。文件沿用指定会话的鉴权与路径解析,不接受外部 URL;仅有 `name` 的文件显示不可用。带资料的可靠消息作为独立一轮排队,不能走只传正文的「立即补充」。原生智能体目前不支持此通道。
|
|
864
|
+
|
|
865
|
+
## 后端应用共享连接
|
|
866
|
+
|
|
867
|
+
PA 等后端服务使用 `BladeApplicationClient`,全部用户共享两条按需建立的 WebSocket。
|
|
868
|
+
每个用户仍使用自己的 bearer token;REST 请求和会话权限按用户隔离。
|
|
869
|
+
|
|
870
|
+
```ts
|
|
871
|
+
const application = new BladeApplicationClient({ baseUrl: "http://ba:8020" })
|
|
872
|
+
const client = application.forUser(userId, { token: userToken })
|
|
873
|
+
const session = await client.hub.connect(sessionId)
|
|
874
|
+
// 服务退出时释放全部通道
|
|
875
|
+
application.dispose()
|
|
876
|
+
```
|
|
877
|
+
|
|
878
|
+
`forUser` 缓存同一用户的客户端;凭据更新调用该客户端的 `setToken`,退出调用 `logoutToken`。
|
|
879
|
+
`connectionCount` 返回当前已建立的物理连接数。重连恢复订阅和工具注册,业务命令与工具动作不重放。
|
|
880
|
+
`ApplicationUserTransport` 是该客户端注入 `BladeClientOptions.applicationTransport` 的传输契约。
|
|
881
|
+
普通 `BladeClient` 继续使用原有 Socket.IO 和工具连接。
|
|
882
|
+
|
|
883
|
+
|
|
884
|
+
### 应用提供的文本 Context
|
|
885
|
+
|
|
886
|
+
`PreparedSendOptions.contextAttachments` 中的资料可声明 `update_format: "snapshot" | "diff"`。
|
|
887
|
+
声明后 `id` 是当前会话内稳定的来源标识,`content` 是完整文本状态(推荐 Markdown),
|
|
888
|
+
runner 将其作为独立 Context 投影:内容不变不再注入,`diff` 由 Projector 对完整状态计算,
|
|
889
|
+
可见基线丢失时补完整快照。调用者不要传预先计算的 patch。
|
|
890
|
+
不声明该字段时仍是原有的消息级附件快照。业务处理成功游标由应用自行维护,Context 注入不表示业务已提交。
|
|
891
|
+
|
|
892
|
+
```ts
|
|
893
|
+
session.send("请处理新增工作", {
|
|
894
|
+
contextAttachments: [
|
|
895
|
+
{ id: "work-directory", label: "工作目录", content: directoryMarkdown, update_format: "diff" },
|
|
896
|
+
{ id: "pending-work", label: "新增记录", content: pendingMarkdown, update_format: "snapshot" },
|
|
897
|
+
],
|
|
898
|
+
})
|
|
899
|
+
```
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { BladeClient, type BladeClientOptions } from "./blade-client";
|
|
2
|
+
import type { TypedSocket } from "./socket";
|
|
3
|
+
/** Transport selected by BladeApplicationClient; ordinary clients use Socket.IO. */
|
|
4
|
+
export interface ApplicationUserTransport {
|
|
5
|
+
socket(): TypedSocket;
|
|
6
|
+
provider(): WebSocket;
|
|
7
|
+
invalidate(): void;
|
|
8
|
+
}
|
|
9
|
+
/** Backend application: all users share two lazy WebSockets; REST keeps user credentials. */
|
|
10
|
+
export declare class BladeApplicationClient {
|
|
11
|
+
private readonly options;
|
|
12
|
+
private readonly channels;
|
|
13
|
+
private readonly clients;
|
|
14
|
+
private readonly applicationId;
|
|
15
|
+
constructor(options: Pick<BladeClientOptions, "baseUrl" | "fetchImpl">);
|
|
16
|
+
forUser(userId: string, options: Omit<BladeClientOptions, "baseUrl" | "applicationTransport" | "anonymousSessionId">): BladeClient;
|
|
17
|
+
get connectionCount(): number;
|
|
18
|
+
dispose(): void;
|
|
19
|
+
}
|
package/dist/blade-client.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ApplicationUserTransport } from "./application-client";
|
|
1
2
|
import { SandboxResource } from "./resources/sandbox";
|
|
2
3
|
import { ToolProvider, type ToolProviderOptions } from "./tool-provider";
|
|
3
4
|
import { type LoginOptions, type LoginResult, type TokenStorageMode } from "./auth-login";
|
|
@@ -33,6 +34,8 @@ export interface BladeClientOptions {
|
|
|
33
34
|
commandTransport?: (event: string, payload: Record<string, unknown>, send: () => Promise<Record<string, unknown>>, scope?: {
|
|
34
35
|
anonymousSessionId: string;
|
|
35
36
|
}) => Promise<Record<string, unknown>>;
|
|
37
|
+
/** Backend shared application transport, installed by BladeApplicationClient. */
|
|
38
|
+
applicationTransport?: ApplicationUserTransport;
|
|
36
39
|
fetchImpl?: typeof fetch;
|
|
37
40
|
onRefreshSuccess?: () => void | Promise<void>;
|
|
38
41
|
}
|
|
@@ -43,7 +46,6 @@ export declare class BladeClient {
|
|
|
43
46
|
private cookieLogoutPending;
|
|
44
47
|
private socketInstance;
|
|
45
48
|
private readonly socketReplacementListeners;
|
|
46
|
-
/** login() / setToken() 热挂载的令牌,优先级高于构造参数。 */
|
|
47
49
|
private runtimeToken;
|
|
48
50
|
readonly options: BladeClientOptions;
|
|
49
51
|
readonly sandbox: SandboxResource;
|
|
@@ -116,13 +118,6 @@ export declare class BladeClient {
|
|
|
116
118
|
private isSameBackendUrl;
|
|
117
119
|
private shouldRefreshFor401;
|
|
118
120
|
private hasExplicitBearerToken;
|
|
119
|
-
/**
|
|
120
|
-
* 等一次令牌刷新,但调用方中止请求时不再等下去。
|
|
121
|
-
*
|
|
122
|
-
* 刷新本身是共享的(`refreshPromise`,别的请求也在等它),这里只是让这次已被取消的
|
|
123
|
-
* 请求尽早结束——否则它会一直挂在调用方(定位)的串行队列里,用户改选的新目标要等到
|
|
124
|
-
* 刷新结束才轮得到。
|
|
125
|
-
*/
|
|
126
121
|
private tryRefreshUnlessAborted;
|
|
127
122
|
private tryRefresh;
|
|
128
123
|
private resolveTokenForUrl;
|