@qfei-design/make-ai-assistant 0.2.12 → 0.2.14

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.
Files changed (41) hide show
  1. package/PUBLIC_API.md +20 -20
  2. package/README.md +19 -13
  3. package/capabilities.json +2 -1
  4. package/dist/client-protocol.d.ts +24 -0
  5. package/dist/client-types.d.ts +420 -0
  6. package/dist/client.cjs +2 -0
  7. package/dist/client.d.ts +18 -0
  8. package/dist/client.mjs +1154 -0
  9. package/dist/conversation-BpmWa2VL.cjs +1 -0
  10. package/dist/conversation-DuqMadaQ.js +888 -0
  11. package/dist/conversation-management-DZROhXyK.js +229 -0
  12. package/dist/conversation-management-f1y0yRvt.cjs +1 -0
  13. package/dist/core/conversation-management.d.ts +15 -5
  14. package/dist/core/conversation.d.ts +6 -5
  15. package/dist/index.cjs +1 -1
  16. package/dist/index.mjs +4 -4
  17. package/dist/make-app.cjs +1 -1
  18. package/dist/make-app.d.ts +8 -69
  19. package/dist/make-app.mjs +236 -703
  20. package/dist/make-console.cjs +1 -1
  21. package/dist/make-console.mjs +1 -1
  22. package/dist/react/conversation-controls.d.ts +1 -1
  23. package/dist/react/make-ai-assistant.d.ts +1 -2
  24. package/dist/react/use-attachments.d.ts +3 -1
  25. package/dist/react/use-conversation-manager.d.ts +3 -2
  26. package/dist/react.cjs +62 -4
  27. package/dist/react.mjs +3268 -1794
  28. package/dist/sse.cjs +1 -1
  29. package/dist/sse.mjs +1 -1
  30. package/dist/styles.css +625 -137
  31. package/docs/backend-contract.md +3 -7
  32. package/docs/make-app-integration.md +23 -68
  33. package/examples/make-app/main.tsx +1 -1
  34. package/examples/make-app/transport.ts +36 -146
  35. package/package.ai.json +9 -6
  36. package/package.json +11 -3
  37. package/recipes.json +4 -3
  38. package/dist/conversation-CZfbgCXd.js +0 -1111
  39. package/dist/conversation-Cvh-IVRV.cjs +0 -1
  40. package/dist/make-app/protocol.d.ts +0 -27
  41. package/dist/make-app/stream.d.ts +0 -20
@@ -26,15 +26,11 @@ Console BFF 与 Make App Browser API 的认证和资源模型不同,不能只
26
26
  transport。平台包分别提供 `/make-console` 与 `/make-app` 两个入口,聊天 UI 与 Artifact
27
27
  模板保持共享。
28
28
 
29
- ## Make App 当前后端接入
29
+ ## Make App v1 后端接入
30
30
 
31
- Make App 通过 `/make-app` adapter 消费当前唯一契约。包提供 Chat 管理、历史、输入、输出、反馈、上传和原件的语义方法,实际 URL/身份与代理由宿主负责。完整接口映射与时序见 [接入说明](make-app-integration.md)。
31
+ Make App 使用固定 `/api/make/app/ai/v1`,18 项操作包含 capabilities、分页 Agent/Chat/历史、消息受理、SSE、快照、取消、反馈和上传/内容。浏览器 JSON 使用公开对象,内部 Context 仍使用 POST + X-Make-Target + code=200 信封。服务端和 SDK 完整约定见 [v1 规范](https://git.qtech.cn/make/agent-service/agent-design/-/tree/dev/docs/proposals/agent-public-api-v1);接入代码见 [Make App 集成](make-app-integration.md)。
32
32
 
33
- 宿主返回裸 JSON,204 没有 body,内容读取返回 Uint8Array。Chat title/pinned 修改和删除使用 expectedRevision;创建和反馈使用稳定 requestId;发送使用稳定 messageId。历史从数值 cursor 正向读取,列表使用独立不透明游标。
34
-
35
- SSE 使用 response.subscribed/state、output_item.added/output_text.delta/output_item.done、reset/snapshot 以及 completed/failed/cancelled。输出项身份与最终持久消息身份分离;生成完成后读历史对账,再提交反馈。快照覆盖已有视图;关闭订阅不会取消 Run,显式取消可能先返回 202,随后确认终态。
36
-
37
- 附件先完成分段上传,引用 ready 内容的长度/MIME/摘要后发送。模型媒体能力逐类验收,不能凭上传成功开放。当前 Make App 没有 Artifact 或重新生成的服务器语义,不发送未定义的 context/capabilities 扩展。
33
+ App Service 显式代理同版本路由、保留 HTTP 状态和 Make-AI-Api-Version / X-Request-ID / Retry-After;SSE 不缓冲,浏览器断开向下游传播 AbortSignal。认证依旧由正式 auth.api 和既有网关处理,不能把 SDK capabilities 当作授权。
38
34
 
39
35
  ## 通用标准接口能力
40
36
 
@@ -1,80 +1,35 @@
1
- # Make App 当前契约接入
1
+ # Make App v1 接入
2
2
 
3
- 本分支将现有 `/make-app` 入口原地接入当前个人多会话、反馈、附件和 item/part SSE 契约。没有协议版本选择,没有隐式定位单一会话,也不自动替宿主做登录。包版本发布号与业务协议无关。
3
+ 客户端入口为 `@qfei-design/make-ai-assistant/client`。App 宿主提供正式认证 HTTP 传输,标准客户端统一管理 18 项接口、固定 `/v1` 路径、响应解码、分页、重试、字节上传与 SSE。`/make-app` 把客户端结果映射到已有助手 UI 状态机。
4
4
 
5
- ## 宿主接线
5
+ ```ts
6
+ import { createMakeAgentClient } from "@qfei-design/make-ai-assistant/client";
7
+ import { createMakeAppAssistantTransport } from "@qfei-design/make-ai-assistant/make-app";
6
8
 
7
- `@qfei-design/make-ai-assistant/make-app` 导入 `createMakeAppAssistantTransport`,从 `/react` 导入 `MakeAiAssistant` 或 `AssistantPanel`。实现下面的语义回调;可复制 [宿主回调映射](../examples/make-app/transport.ts) 中的映射,替换为 POC 已有认证请求封装。所有 URL、Cookie 转发与服务端鉴权属于宿主。
9
+ const client = createMakeAgentClient({
10
+ apiVersion: "v1",
11
+ scope: { appKey, identityKey },
12
+ transport: authenticatedTransport,
13
+ });
14
+ const assistantTransport = await createMakeAppAssistantTransport({ client, agentId });
15
+ // 将 assistantTransport 传入 AssistantPanel / MakeAiAssistant。
16
+ // App、用户或租户改变时,取消旧连接并 client.dispose(),重新创建实例。
17
+ ```
8
18
 
9
- | 宿主回调 | 作用与结果 |
10
- |---|---|
11
- | resolveScope(context) | 返回明确的 appKey、agentId、identityKey;用户或租户变化时 identityKey 必须改变 |
12
- | listAgents | 产品内启用 Agent 数组的裸响应 |
13
- | createChat | requestId 幂等创建;返回 Chat |
14
- | listChats | 当前用户在产品/Agent 下的列表;返回 chats、nextCursor、hasMore |
15
- | getChat / updateChat / deleteChat | 详情、title/pinned 更新、软删除;更新/删除带 expectedRevision |
16
- | loadHistory | 指定 chatId 和数值 cursor;返回 messages、nextCursor、hasMore |
17
- | sendMessage | 稳定 messageId;text 或 parts 二选一;返回 chatId、responseId、acceptedCursor |
18
- | getResponse / cancelResponse | 权威快照、独立取消;取消可能返回仍 running 的快照与 cancelRequested=true |
19
- | setFeedback | 持久助手 messageId、requestId、like/dislike/none,以及可选 reason/comment |
20
- | startUpload / getUpload | 上传初始化与 completedParts 续传进度 |
21
- | uploadPart / completeUpload | 从 0 编号的二进制分段,全部完成后获取 ready 内容引用 |
22
- | readContent(可选) | 宿主具备无损二进制认证读取能力时返回原始 Uint8Array;未提供时不展示下载/预览操作 |
23
- | eventSourceFactory | 以 chatId、responseId、cursor 创建带凭据的 EventSource;包负责关闭与重连 |
19
+ `AuthenticatedTransport.request` 只执行一次已认证 I/O,返回 status、headers 和 AsyncIterable<Uint8Array>。`retryOwner: "sdk"` 由 SDK 按幂等语义做有限重试;`retryOwner: "transport"` 不叠加 SDK 重试。宿主沿正式 auth.api 处理登录、401/403 和 Cookie,SSE/二进制成功体不经过 JSON 或 text() 缓冲。SDK 不读取 Token、Cookie、LocalStorage 或 Provider key。
24
20
 
25
- JSON 回调返回服务端裸对象,204 返回 void,内容返回 Uint8Array。不要在所有响应上统一解包 data JSON.parse。每个异步回调都必须传递 AbortSignal。scopeKey 仅隔离浏览器内的状态,不能代替服务器授权。
21
+ 普通操作分组为 capabilities、agents、chats、messages、responses、feedback、uploads content。所有分页 cursor 都是不透明字符串;末页 nextCursor 为空串。不要把 Session 事件序号或 Redis ID 拼进公开 cursor。消息 messageId、Chat requestId、Feedback requestId 和 Upload fileId 来自用户的一次真实意图;重试使用同一个 ID 和字节,不重新生成。
26
22
 
27
- 会话查询和创建相互独立。`loadConversation(context,{threadId,cursor,signal})` 只恢复选中的会话,不隐式创建;UI 点击新建或首次主动发送才创建。公开返回的 `threadId` 对应 chatId,responseId 对应执行 Run。
23
+ SDK 忽略新增响应元数据,但验证已知字段及归属。未知可选 SSE 事件产生 kind=unknown;未知输出 part 产生安全占位类型,不能用于输入或自动执行业务动作。已知字段损坏、跨 Response 帧和同一 cursor 已知语义字段冲突的重放均报 AI_PROTOCOL_ERROR。Response 的未知 status terminal 决定是否结束;snapshotRevision 阻止旧快照覆盖新状态。
28
24
 
29
- ## 包提供的交互
25
+ Chat.titlePending 缺失按 false;已知待摘要会话每秒通过同一 client.chats.get 刷新,摘要完成即显示,与正文终态独立。取消只走 responses.cancel;关闭迭代器/组件只停止本地读取。
30
26
 
31
- 内置面板可列出、选择、新建会话,编辑标题、置顶/取消置顶、确认删除;改名/置顶/删除失败保留用户可见错误。修订冲突后读取最新详情,不自动换 revision 覆盖。
27
+ capabilities 返回可选 feature、当前 modelInputKinds 和 limits。适配器在创建时读取能力,UI 只开启双方已实现的功能;上传可用不代表模型能理解图片。能力发现不替代后端每次授权。未知上传状态停止上传并显示可恢复错误,不无限发分片。
32
28
 
33
- 输入和重试保存稳定 UUID。多个输入可能对应同一 responseId;面板控制器在响应维度保持一个订阅,关闭面板继续保留当前 UI,切会话/身份或卸载只释放本地连接。停止按钮调用 cancelResponse,并等待终态;完成与取消竞争时接受服务端最终结果。
29
+ 接口规范:[v1 OpenAPI SSE](https://git.qtech.cn/make/agent-service/agent-design/-/tree/dev/docs/proposals/agent-public-api-v1)。当前调试接口原地收敛,不提供旧无版本路径或旧语义回调适配。
34
30
 
35
- 输出按 itemId/partId 归并,完整 done 文本覆盖增量。中间模型活动放在过程区域,不能充当最终可反馈消息。response.completed 后读取历史对账,切换到持久助手 messageId,再开放反馈。点踩说明提交失败保留表单,重新提交复用未知结果的原意图;撤销用 rating=none
31
+ 验证:`pnpm test`、`pnpm typecheck`、`pnpm build`、`pnpm ci:check`;本地 HTTP 和发布后 Dev 验收覆盖多会话、标题、断流恢复、取消、条件修订、未知响应与附件字节。发布统一使用 GitLab CI
36
32
 
37
- 文件选择、拖拽和粘贴共用一个“上传文件或图片”入口和上传队列;前端不按 `modelInputKinds` 过滤或拒绝媒体类型。分段大小读 partSize,重试先查 completedParts,未 ready 的附件不能发送;服务端根据消息 parts 和实际模型能力决定是否接受。暂停/移除只影响本地任务和草稿,当前没有远程上传取消接口。提供 `readContent` 时,附件卡片可鉴权下载和受控预览;未提供时仅展示附件元数据,不执行 HTML/SVG/脚本。
33
+ chat.management 只控制改名、置顶和删除;缺失该可选 feature 时仍可创建、选择和读取会话。缺失 attachments.read 时不提供下载入口。
38
34
 
39
- ## 流式事件与恢复
40
-
41
- 公开流消费 `response.subscribed/state/output_item.added/output_text.delta/output_item.done/reset/snapshot/completed/failed/cancelled`。这些事件在 adapter 转换为 headless 的响应事件,不复用通用 SSE 的消息身份来猜最终答案。
42
-
43
- 公开 `AssistantEvent` 增加:
44
-
45
- - response.accepted:输入受理与 responseId 关联。
46
- - response.state、response.output_item.added、response.output_text.delta、response.output_item.done:运行状态和项级输出。
47
- - response.snapshot:覆盖该响应已确认的输出视图。
48
- - response.reconciled:持久消息对账。
49
- - response.terminal:completed/failed/cancelled 终态。
50
-
51
- `AssistantConversationState.responses` 保存各响应状态,activeRunId 只是当前活动响应的便利字段,不是唯一运行事实。终态后迟到增量不能重新打开响应。原有通用 SSE、Console、Mock 与 Artifact 公共入口仍各自归一化到同一 headless 合同。
52
-
53
- EventSource.onerror 后先关闭旧实例,再由 adapter 从最后处理游标有界重连;不要同时设置第二套宿主重连循环。query cursor 优先于 Last-Event-ID。reset 后消费服务器快照;通道连续失败时切到权威快照。快照没有完整在途 token,也没有可直接切回 Redis 的水位,不能将任意旧 delta 追加到快照。
54
-
55
- 完成对账失败会报告恢复错误,不能被重连逻辑吞掉。普通断网与 HTTP/SSE 读取失败都不等同于业务 Run 已取消。
56
-
57
- ## 限制与未开放能力
58
-
59
- | 事项 | 当前行为 |
60
- |---|---|
61
- | 输入 | 文本累计 8 KiB UTF-8;最多 32 个有序 parts;整体消息 JSON 64 KiB |
62
- | 上传 | 单文件 64 MiB,分段当前 1 MiB;服务端按完整 Namespace 限流/限容量 |
63
- | 历史 | cursor=-1 从最早事件正向扫描,limit 数底层事件;空可见页仍可 hasMore=true |
64
- | 长历史 | 分页继续加载,有界展示最近加载的 200 条/正文预算;不会声称首个窗口是全部历史 |
65
- | 模型媒体能力 | modelInputKinds 默认只有 text;前端仍提供统一上传入口,服务端按实际模型能力校验消息 parts |
66
- | 未完成上传 | 服务端当前 24 小时失效;无公开 abort/清理,容量不保证自动回收 |
67
- | 下载 | readContent 为可选能力;启用时返回 attachment/octet-stream,不承诺 Range/206,预览使用本地受控 Blob |
68
- | Artifact/页面上下文 | 通用能力保留;当前 Make App 请求不携带 context/capabilities,不从 Markdown 猜 Artifact |
69
- | 重新生成 | 没有服务端替换语义,保持关闭;普通再次提问属于新消息 |
70
-
71
- 后端模型媒体适配未启用时,内部 LLM 可能返回 unsupported_media;公开消息先受理为 202 后再以 AI_RUN_FAILED 终止。前端不能依赖消息 POST 直接返回 422。
72
-
73
- ## 后续 POC 接手
74
-
75
- 1. 对接现有统一登录和 Service,完成所有语义回调;认证过期、产品/Agent/用户切换都重新核对。
76
- 2. 由宿主决定当前选中会话的 URL/持久化导航、草稿体验、Agent 入口和主题布局。刷新后可从包的列表选择历史会话恢复。
77
- 3. 用真实宿主验证未缓冲 SSE、断网重连、取消、修订冲突、反馈回显和附件字节;本地示例不是已部署 POC。
78
- 4. 经接手人检查后,按现有 GitLab CI 发布 alpha,再升级 POC 依赖。当前用户要求只交 feature 分支,本轮不发包、不部署 Dev。
79
-
80
- 完整字段说明以 agent-design 的 MakeAppProtocol/OpenAPI 与接口手册为准;交接飞书文档同时提供 17 项 HTTP 清单、请求示例、分支和本地验收结果。
35
+ 发生游标重置或采用权威快照后,后续恢复继续读取有界快照直到终态,避免把没有共同游标的确认视图与旧增量混合。
@@ -14,7 +14,7 @@ if (
14
14
  )
15
15
  )
16
16
  throw new Error("缺少宿主产品、Agent 或身份配置");
17
- const transport = createHostTransport(config);
17
+ const transport = await createHostTransport(config);
18
18
  createRoot(document.getElementById("root")!).render(
19
19
  <StrictMode>
20
20
  <main className="example-shell">
@@ -1,8 +1,8 @@
1
+ import { createMakeAppAssistantTransport } from "@qfei-design/make-ai-assistant/make-app";
1
2
  import {
2
- createMakeAppAssistantTransport,
3
- type MakeAppAssistantEventSource,
4
- type MakeAppAssistantEventSourceEvent,
5
- } from "@qfei-design/make-ai-assistant/make-app";
3
+ createMakeAgentClient,
4
+ type AuthenticatedTransport,
5
+ } from "@qfei-design/make-ai-assistant/client";
6
6
  export interface Configuration {
7
7
  appKey: string;
8
8
  appName: string;
@@ -10,154 +10,44 @@ export interface Configuration {
10
10
  identityKey: string;
11
11
  }
12
12
 
13
+ /** 示例服务器负责正式认证;真实 App 传入已认证传输,不能复制 Token 到浏览器 SDK。 */
13
14
  export function createHostTransport(
14
15
  config: Configuration,
15
16
  fetcher: typeof fetch = fetch,
16
17
  ) {
17
- const prefix = "/api/make/app/ai";
18
- const id = encodeURIComponent;
19
- const query = (values: Record<string, string | number | undefined>) =>
20
- new URLSearchParams(
21
- Object.entries(values)
22
- .filter(
23
- (entry): entry is [string, string | number] => entry[1] !== undefined,
24
- )
25
- .map(([key, value]) => [key, String(value)]),
26
- ).toString();
27
- const request = async (
28
- path: string,
29
- init: RequestInit = {},
30
- binary = false,
31
- ) => {
32
- // 替换为 POC 已有的认证请求封装;本示例同样只访问宿主同源接口。
33
- const response = await fetcher(prefix + path, {
34
- credentials: "include",
35
- ...init,
36
- });
37
- if (!response.ok) {
38
- const body = await response.json().catch(() => ({}));
39
- throw Object.assign(new Error("请求未完成"), {
40
- status: response.status,
41
- code: body.code,
42
- });
43
- }
44
- if (response.status === 204) return undefined;
45
- return binary
46
- ? new Uint8Array(await response.arrayBuffer())
47
- : response.json();
48
- };
49
- const json = (
50
- method: string,
51
- body: unknown,
52
- signal?: AbortSignal,
53
- ): RequestInit => ({
54
- method,
55
- signal,
56
- headers: { "Content-Type": "application/json" },
57
- body: JSON.stringify(body),
58
- });
59
- return createMakeAppAssistantTransport({
60
- resolveScope: () => ({
61
- appKey: config.appKey,
62
- agentId: config.agentId,
63
- identityKey: config.identityKey,
64
- }),
65
- listAgents: (input, options) => request(`/agents?${query(input)}`, options),
66
- listChats: (input, options) => request(`/chats?${query(input)}`, options),
67
- createChat: (input, options) =>
68
- request("/chats", json("POST", input, options.signal)),
69
- getChat: ({ chatId }, options) => request(`/chats/${id(chatId)}`, options),
70
- updateChat: ({ chatId, ...body }, options) =>
71
- request(`/chats/${id(chatId)}`, json("PATCH", body, options.signal)),
72
- deleteChat: async ({ chatId, expectedRevision }, options) => {
73
- await request(`/chats/${id(chatId)}?${query({ expectedRevision })}`, {
74
- method: "DELETE",
75
- signal: options.signal,
18
+ const transport: AuthenticatedTransport = {
19
+ retryOwner: "sdk",
20
+ async request(request, options) {
21
+ const response = await fetcher(request.path, {
22
+ method: request.method,
23
+ headers: request.headers,
24
+ body: request.body ? new Uint8Array(request.body).buffer : undefined,
25
+ signal: options?.signal as AbortSignal | undefined,
26
+ credentials: "include",
76
27
  });
77
- },
78
- loadHistory: ({ chatId, ...page }, options) =>
79
- request(`/chats/${id(chatId)}/messages?${query(page)}`, options),
80
- sendMessage: ({ chatId, ...body }, options) =>
81
- request(
82
- `/chats/${id(chatId)}/messages`,
83
- json("POST", body, options.signal),
84
- ),
85
- getResponse: ({ chatId, responseId }, options) =>
86
- request(`/chats/${id(chatId)}/responses/${id(responseId)}`, options),
87
- cancelResponse: ({ chatId, responseId }, options) =>
88
- request(
89
- `/chats/${id(chatId)}/responses/${id(responseId)}/cancel`,
90
- json("POST", {}, options.signal),
91
- ),
92
- setFeedback: ({ chatId, messageId, ...body }, options) =>
93
- request(
94
- `/chats/${id(chatId)}/messages/${id(messageId)}/feedback`,
95
- json("PUT", body, options.signal),
96
- ),
97
- startUpload: ({ chatId, ...body }, options) =>
98
- request(
99
- `/chats/${id(chatId)}/uploads`,
100
- json("POST", body, options.signal),
101
- ),
102
- getUpload: ({ chatId, uploadId }, options) =>
103
- request(`/chats/${id(chatId)}/uploads/${id(uploadId)}`, options),
104
- uploadPart: async ({ chatId, uploadId, part, bytes }, options) => {
105
- await request(
106
- `/chats/${id(chatId)}/uploads/${id(uploadId)}/parts/${part}`,
107
- {
108
- method: "PUT",
109
- signal: options.signal,
110
- headers: { "Content-Type": "application/octet-stream" },
111
- body: new Uint8Array(bytes).buffer,
112
- },
113
- );
114
- },
115
- completeUpload: ({ chatId, uploadId }, options) =>
116
- request(
117
- `/chats/${id(chatId)}/uploads/${id(uploadId)}/complete`,
118
- json("POST", {}, options.signal),
119
- ),
120
- readContent: async ({ chatId, contentRef }, options) =>
121
- request(`/chats/${id(chatId)}/content/${id(contentRef)}`, options, true),
122
- eventSourceFactory: ({ chatId, responseId, cursor }, init) => {
123
- const source = new EventSource(
124
- `${prefix}/chats/${id(chatId)}/events?${query({ responseId, cursor })}`,
125
- init,
126
- );
127
- type Listener = (event: MakeAppAssistantEventSourceEvent) => void;
128
- const listeners = new Map<string, Map<Listener, EventListener>>();
129
- const wrapped: MakeAppAssistantEventSource = {
130
- get readyState() {
131
- return source.readyState;
132
- },
133
- onerror: null,
134
- addEventListener(type, listener) {
135
- const receive: EventListener = (event) => {
136
- const message = event as MessageEvent<unknown>;
137
- if (typeof message.data === "string")
138
- listener({
139
- data: message.data,
140
- lastEventId: message.lastEventId,
141
- });
142
- };
143
- const group = listeners.get(type) ?? new Map();
144
- group.set(listener, receive);
145
- listeners.set(type, group);
146
- source.addEventListener(type, receive);
147
- },
148
- removeEventListener(type, listener) {
149
- const receive = listeners.get(type)?.get(listener);
150
- if (receive) source.removeEventListener(type, receive);
151
- listeners.get(type)?.delete(listener);
152
- },
153
- close() {
154
- source.close();
155
- },
28
+ return {
29
+ status: response.status,
30
+ headers: Object.fromEntries(response.headers),
31
+ body: (async function* () {
32
+ const reader = response.body?.getReader();
33
+ if (!reader) return;
34
+ try {
35
+ while (true) {
36
+ const part = await reader.read();
37
+ if (part.done) return;
38
+ yield part.value;
39
+ }
40
+ } finally {
41
+ await reader.cancel().catch(() => undefined);
42
+ reader.releaseLock();
43
+ }
44
+ })(),
156
45
  };
157
- source.onerror = (event) => wrapped.onerror?.(event);
158
- return wrapped;
159
46
  },
160
- // 按实际模型验收开放类型;上传存储能力与模型理解能力独立。
161
- modelInputKinds: ["text"],
47
+ };
48
+ const client = createMakeAgentClient({
49
+ scope: { appKey: config.appKey, identityKey: config.identityKey },
50
+ transport,
162
51
  });
52
+ return createMakeAppAssistantTransport({ client, agentId: config.agentId });
163
53
  }
package/package.ai.json CHANGED
@@ -15,12 +15,13 @@
15
15
  "ssrSupported": true
16
16
  },
17
17
  "install": {
18
- "pnpm": "pnpm add @qfei-design/make-ai-assistant@^0.2.0",
19
- "npm": "npm install @qfei-design/make-ai-assistant@^0.2.0",
20
- "yarn": "yarn add @qfei-design/make-ai-assistant@^0.2.0"
18
+ "pnpm": "pnpm add --save-exact @qfei-design/make-ai-assistant@VERSION",
19
+ "npm": "npm install --save-exact @qfei-design/make-ai-assistant@VERSION",
20
+ "yarn": "yarn add --exact @qfei-design/make-ai-assistant@VERSION"
21
21
  },
22
22
  "exports": [
23
23
  "@qfei-design/make-ai-assistant",
24
+ "@qfei-design/make-ai-assistant/client",
24
25
  "@qfei-design/make-ai-assistant/react",
25
26
  "@qfei-design/make-ai-assistant/sse",
26
27
  "@qfei-design/make-ai-assistant/make-app",
@@ -33,7 +34,8 @@
33
34
  "readme": "README.md",
34
35
  "publicApi": "PUBLIC_API.md",
35
36
  "recipes": "recipes.json",
36
- "capabilities": "capabilities.json"
37
+ "capabilities": "capabilities.json",
38
+ "makeApp": "docs/make-app-integration.md"
37
39
  },
38
40
  "packageResponsibilities": [
39
41
  "Artifact V1 contracts and validation",
@@ -44,11 +46,12 @@
44
46
  "Template registration and capability negotiation",
45
47
  "Floating launcher, right drawer and embedded assistant panel",
46
48
  "Platform artifact templates",
47
- "Testing fixtures and mock transport"
49
+ "Testing fixtures and mock transport",
50
+ "Stable v1 client through an authenticated HTTP byte-stream transport"
48
51
  ],
49
52
  "hostResponsibilities": [
50
53
  "Current App and route context",
51
- "Authenticated semantic operations and EventSource boundary",
54
+ "Authenticated HTTP transport, explicit Agent and identity scope",
52
55
  "Service authentication and server-side authorization",
53
56
  "Safe action execution and route mapping",
54
57
  "Optional App-specific templates and theme variables"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qfei-design/make-ai-assistant",
3
- "version": "0.2.12",
3
+ "version": "0.2.14",
4
4
  "description": "Platform-wide Make AI Assistant contracts, React shell, and context-aware artifact templates.",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -44,7 +44,12 @@
44
44
  "types": "./dist/styles.css.d.ts",
45
45
  "default": "./dist/styles.css"
46
46
  },
47
- "./artifact-v1.schema.json": "./artifact-v1.schema.json"
47
+ "./artifact-v1.schema.json": "./artifact-v1.schema.json",
48
+ "./client": {
49
+ "types": "./dist/client.d.ts",
50
+ "import": "./dist/client.mjs",
51
+ "require": "./dist/client.cjs"
52
+ }
48
53
  },
49
54
  "files": [
50
55
  "dist",
@@ -129,5 +134,8 @@
129
134
  "engines": {
130
135
  "node": ">=22.12.0"
131
136
  },
132
- "packageManager": "pnpm@10.20.0+sha512.cf9998222162dd85864d0a8102e7892e7ba4ceadebbf5a31f9c2fce48dfce317a9c53b9f6464d1ef9042cba2e02ae02a9f7c143a2b438cd93c91840f0192b9dd"
137
+ "packageManager": "pnpm@10.20.0+sha512.cf9998222162dd85864d0a8102e7892e7ba4ceadebbf5a31f9c2fce48dfce317a9c53b9f6464d1ef9042cba2e02ae02a9f7c143a2b438cd93c91840f0192b9dd",
138
+ "dependencies": {
139
+ "@qfei-design/icons-react": "1.1.39"
140
+ }
133
141
  }
package/recipes.json CHANGED
@@ -49,12 +49,13 @@
49
49
  "id": "make-app-browser-api",
50
50
  "summary": "接入当前 Make App 多会话、反馈、类型化附件和 item/part SSE 合同。",
51
51
  "use": [
52
+ "@qfei-design/make-ai-assistant/client:createMakeAgentClient",
52
53
  "@qfei-design/make-ai-assistant/make-app:createMakeAppAssistantTransport"
53
54
  ],
54
55
  "hostProvides": [
55
- "明确 appKey/agentId/identityKey resolveScope",
56
- "17 项已认证语义回调及带凭据的 EventSource 工厂",
57
- "实际模型已验收的 modelInputKinds"
56
+ "固定 App/identityKey 与明确 Agent",
57
+ "正式 AuthenticatedTransport:单次 HTTP、响应状态/Headers 和字节流",
58
+ "App Service 的同版本 v1 受控路由与 AbortSignal 透传"
58
59
  ],
59
60
  "readNext": [
60
61
  "README.md",