@blade-hq/agent-client 2612.0.0-beta.31 → 2612.0.0-beta.33
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 +15 -0
- package/dist/blade-client.d.ts +2 -0
- package/dist/{chunk-UNMBNWLF.js → chunk-WZOHGJUO.js} +112 -3
- package/dist/chunk-WZOHGJUO.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -1
- package/dist/internal.d.ts +3 -0
- package/dist/internal.js +5 -1
- package/dist/internal.js.map +1 -1
- package/dist/resources/connectors.d.ts +89 -0
- package/dist/resources/plugins.d.ts +1 -0
- package/package.json +1 -1
- package/public-api.md +64 -1
- package/dist/chunk-UNMBNWLF.js.map +0 -1
package/README.md
CHANGED
|
@@ -727,6 +727,12 @@ chat.renderers = {
|
|
|
727
727
|
|
|
728
728
|
挂载节点位于 `<blade-chat>` 元素自己的子节点里(通过 `<slot>` 显示在对应位置),所以页面上的普通样式对它生效。可定制的区块与数据形状见 `BladeChatMountRenderers`(`toolCall`、`userMessage`、`assistantText`);相关类型:`MountRenderer`、`MountRendererObject`、`MountResult`、`MountHandle`。Vue 项目用 `@blade-hq/agent-vue` 的 `defineMountRenderer` 直接包装 Vue 组件。
|
|
729
729
|
|
|
730
|
+
## 账号连接器
|
|
731
|
+
|
|
732
|
+
`client.connectors.list()` 列出当前用户沙盒中创建的连接器及随项目发布的内置连接器,来源分别为 `personal`、`builtin`,无需商店安装;`listForSession(sessionId)` 同时返回当前对话的启用状态。`read(name)` 获取认证表单与连接状态;`connect(name, update)` 保存个人配置并执行真实认证;`verify(name)` 验证已有连接;`disconnect(name)` 清除该连接和个人配置。每用户每连接器只有一个连接,修改账号更新原连接;密码与私有状态不通过读取接口返回。认证通过后,用 `sessions.setSessionPluginActivation(sessionId, name, true)` 在沙盒对话中启用;包内容变化后需要重新连接。
|
|
733
|
+
|
|
734
|
+
相关类型:`ConnectorsResource`、`AccountConnector`、`ConnectorConnection`、`ConnectorConnectionView`。
|
|
735
|
+
|
|
730
736
|
## 第一方内部入口
|
|
731
737
|
|
|
732
738
|
`@blade-hq/agent-client/internal` 是内置 Web、浏览器插件与 `@blade-hq/agent-react` 共用的内部件(状态机细节、判定逻辑、低层通道)。它随包发布,但**不属于公开面**:不写进本文档与 `public-api.md`,版本之间可以随时改动或删除。接入方只用主入口。
|
|
@@ -863,6 +869,11 @@ await session.sendPrepared(request)
|
|
|
863
869
|
|
|
864
870
|
每条消息最多 20 份资料,ID 不重复,每份正文最多 64000 个 Unicode 字符,整个资料 JSON 最多 256 KiB,超限拒绝。文件沿用指定会话的鉴权与路径解析,不接受外部 URL;仅有 `name` 的文件显示不可用。带资料的可靠消息作为独立一轮排队,不能走只传正文的「立即补充」。原生智能体目前不支持此通道。
|
|
865
871
|
|
|
872
|
+
## 连接器管理
|
|
873
|
+
|
|
874
|
+
`ConnectorDraft` 描述连接器名称、说明、可选地址和访问密钥。`client.connectors.list()` 读取本人可用的内置与个人连接器,`create({ display_name, description, url, bearer_token? })` 保存已有 Streamable HTTP MCP 服务。`update(name, draft)` 修改个人连接器信息或地址,`delete(name)` 删除个人包并撤销连接配置;内置包不允许编辑或删除。访问密钥经当前身份的请求体发送并由服务端加密保存,不回传明文。保存后通过 `read` / `connect` 的现有配置流程连接;修改包后需要重新连接。
|
|
875
|
+
|
|
876
|
+
|
|
866
877
|
## 后端应用共享连接
|
|
867
878
|
|
|
868
879
|
PA 等后端服务使用 `BladeApplicationClient`,全部用户共享两条按需建立的 WebSocket。
|
|
@@ -898,3 +909,7 @@ session.send("请处理新增工作", {
|
|
|
898
909
|
],
|
|
899
910
|
})
|
|
900
911
|
```
|
|
912
|
+
|
|
913
|
+
### 创建或修改连接器
|
|
914
|
+
|
|
915
|
+
`client.connectors.startGeneration({ connector?, onCreated?, initiator? })` 统一创建生成会话并发送带技能引用的可见消息,返回 `{ session_id, sent }`。`connector` 传已有连接器的名称与展示名表示修改;`onCreated` 仅用于宿主登记缓存、导航。`initiator` 默认 `sdk`,内置 Web 使用 `ui`,保留历史列表和通知语义。选定连接器的名称与展示名通过标准 Context 附件传递,用户消息保持固定,包内文字不会被提升成用户指令。SDK 在发送前调用回调,并释放自身的会话引用。生成结束仍需用户到设置里的连接器正式连接。
|
package/dist/blade-client.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { ComputersResource } from "./resources/computers";
|
|
|
9
9
|
import { ModelsResource } from "./resources/models";
|
|
10
10
|
import { SessionsResource } from "./resources/sessions";
|
|
11
11
|
import { PluginsResource } from "./resources/plugins";
|
|
12
|
+
import { ConnectorsResource } from "./resources/connectors";
|
|
12
13
|
import { ChatGroupsResource } from "./resources/chat-groups";
|
|
13
14
|
import { SiteVisitsResource } from "./resources/site-visits";
|
|
14
15
|
import { SessionHub } from "./session/hub";
|
|
@@ -56,6 +57,7 @@ export declare class BladeClient {
|
|
|
56
57
|
readonly sessions: SessionsResource;
|
|
57
58
|
/** 按用户读取的插件目录与图标;没有会话时也能用。 */
|
|
58
59
|
readonly plugins: PluginsResource;
|
|
60
|
+
readonly connectors: ConnectorsResource;
|
|
59
61
|
readonly chatGroups: ChatGroupsResource;
|
|
60
62
|
/**
|
|
61
63
|
* 全站访问统计:匿名读写,不带 bearer 也不触发登录刷新。
|
|
@@ -224,7 +224,7 @@ var ToolProvider = class {
|
|
|
224
224
|
|
|
225
225
|
// src/version.ts
|
|
226
226
|
var SDK_NAME = "agent-client";
|
|
227
|
-
var SDK_VERSION = true ? "2612.0.0-beta.
|
|
227
|
+
var SDK_VERSION = true ? "2612.0.0-beta.33" : "1.1.1";
|
|
228
228
|
|
|
229
229
|
// src/auth-login.ts
|
|
230
230
|
function isAuthCallbackMessage(value) {
|
|
@@ -3269,6 +3269,110 @@ var ModelsResource = class {
|
|
|
3269
3269
|
}
|
|
3270
3270
|
};
|
|
3271
3271
|
|
|
3272
|
+
// src/resources/connectors.ts
|
|
3273
|
+
function isLocalConnectorName(name) {
|
|
3274
|
+
return name.startsWith("connector.personal.") || name.startsWith("connector.builtin.");
|
|
3275
|
+
}
|
|
3276
|
+
var ConnectorsResource = class {
|
|
3277
|
+
constructor(client) {
|
|
3278
|
+
this.client = client;
|
|
3279
|
+
}
|
|
3280
|
+
client;
|
|
3281
|
+
create(draft) {
|
|
3282
|
+
return this.client.json("POST", "/api/connectors", draft);
|
|
3283
|
+
}
|
|
3284
|
+
update(name, draft) {
|
|
3285
|
+
return this.client.json("PATCH", `/api/connectors/${encodeURIComponent(name)}`, draft);
|
|
3286
|
+
}
|
|
3287
|
+
delete(name) {
|
|
3288
|
+
return this.client.json("DELETE", `/api/connectors/${encodeURIComponent(name)}`);
|
|
3289
|
+
}
|
|
3290
|
+
/** Create a generation conversation and send its visible Skill request.
|
|
3291
|
+
* Hosts use onCreated only to register caches and navigate before sending. */
|
|
3292
|
+
async startGeneration({ connector, onCreated, initiator = "sdk" } = {}) {
|
|
3293
|
+
const intent = connector ? "\u4FEE\u6539\u8FDE\u63A5\u5668" : "\u521B\u5EFA\u8FDE\u63A5\u5668";
|
|
3294
|
+
const request = connector ? "\u4FEE\u6539\u9009\u5B9A\u7684\u8FDE\u63A5\u5668" : "\u521B\u5EFA\u8FDE\u63A5\u5668";
|
|
3295
|
+
const { session_id } = await this.client.sessions.createSessionWithRequest({ intent, solution_id: "connector_generate", initiator });
|
|
3296
|
+
await onCreated?.({ session_id, intent });
|
|
3297
|
+
const session = await this.client.sessions.connect(session_id);
|
|
3298
|
+
try {
|
|
3299
|
+
const sent = await session.send(`\u8BF7\u4F7F\u7528\u8FDE\u63A5\u5668\u751F\u6210\u5668\uFF0C\u5E2E\u6211${request}\u3002\u5148\u786E\u8BA4\u6211\u5E0C\u671B\u8FDE\u63A5\u7684\u7CFB\u7EDF\u548C\u9700\u8981\u7684\u529F\u80FD\uFF0C\u518D\u6309\u6280\u80FD\u5F15\u5BFC\u6211\u5B8C\u6210\u3002`, {
|
|
3300
|
+
mode: "executing",
|
|
3301
|
+
refs: [{ provider: "skill", id: "generate-connector", label: "\u8FDE\u63A5\u5668\u751F\u6210\u5668" }],
|
|
3302
|
+
...connector ? { contextAttachments: [{
|
|
3303
|
+
id: "connector-generation-target",
|
|
3304
|
+
label: "\u9009\u5B9A\u7684\u8FDE\u63A5\u5668",
|
|
3305
|
+
content: JSON.stringify({ name: connector.name, display_name: connector.display_name }),
|
|
3306
|
+
update_format: "snapshot"
|
|
3307
|
+
}] } : {}
|
|
3308
|
+
});
|
|
3309
|
+
return { session_id, sent };
|
|
3310
|
+
} finally {
|
|
3311
|
+
session.dispose();
|
|
3312
|
+
}
|
|
3313
|
+
}
|
|
3314
|
+
list(init) {
|
|
3315
|
+
return this.client.jsonFromInit("/api/connectors", init);
|
|
3316
|
+
}
|
|
3317
|
+
listForSession(sessionId, init) {
|
|
3318
|
+
return this.client.jsonFromInit(`/api/connectors?session_id=${encodeURIComponent(sessionId)}`, init);
|
|
3319
|
+
}
|
|
3320
|
+
read(name, init) {
|
|
3321
|
+
return this.client.jsonFromInit(`/api/connectors/${encodeURIComponent(name)}/connection`, init);
|
|
3322
|
+
}
|
|
3323
|
+
connect(name, update, init) {
|
|
3324
|
+
return this.client.jsonFromInit(`/api/connectors/${encodeURIComponent(name)}/connection`, {
|
|
3325
|
+
method: "PUT",
|
|
3326
|
+
body: JSON.stringify(update),
|
|
3327
|
+
...init
|
|
3328
|
+
});
|
|
3329
|
+
}
|
|
3330
|
+
browserAuthorizationUrl(name) {
|
|
3331
|
+
return new URL(`connector-auth/${encodeURIComponent(name)}`, `${this.client.options.baseUrl.replace(/\/$/, "")}/`).toString();
|
|
3332
|
+
}
|
|
3333
|
+
/** One-use, one-minute identity handoff to this client's trusted Blade origin.
|
|
3334
|
+
* Tokens travel only through a source/origin-bound message, never a URL/storage. */
|
|
3335
|
+
bindBrowserAuthorizationFrame(frame, name) {
|
|
3336
|
+
const nonce = Array.from(crypto.getRandomValues(new Uint8Array(32)), (value) => value.toString(16).padStart(2, "0")).join("");
|
|
3337
|
+
const url = new URL(this.browserAuthorizationUrl(name), window.location.href);
|
|
3338
|
+
url.searchParams.set("embedded", "1");
|
|
3339
|
+
url.searchParams.set("handoff", nonce);
|
|
3340
|
+
url.searchParams.set("parent_origin", window.location.origin);
|
|
3341
|
+
const receive = (event) => {
|
|
3342
|
+
if (event.origin !== url.origin || event.source !== frame.contentWindow || event.data?.type !== "blade:connector-auth-ready" || event.data?.nonce !== nonce) return;
|
|
3343
|
+
cleanup();
|
|
3344
|
+
frame.contentWindow?.postMessage({ type: "blade:connector-auth-identity", nonce, token: this.client.token }, url.origin);
|
|
3345
|
+
};
|
|
3346
|
+
const timeout = window.setTimeout(() => cleanup(), 6e4);
|
|
3347
|
+
const cleanup = () => {
|
|
3348
|
+
window.clearTimeout(timeout);
|
|
3349
|
+
window.removeEventListener("message", receive);
|
|
3350
|
+
};
|
|
3351
|
+
window.addEventListener("message", receive);
|
|
3352
|
+
frame.src = url.toString();
|
|
3353
|
+
return cleanup;
|
|
3354
|
+
}
|
|
3355
|
+
async startBrowserAuthorization(name, sessionId) {
|
|
3356
|
+
const view = await this.read(name);
|
|
3357
|
+
if (view.authorization?.type !== "browser") throw new Error("\u8BE5\u8FDE\u63A5\u5668\u6CA1\u6709\u7F51\u9875\u767B\u5F55\u5165\u53E3");
|
|
3358
|
+
const id = sessionId ?? (await this.client.sessions.createSessionWithRequest({
|
|
3359
|
+
intent: `\u8FDE\u63A5 ${view.display_name || "\u4E1A\u52A1\u7CFB\u7EDF"}`,
|
|
3360
|
+
memory_enabled: false
|
|
3361
|
+
})).session_id;
|
|
3362
|
+
await this.client.json("POST", `/api/sessions/${encodeURIComponent(id)}/browser/wake`, {});
|
|
3363
|
+
const tabs = await this.client.json("GET", `/api/sessions/${encodeURIComponent(id)}/browser/tabs`);
|
|
3364
|
+
const hasBusinessTab = tabs.data?.some(({ url }) => url && url !== "about:blank" && !/^http:\/\/(?:127\.0\.0\.1|localhost):9223\/home(?:[/?#]|$)/.test(url));
|
|
3365
|
+
if (!sessionId || !hasBusinessTab) await this.client.json("POST", `/api/sessions/${encodeURIComponent(id)}/browser/tabs`, { url: view.authorization.url });
|
|
3366
|
+
return { session_id: id, view };
|
|
3367
|
+
}
|
|
3368
|
+
verify(name) {
|
|
3369
|
+
return this.client.json("POST", `/api/connectors/${encodeURIComponent(name)}/connection:verify`);
|
|
3370
|
+
}
|
|
3371
|
+
disconnect(name) {
|
|
3372
|
+
return this.client.json("DELETE", `/api/connectors/${encodeURIComponent(name)}/connection`);
|
|
3373
|
+
}
|
|
3374
|
+
};
|
|
3375
|
+
|
|
3272
3376
|
// src/schemas/session.ts
|
|
3273
3377
|
import { type } from "arktype";
|
|
3274
3378
|
var SessionStatus = type(
|
|
@@ -3433,7 +3537,8 @@ var SessionsResource = class {
|
|
|
3433
3537
|
return this.client.jsonFromInit(`/api/sessions/${encodeURIComponent(sessionId)}/plugins`, init);
|
|
3434
3538
|
}
|
|
3435
3539
|
setSessionPluginActivation(sessionId, name, active, init) {
|
|
3436
|
-
|
|
3540
|
+
const kind = isLocalConnectorName(name) ? "connectors" : "plugins";
|
|
3541
|
+
return this.client.jsonFromInit(`/api/sessions/${encodeURIComponent(sessionId)}/${kind}/${encodeURIComponent(name)}:activation`, { method: "POST", body: JSON.stringify({ active }), ...init });
|
|
3437
3542
|
}
|
|
3438
3543
|
/**
|
|
3439
3544
|
* Fetch a plugin's package-local icon as bytes.
|
|
@@ -7891,6 +7996,7 @@ var BladeClient = class _BladeClient {
|
|
|
7891
7996
|
sessions;
|
|
7892
7997
|
/** 按用户读取的插件目录与图标;没有会话时也能用。 */
|
|
7893
7998
|
plugins;
|
|
7999
|
+
connectors;
|
|
7894
8000
|
chatGroups;
|
|
7895
8001
|
/**
|
|
7896
8002
|
* 全站访问统计:匿名读写,不带 bearer 也不触发登录刷新。
|
|
@@ -7914,6 +8020,7 @@ var BladeClient = class _BladeClient {
|
|
|
7914
8020
|
this.models = new ModelsResource(this);
|
|
7915
8021
|
this.sessions = new SessionsResource(this);
|
|
7916
8022
|
this.plugins = new PluginsResource(this);
|
|
8023
|
+
this.connectors = new ConnectorsResource(this);
|
|
7917
8024
|
this.chatGroups = new ChatGroupsResource(this);
|
|
7918
8025
|
this.siteVisits = new SiteVisitsResource(this);
|
|
7919
8026
|
this.hub = new SessionHub(this);
|
|
@@ -8950,6 +9057,8 @@ export {
|
|
|
8950
9057
|
sortComputers,
|
|
8951
9058
|
ComputersResource,
|
|
8952
9059
|
ModelsResource,
|
|
9060
|
+
isLocalConnectorName,
|
|
9061
|
+
ConnectorsResource,
|
|
8953
9062
|
SessionStatus,
|
|
8954
9063
|
DEFAULT_REPLAY_SPEED,
|
|
8955
9064
|
SessionInfo,
|
|
@@ -9006,4 +9115,4 @@ export {
|
|
|
9006
9115
|
BladeClient,
|
|
9007
9116
|
BladeApplicationClient
|
|
9008
9117
|
};
|
|
9009
|
-
//# sourceMappingURL=chunk-
|
|
9118
|
+
//# sourceMappingURL=chunk-WZOHGJUO.js.map
|