@ai-setting/roy-agent-core 1.7.85 → 1.7.89
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/dist/config/index.js +7 -7
- package/dist/env/agent/agent-component.d.ts +1 -1
- package/dist/env/agent/agent-component.js +13 -12
- package/dist/env/agent/index.js +13 -12
- package/dist/env/agent/types.d.ts +14 -0
- package/dist/env/commands/index.js +7 -7
- package/dist/env/context/index.js +3 -3
- package/dist/env/debug/index.js +7 -7
- package/dist/env/error-reply.js +1 -1
- package/dist/env/event-source/event-source-handlers.d.ts +18 -2
- package/dist/env/event-source/event-source-handlers.js +26 -21
- package/dist/env/event-source/event-store.js +2 -2
- package/dist/env/event-source/index.js +25 -22
- package/dist/env/event-source/timer-handler.d.ts +98 -0
- package/dist/env/event-source/types.d.ts +53 -1
- package/dist/env/event-source/wecom-card-action-handler.d.ts +235 -3
- package/dist/env/event-source/wecom-card-builder.d.ts +207 -1
- package/dist/env/event-source/wecom-cli-handler.d.ts +25 -0
- package/dist/{shared/@ai-setting/roy-agent-core-vyr6svt6.js → env/event-source/wecom-respond-registry.js} +8 -6
- package/dist/env/event-source/wecom-session-card-sender.d.ts +135 -0
- package/dist/env/event-source/wecom-session-card-sender.js +153 -0
- package/dist/env/hook/index.js +5 -5
- package/dist/env/index.js +50 -45
- package/dist/env/llm/index.js +9 -8
- package/dist/env/log-trace/index.js +7 -7
- package/dist/env/log-trace/trace-filters.d.ts +6 -1
- package/dist/env/mcp/index.js +7 -7
- package/dist/env/memory/index.js +7 -7
- package/dist/env/plugin/index.js +7 -7
- package/dist/env/prompt/index.js +8 -8
- package/dist/env/prompt/prompts-index.d.ts +1 -1
- package/dist/env/session/group-session-link.d.ts +99 -0
- package/dist/env/session/index.js +11 -10
- package/dist/env/session/session-component.d.ts +89 -0
- package/dist/env/session/storage/index.js +5 -4
- package/dist/env/session/types.d.ts +10 -0
- package/dist/env/skill/index.js +7 -7
- package/dist/env/task/backend/index.d.ts +3 -0
- package/dist/env/task/backend/index.js +151 -3
- package/dist/env/task/backend/remote-task-port.d.ts +85 -0
- package/dist/env/task/backend/types.d.ts +5 -0
- package/dist/env/task/delegate/delegate-channel-hint.d.ts +39 -0
- package/dist/env/task/delegate/delegate-tool.d.ts +71 -6
- package/dist/env/task/delegate/delegate-tool.js +11 -9
- package/dist/env/task/delegate/index.js +8 -8
- package/dist/env/task/index.d.ts +1 -1
- package/dist/env/task/index.js +34 -18
- package/dist/env/task/mcp/index.js +4 -4
- package/dist/env/task/plugins/card-subject.d.ts +117 -0
- package/dist/env/task/plugins/index.js +19 -17
- package/dist/env/task/plugins/lark-card-action-handler.d.ts +261 -6
- package/dist/env/task/plugins/lark-card-patch-notifier.d.ts +501 -0
- package/dist/env/task/plugins/lark-card-patch-notifier.js +12 -2
- package/dist/env/task/plugins/lark-card-state-store.d.ts +60 -0
- package/dist/env/task/plugins/lark-cli-task-notify-plugin.d.ts +45 -0
- package/dist/env/task/plugins/sub-session-activity.d.ts +415 -0
- package/dist/env/task/plugins/wecom-session-card-store.d.ts +134 -0
- package/dist/env/task/plugins/wecom-session-card-store.js +23 -0
- package/dist/env/task/plugins/wecom-task-notify-plugin.d.ts +40 -0
- package/dist/env/task/storage/index.d.ts +1 -0
- package/dist/env/task/storage/index.js +24 -4
- package/dist/env/task/storage/migrations/006_add_task_owner.d.ts +24 -0
- package/dist/env/task/storage/remote-task-store.d.ts +186 -0
- package/dist/env/task/task-component.d.ts +7 -0
- package/dist/env/task/tools/index.js +4 -4
- package/dist/env/task/tools/task-types.d.ts +7 -0
- package/dist/env/task/types.d.ts +17 -0
- package/dist/env/tool/built-in/index.js +6 -4
- package/dist/env/tool/index.js +14 -10
- package/dist/env/tool/types.d.ts +25 -0
- package/dist/env/tool/validator.d.ts +8 -0
- package/dist/env/workflow/engine/index.js +12 -12
- package/dist/env/workflow/hooks/index.js +7 -7
- package/dist/env/workflow/index.js +24 -23
- package/dist/env/workflow/nodes/index.js +2 -2
- package/dist/env/workflow/plugins/index.js +10 -8
- package/dist/env/workflow/service/index.js +2 -2
- package/dist/env/workflow/storage/index.js +3 -3
- package/dist/env/workflow/tools/index.js +16 -15
- package/dist/env/workflow/utils/index.js +4 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.js +71 -60
- package/dist/shared/@ai-setting/{roy-agent-core-q813vafd.js → roy-agent-core-05z35shp.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-dc9zq75z.js → roy-agent-core-0crmsc12.js} +3 -3
- package/dist/shared/@ai-setting/{roy-agent-core-7dd0s3xb.js → roy-agent-core-0n1wwndq.js} +1027 -14
- package/dist/shared/@ai-setting/{roy-agent-core-cha0jc7n.js → roy-agent-core-0sbmdz8d.js} +137 -16
- package/dist/shared/@ai-setting/{roy-agent-core-87942bw4.js → roy-agent-core-1mhyh4c5.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-v6vr6za7.js → roy-agent-core-1vv4fx15.js} +4 -4
- package/dist/shared/@ai-setting/{roy-agent-core-nwbfepba.js → roy-agent-core-3e040tc5.js} +1 -1
- package/dist/shared/@ai-setting/roy-agent-core-418zc9ha.js +288 -0
- package/dist/shared/@ai-setting/{roy-agent-core-qk9hd89p.js → roy-agent-core-49qcpqwg.js} +54 -19
- package/dist/shared/@ai-setting/{roy-agent-core-xf6z96qy.js → roy-agent-core-4b38m749.js} +818 -346
- package/dist/shared/@ai-setting/{roy-agent-core-r5wt1h3c.js → roy-agent-core-4fkxy2gv.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-na18zwj0.js → roy-agent-core-4t3yskp8.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-d1n4jbza.js → roy-agent-core-5dhvfgaw.js} +5 -5
- package/dist/shared/@ai-setting/{roy-agent-core-5pr4zp88.js → roy-agent-core-5kzhaap1.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-qq96p0tj.js → roy-agent-core-5s2t8z00.js} +22 -1
- package/dist/shared/@ai-setting/{roy-agent-core-6rh8k6ba.js → roy-agent-core-6gj1hc5z.js} +7 -7
- package/dist/shared/@ai-setting/{roy-agent-core-g8htfwxj.js → roy-agent-core-7f10p7m2.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-h21gngxf.js → roy-agent-core-7yh5wps0.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-efkjyh69.js → roy-agent-core-9710zwwz.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-rykf7c04.js → roy-agent-core-9c565frx.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-vffccgf6.js → roy-agent-core-9cen1jvg.js} +18 -7
- package/dist/shared/@ai-setting/{roy-agent-core-fghc2m8z.js → roy-agent-core-aa8kv18f.js} +34 -2
- package/dist/shared/@ai-setting/roy-agent-core-age3qseb.js +177 -0
- package/dist/shared/@ai-setting/{roy-agent-core-7bpj859q.js → roy-agent-core-azyz78ky.js} +7 -7
- package/dist/shared/@ai-setting/{roy-agent-core-264qexac.js → roy-agent-core-b7h39vrc.js} +4 -4
- package/dist/shared/@ai-setting/{roy-agent-core-dqxec05w.js → roy-agent-core-bjtc9d35.js} +2 -2
- package/dist/shared/@ai-setting/roy-agent-core-c4ec7k0p.js +426 -0
- package/dist/shared/@ai-setting/{roy-agent-core-ddyk1rc0.js → roy-agent-core-cre2y2ct.js} +160 -4
- package/dist/shared/@ai-setting/{roy-agent-core-tr3ep81v.js → roy-agent-core-d6zdbgtc.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-0qyrk5k0.js → roy-agent-core-ds6qzmf8.js} +14 -5
- package/dist/shared/@ai-setting/{roy-agent-core-p6ks90tb.js → roy-agent-core-dvec4nn2.js} +6 -6
- package/dist/shared/@ai-setting/{roy-agent-core-cgtq6427.js → roy-agent-core-e08bvpaq.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-12n08pg5.js → roy-agent-core-e69qxdyy.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-xcp8vwax.js → roy-agent-core-fepm835e.js} +2 -2
- package/dist/shared/@ai-setting/{roy-agent-core-6j02sbee.js → roy-agent-core-fhg03v43.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-dvtg4sn0.js → roy-agent-core-g8yr733d.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-m3vjepzz.js → roy-agent-core-h1e1fm9b.js} +38 -202
- package/dist/shared/@ai-setting/{roy-agent-core-c2gbt68e.js → roy-agent-core-h83zdsrq.js} +2 -2
- package/dist/shared/@ai-setting/{roy-agent-core-tk98f92b.js → roy-agent-core-k3gcvybs.js} +2 -2
- package/dist/shared/@ai-setting/{roy-agent-core-b31v3qpv.js → roy-agent-core-k3h8t4q1.js} +992 -212
- package/dist/shared/@ai-setting/{roy-agent-core-pgvcf91v.js → roy-agent-core-m39v7qpx.js} +2 -2
- package/dist/shared/@ai-setting/{roy-agent-core-ezvpreqz.js → roy-agent-core-m66ysky0.js} +54 -6
- package/dist/shared/@ai-setting/{roy-agent-core-begm7ytz.js → roy-agent-core-m7d1t3db.js} +3 -3
- package/dist/shared/@ai-setting/{roy-agent-core-tm1mxttk.js → roy-agent-core-mf5p38yf.js} +2 -2
- package/dist/shared/@ai-setting/{roy-agent-core-83bewqx8.js → roy-agent-core-mvh0td7p.js} +2 -2
- package/dist/shared/@ai-setting/{roy-agent-core-ze5cqpf2.js → roy-agent-core-mx855td4.js} +17 -38
- package/dist/shared/@ai-setting/{roy-agent-core-0dh8npnz.js → roy-agent-core-n197medr.js} +13 -13
- package/dist/shared/@ai-setting/{roy-agent-core-cmprygrp.js → roy-agent-core-nqkfkpf4.js} +4 -4
- package/dist/shared/@ai-setting/{roy-agent-core-7cbpmk4q.js → roy-agent-core-p31ftgq9.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-1v4g0d4x.js → roy-agent-core-rm7seqwb.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-ax9e9szb.js → roy-agent-core-smf94h73.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-acj8ag08.js → roy-agent-core-tjnabyvq.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-qqaak24r.js → roy-agent-core-tkpp1ba0.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-dkrvmjsh.js → roy-agent-core-tpm1dd1g.js} +23 -15
- package/dist/shared/@ai-setting/{roy-agent-core-ed233k5z.js → roy-agent-core-v1n0106v.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-zxz5fkwj.js → roy-agent-core-v6yshv0z.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-mcy5apay.js → roy-agent-core-vf9sp6s3.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-xvt7kf7p.js → roy-agent-core-w9ryeg2p.js} +3 -3
- package/dist/shared/@ai-setting/{roy-agent-core-es203w7p.js → roy-agent-core-wqs6yypq.js} +1 -1
- package/dist/shared/@ai-setting/roy-agent-core-wxrkcb17.js +56 -0
- package/dist/shared/@ai-setting/{roy-agent-core-0snm5hc5.js → roy-agent-core-y6shd91r.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-9vxh6f8h.js → roy-agent-core-y7fqtzk2.js} +7 -7
- package/dist/shared/@ai-setting/{roy-agent-core-cpcd24n2.js → roy-agent-core-yet36q5k.js} +2 -2
- package/dist/shared/@ai-setting/{roy-agent-core-3fh1f7s7.js → roy-agent-core-yfpnkc4z.js} +5 -5
- package/dist/shared/@ai-setting/roy-agent-core-zhwcje5a.js +352 -0
- package/package.json +9 -1
|
@@ -134,6 +134,33 @@ export interface EventSourceConfig {
|
|
|
134
134
|
* 里手动开启,否则 consumer 能 ready 但永远收不到事件。
|
|
135
135
|
*/
|
|
136
136
|
eventKeys?: string[];
|
|
137
|
+
/**
|
|
138
|
+
* ★ Task #5360(补充需求 2026-11-11 20:54):是否推送「状态通知文本消息」。
|
|
139
|
+
*
|
|
140
|
+
* ## 背景
|
|
141
|
+
*
|
|
142
|
+
* 卡片化改造后,rule-based 直发的状态文本(`⏱️ 后台任务运行中 20m` /
|
|
143
|
+
* `✅ 已完成 36m`)默认下线,改由任务卡片承载。本开关是**逃生舱**:
|
|
144
|
+
* 保留旧的文本推送能力,用户想恢复时一行配置即可,不必 revert 代码。
|
|
145
|
+
*
|
|
146
|
+
* ## 取值
|
|
147
|
+
*
|
|
148
|
+
* - `false` / **缺省**(默认):不发状态通知文本 —— 全部走卡片
|
|
149
|
+
* - `true`:逐字恢复改造前的文本推送行为
|
|
150
|
+
*
|
|
151
|
+
* ## 边界(很重要,别扩大语义)
|
|
152
|
+
*
|
|
153
|
+
* - 只影响「状态通知文本」,**不影响卡片**(卡片是渠道独立插件,与本开关正交)
|
|
154
|
+
* - 不影响 `sink === "stdout"` 的 CLI 本地输出(本地没有卡片可发,
|
|
155
|
+
* 文本是唯一可见输出 —— 见 `shouldDeliverNoticeText` 的 stdout 例外)
|
|
156
|
+
* - 不影响卡片失败兜底 markdown 与失败回执(那是**降级/异常告知**,不是状态通知)
|
|
157
|
+
*
|
|
158
|
+
* ## 类型严格性
|
|
159
|
+
*
|
|
160
|
+
* 判定处一律用 `=== true`,所以手改 JSON 写出 `"true"`(字符串)/ `1` /
|
|
161
|
+
* `null` 都会被当成 `false` —— 防 YAML/手改造成的类型漂移。
|
|
162
|
+
*/
|
|
163
|
+
statusNotifications?: boolean;
|
|
137
164
|
/** 轮询间隔(毫秒,定时器用) */
|
|
138
165
|
interval?: number;
|
|
139
166
|
/** cron 表达式(定时器用) */
|
|
@@ -193,6 +220,31 @@ export interface EventSourceConfig {
|
|
|
193
220
|
* 回退为 legacy。
|
|
194
221
|
*/
|
|
195
222
|
channelPromptMode?: "legacy" | "lean";
|
|
223
|
+
/**
|
|
224
|
+
* ★ Task #5333 — 该事件源驱动的 agent 会话**额外注入**的工具名列表。
|
|
225
|
+
*
|
|
226
|
+
* 背景(用户 2026-11-11 16:54):「ES config 支持 extend tools ——
|
|
227
|
+
* 不同 ES 驱动的 agent 注入 tools 可不同。企微 ES 有特有工具
|
|
228
|
+
* (wecom_respond),不该配到 default agent。」
|
|
229
|
+
*
|
|
230
|
+
* 语义:
|
|
231
|
+
* - 只有 `tool.metadata.channelOnly === true` 的工具受本字段控制
|
|
232
|
+
* (未标记 channelOnly 的工具对所有 agent 本来就可见,无需声明)
|
|
233
|
+
* - 未配置本字段 → 不放行任何 channelOnly 工具
|
|
234
|
+
* - 配置后 → handler 把它写进 `evt.metadata.extendTools`,
|
|
235
|
+
* 经 run.ts / run-headless-dispatch.ts 透传到
|
|
236
|
+
* `AgentContext.extendTools`,最终由 ToolRegistry / AgentComponent
|
|
237
|
+
* 的可见性过滤放行
|
|
238
|
+
*
|
|
239
|
+
* 内置默认:`wecom-cli` handler 恒注入 `["wecom_respond"]`
|
|
240
|
+
* (企微唯一出站工具,不配也必须可见),用户的 config.extendTools
|
|
241
|
+
* 追加在后并去重。
|
|
242
|
+
*
|
|
243
|
+
* ```json
|
|
244
|
+
* { "type": "wecom-cli", "extendTools": ["my_extra_tool"] }
|
|
245
|
+
* ```
|
|
246
|
+
*/
|
|
247
|
+
extendTools?: string[];
|
|
196
248
|
/**
|
|
197
249
|
* Agent IM 地址(bounty-im 类型用,格式:agent-id@host)
|
|
198
250
|
*
|
|
@@ -753,7 +805,7 @@ export interface BuildNotifyHandlePromptInput {
|
|
|
753
805
|
error?: string;
|
|
754
806
|
/**
|
|
755
807
|
* 子 session ID —— 超时 / 失败后如需**续跑**,主 agent 可直接
|
|
756
|
-
* `delegate_task(
|
|
808
|
+
* `delegate_task(sub_session_id="<此值>", ...)` 让子代理继承历史继续推进,
|
|
757
809
|
* 不必从零重来。
|
|
758
810
|
*/
|
|
759
811
|
subSessionId?: string;
|
|
@@ -24,9 +24,21 @@
|
|
|
24
24
|
* 回调原样带回 → 用前缀 `roy-task-` 反解出数字任务号。
|
|
25
25
|
* 非 roy-task 前缀(外部卡片)→ taskId=null,动作不执行。
|
|
26
26
|
*/
|
|
27
|
-
import { type WecomMilestoneLite } from "./wecom-card-builder";
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
import { type WecomActivityLike, type WecomMilestoneLite } from "./wecom-card-builder";
|
|
28
|
+
import type { WecomSessionCardState } from "../task/plugins/wecom-session-card-store";
|
|
29
|
+
import type { ActivityProbeResult } from "../task/plugins/sub-session-activity";
|
|
30
|
+
/**
|
|
31
|
+
* 卡片动作类型
|
|
32
|
+
*
|
|
33
|
+
* ★ Task #5360:新增 `refresh_activity`(刷新 sub-session 活性)。
|
|
34
|
+
*
|
|
35
|
+
* 与 `view`(刷操作时间线)分开,因为企微 `horizontal_content_list` 只有
|
|
36
|
+
* 6 条预算且已被时间线占满 —— 见 wecom-card-builder 的
|
|
37
|
+
* `WecomCardActionKey.REFRESH_ACTIVITY` 注释。
|
|
38
|
+
*
|
|
39
|
+
* ★ Task #5419:新增 `create_lark_group`(建关联飞书群,对齐飞书)。
|
|
40
|
+
*/
|
|
41
|
+
export type WecomCardAction = "view" | "mark_done" | "reopen" | "refresh_activity" | "create_lark_group";
|
|
30
42
|
/** 解析出的卡片动作事件 */
|
|
31
43
|
export interface WecomCardActionEvent {
|
|
32
44
|
/** 用户点的按钮 key(WecomCardActionKey 之一或外部自定义) */
|
|
@@ -35,6 +47,11 @@ export interface WecomCardActionEvent {
|
|
|
35
47
|
cardTaskId: string;
|
|
36
48
|
/** 反解出的任务号;非 roy-task 前缀 → null */
|
|
37
49
|
taskId: number | null;
|
|
50
|
+
/**
|
|
51
|
+
* ★ 补充需求(22:31):反解出的 sub-session id(`roy-session-` 前缀)。
|
|
52
|
+
* 与 `taskId` 互斥:一张卡要么挂 task,要么挂 session。
|
|
53
|
+
*/
|
|
54
|
+
sessionId: string | null;
|
|
38
55
|
/** 操作者 userid */
|
|
39
56
|
userId: string;
|
|
40
57
|
/** 回调帧 req_id(更新帧必须原样透传) */
|
|
@@ -56,10 +73,54 @@ export interface WecomCardActionPorts {
|
|
|
56
73
|
updateCard: (reqId: string, cardTaskId: string, statusLabel: string, note?: string, timeline?: WecomMilestoneLite[], action?: WecomCardAction,
|
|
57
74
|
/**
|
|
58
75
|
* ★ Task #5273:任务号+标题(可选,渲染进更新卡 main_title)
|
|
76
|
+
* ★ Task #5360:`activity` —— sub-session 活性
|
|
77
|
+
* (`undefined` = 不渲染;`null` = 查了但没数据,渲染「暂无数据」)
|
|
59
78
|
*/
|
|
60
79
|
extra?: {
|
|
61
80
|
taskNumber?: number;
|
|
62
81
|
taskTitle?: string;
|
|
82
|
+
activity?: WecomActivityLike | null;
|
|
83
|
+
/** ★ Task #5360(CV MAJOR-2):任务是否已终态(决定 ⚪已结束 vs 🔴疑似停滞) */
|
|
84
|
+
activityTerminal?: boolean;
|
|
85
|
+
}) => Promise<void>;
|
|
86
|
+
/**
|
|
87
|
+
* ★ Task #5364(B 方案):用**完整快照**刷新 session 卡。
|
|
88
|
+
*
|
|
89
|
+
* 与 `updateCard` 的区别:那个是 task 卡的通用更新(statusLabel/timeline/
|
|
90
|
+
* activity 三个松散参数);本端口接收一次完整的 session 快照,由实现方
|
|
91
|
+
* 调 `buildWecomSessionCardUpdateBody` 渲染「生命周期 + 会话详情 + 任务 +
|
|
92
|
+
* 操作记录 + 活性」一整套。
|
|
93
|
+
*
|
|
94
|
+
* 未注入 ⇒ 自动降级到 `updateCard`(#5360 行为,仅活性)。
|
|
95
|
+
*/
|
|
96
|
+
updateSessionCard?: (reqId: string, input: {
|
|
97
|
+
sessionId: string;
|
|
98
|
+
/** 回调带回的原始 task_id(刷新帧必须原样回填) */
|
|
99
|
+
cardTaskId: string;
|
|
100
|
+
/** 持久层快照;undefined = 无记录(降级仅活性) */
|
|
101
|
+
state?: WecomSessionCardState;
|
|
102
|
+
/** 实时活性;null = 查了但没数据 */
|
|
103
|
+
activity: WecomActivityLike | null;
|
|
104
|
+
/**
|
|
105
|
+
* ★ Task #5419:session 关联的任务信息(刷新增强)。
|
|
106
|
+
* undefined = 无任务 / 端口未注入。
|
|
107
|
+
*/
|
|
108
|
+
task?: {
|
|
109
|
+
id: number;
|
|
110
|
+
title?: string;
|
|
111
|
+
status?: string;
|
|
112
|
+
progress?: number;
|
|
113
|
+
milestones?: WecomMilestoneLite[];
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* ★ Task #5419:已关联飞书群 chatId(建群后刷新帧带群链接)。
|
|
117
|
+
*/
|
|
118
|
+
perTaskChatId?: string;
|
|
119
|
+
/**
|
|
120
|
+
* ★ CV 5419 MAJOR-3:建群失败提示(渲染进 sub_title)。
|
|
121
|
+
*/
|
|
122
|
+
errorHint?: string;
|
|
123
|
+
now?: number;
|
|
63
124
|
}) => Promise<void>;
|
|
64
125
|
/**
|
|
65
126
|
* ★ Task #5203:读任务的操作时间线(milestones + processSteps)。
|
|
@@ -84,6 +145,118 @@ export interface WecomCardActionPorts {
|
|
|
84
145
|
title?: string;
|
|
85
146
|
number?: number;
|
|
86
147
|
} | undefined>;
|
|
148
|
+
/**
|
|
149
|
+
* ★ Task #5360:读 sub-session 活性(「刷新活性」动作用)。
|
|
150
|
+
*
|
|
151
|
+
* 与飞书侧 `CardActionPorts.loadSubSessionActivity` **同一个 probe 实现**
|
|
152
|
+
* (`createActivityProbe`),避免两渠道 liveness 阈值漂移。
|
|
153
|
+
*
|
|
154
|
+
* 不注入 / 抛错 / undefined ⇒ 卡片渲染「暂无数据」,绝不阻断更新。
|
|
155
|
+
*/
|
|
156
|
+
loadSubSessionActivity?: (taskId: number) => Promise<ActivityProbeResult> | ActivityProbeResult;
|
|
157
|
+
/**
|
|
158
|
+
* ★ 补充需求(22:31):**session-only** 活性读取(无 task 场景)。
|
|
159
|
+
*
|
|
160
|
+
* 与 `loadSubSessionActivity(taskId)` 的区别:后者要从 task 反查 bgTask;
|
|
161
|
+
* 本端口**直达** session store —— 因为回调里直接带着 sessionId,
|
|
162
|
+
* 而这条链上根本没有 task。
|
|
163
|
+
*/
|
|
164
|
+
loadSessionActivity?: (sessionId: string) => Promise<ActivityProbeResult> | ActivityProbeResult;
|
|
165
|
+
/**
|
|
166
|
+
* ★ Task #5364(B 方案):读 **session 卡持久层**快照。
|
|
167
|
+
*
|
|
168
|
+
* ## 为什么刷新必须走它(而不是内存 / task)
|
|
169
|
+
*
|
|
170
|
+
* B 方案下「后续 lifecycle 不主动 patch,只写持久层」,所以**刷新是唯一
|
|
171
|
+
* 能看到最新状态的时机**。快照里带着:
|
|
172
|
+
* - `lifecycle`(超时 / 完成 / 失败 / 停止 —— 单靠活性推不出来)
|
|
173
|
+
* - `title` / `agentType` / `startedAt` / `associatedTaskId`(首次发卡的信息)
|
|
174
|
+
* - `milestones`(这一路的状态轨迹)
|
|
175
|
+
* - `cardTaskId`(刷新帧必须原样回填,否则协议拒绝)
|
|
176
|
+
*
|
|
177
|
+
* 读内存 map 的话进程重启就全丢;读 task 的话没有 task 的 session 全丢。
|
|
178
|
+
*
|
|
179
|
+
* 不注入 / 抛错 / undefined ⇒ 降级为「只有活性」的刷新卡(**仍更新卡片**,
|
|
180
|
+
* 用户点了按钮必须有反馈)。
|
|
181
|
+
*/
|
|
182
|
+
loadSessionCardState?: (sessionId: string) => WecomSessionCardState | undefined | Promise<WecomSessionCardState | undefined>;
|
|
183
|
+
/**
|
|
184
|
+
* ★ Task #5418:按 roy 任务号反查 session 卡持久层记录。
|
|
185
|
+
*
|
|
186
|
+
* task 卡刷新路径回退 session probe 时需要 sessionId ——
|
|
187
|
+
* `roy-task-` 前缀卡回调里没有 sessionId,唯一持久化来源是
|
|
188
|
+
* `wecom_session_card.associated_task_id`。注入方(wecom-cli-handler)
|
|
189
|
+
* 用 `store.list()` 扫描;缺省 ⇒ 不回退(行为同旧版)。
|
|
190
|
+
*/
|
|
191
|
+
findSessionCardByTaskId?: (taskId: number) => WecomSessionCardState | undefined | Promise<WecomSessionCardState | undefined>;
|
|
192
|
+
/**
|
|
193
|
+
* ★ Task #5419:session → task 反查 + 全量任务信息(刷新增强)。
|
|
194
|
+
*
|
|
195
|
+
* 用户 2026-11-13:「有刷新详情按钮可以刷新 subsession 状态
|
|
196
|
+
* (包括是否建任务,以及任务名称和动态,也包括 subsession 的
|
|
197
|
+
* 消息数)」。
|
|
198
|
+
*
|
|
199
|
+
* 生产接线(wecom-cli-handler):`TaskComponent.getTaskIdBySessionId`
|
|
200
|
+
* (task_operation.session_id 反查)+ `getTaskWithOperations`。
|
|
201
|
+
*
|
|
202
|
+
* 返回 undefined = 该 session 没建任务(卡上不渲染任务行);
|
|
203
|
+
* 抛错 = 降级(不阻断刷新)。
|
|
204
|
+
*/
|
|
205
|
+
loadSessionTaskInfo?: (sessionId: string) => Promise<{
|
|
206
|
+
id: number;
|
|
207
|
+
title?: string;
|
|
208
|
+
status?: string;
|
|
209
|
+
progress?: number;
|
|
210
|
+
milestones?: WecomMilestoneLite[];
|
|
211
|
+
} | undefined> | {
|
|
212
|
+
id: number;
|
|
213
|
+
title?: string;
|
|
214
|
+
status?: string;
|
|
215
|
+
progress?: number;
|
|
216
|
+
milestones?: WecomMilestoneLite[];
|
|
217
|
+
} | undefined;
|
|
218
|
+
/**
|
|
219
|
+
* ★ Task #5419:建**关联飞书群**(对齐飞书 handleGroupActionSessionOnly)。
|
|
220
|
+
*
|
|
221
|
+
* 生产接线(wecom-cli-handler):lark-cli +chat-create +
|
|
222
|
+
* SessionComponent.attachGroupSession(独立群 session + 1 条
|
|
223
|
+
* user 背景事件 + metadata linkedFromSessionId)。
|
|
224
|
+
*
|
|
225
|
+
* 返回新群 chatId;抛错 = 建群失败(结果翻失败,但卡片仍更新)。
|
|
226
|
+
*/
|
|
227
|
+
createLarkGroupForSession?: (sessionId: string) => Promise<string>;
|
|
228
|
+
/**
|
|
229
|
+
* ★ Task #5419:读该 session 已关联的飞书群(幂等防重复建群)。
|
|
230
|
+
*
|
|
231
|
+
* 生产接线:`SessionComponent.findGroupChatForSession`
|
|
232
|
+
* (扫 metadata linkedFromSessionId,与飞书侧同源)。
|
|
233
|
+
* 未注入 / 抛错 ⇒ 当作没有群(可能重复建,但不崩)。
|
|
234
|
+
*/
|
|
235
|
+
findGroupChatForSession?: (sessionId: string) => Promise<{
|
|
236
|
+
chatId: string;
|
|
237
|
+
} | undefined> | {
|
|
238
|
+
chatId: string;
|
|
239
|
+
} | undefined;
|
|
240
|
+
/**
|
|
241
|
+
* ★ Task #5419:建群成功后发一条企微消息带飞书群 applink。
|
|
242
|
+
*
|
|
243
|
+
* 用户:「建完可以展示或者发一条企微消息带上飞书群跳转链接哈」。
|
|
244
|
+
* best-effort:抛错不阻断建群结果。
|
|
245
|
+
*/
|
|
246
|
+
notifyGroupLink?: (input: {
|
|
247
|
+
sessionId: string;
|
|
248
|
+
chatId: string;
|
|
249
|
+
/** 群名(可选,消息文案用) */
|
|
250
|
+
chatName?: string;
|
|
251
|
+
/**
|
|
252
|
+
* ★ CV 5419 BLOCKER-1:点击按钮的**企微用户** userid。
|
|
253
|
+
*
|
|
254
|
+
* 通知消息必须发给企微侧(不是飞书群 —— chatId 是
|
|
255
|
+
* 飞书群 id,企微 CLI 不认)。缺省时实现方从 session
|
|
256
|
+
* store 的 chatId 兜底。
|
|
257
|
+
*/
|
|
258
|
+
userId?: string;
|
|
259
|
+
}) => Promise<void>;
|
|
87
260
|
}
|
|
88
261
|
/** 处理结果 */
|
|
89
262
|
export interface WecomCardActionResult {
|
|
@@ -91,6 +264,11 @@ export interface WecomCardActionResult {
|
|
|
91
264
|
/** 执行的动作(解析失败时缺省) */
|
|
92
265
|
action?: WecomCardAction;
|
|
93
266
|
error?: string;
|
|
267
|
+
/**
|
|
268
|
+
* ★ Task #5419:create_lark_group 成功时的新群 chatId
|
|
269
|
+
* (幂等命中时 = 已有群 chatId)。
|
|
270
|
+
*/
|
|
271
|
+
newChatId?: string;
|
|
94
272
|
}
|
|
95
273
|
/** 测试钩子:清空 in-flight 去重表(仅供单测 beforeEach 使用) */
|
|
96
274
|
export declare function __resetWecomCardActionInflightForTest(): void;
|
|
@@ -135,6 +313,60 @@ export declare function buildWecomCardUpdateBody(input: {
|
|
|
135
313
|
*/
|
|
136
314
|
taskTitle?: string;
|
|
137
315
|
taskNumber?: number;
|
|
316
|
+
/**
|
|
317
|
+
* ★ Task #5360:sub-session 活性
|
|
318
|
+
* (`undefined` = 不渲染;`null` = 暂无数据)
|
|
319
|
+
*/
|
|
320
|
+
activity?: WecomActivityLike | null;
|
|
321
|
+
/** ★ Task #5360(CV MAJOR-2):任务是否已终态 */
|
|
322
|
+
activityTerminal?: boolean;
|
|
323
|
+
}): {
|
|
324
|
+
cmd: string;
|
|
325
|
+
body: Record<string, unknown>;
|
|
326
|
+
};
|
|
327
|
+
/**
|
|
328
|
+
* ★ Task #5364(B 方案)—— 构造 **session 卡刷新**的更新帧。
|
|
329
|
+
*
|
|
330
|
+
* 独立导出(不走 ports)是为了:
|
|
331
|
+
* 1. 单测能直接断言渲染结果,不依赖 bridge
|
|
332
|
+
* 2. `WecomCliInstance` 的 `updateSessionCard` 实现只需要两步:
|
|
333
|
+
* `buildWecomSessionCardUpdateBody(...)` → `sendFrameWithReqId`
|
|
334
|
+
*
|
|
335
|
+
* ## 为什么快照允许 `undefined`
|
|
336
|
+
*
|
|
337
|
+
* B 方案里持久层是「刷新时的唯一数据源」,但它可能不存在(进程刚重启 +
|
|
338
|
+
* 首次事件丢了 store / 老卡片)。此时**不能不给反馈** —— 用户点了按钮,
|
|
339
|
+
* 什么都没变比显示「暂无数据」更糟。所以降级路径渲染:状态=「状态未知」+
|
|
340
|
+
* 活性(活性反而是这时最有用的信号)。
|
|
341
|
+
*/
|
|
342
|
+
export declare function buildWecomSessionCardUpdateBody(input: {
|
|
343
|
+
/** 回调带回的原始 task_id(原样回填,协议硬约束) */
|
|
344
|
+
cardTaskId: string;
|
|
345
|
+
sessionId: string;
|
|
346
|
+
/**
|
|
347
|
+
* req_id(协议必填)。命名带 ForTest 是历史遗留:生产路径由
|
|
348
|
+
* `updateSessionCard` 端口在 `sendFrameWithReqId` 时注入 headers,
|
|
349
|
+
* 这里仅用于单测直接验证帧结构。
|
|
350
|
+
*/
|
|
351
|
+
reqIdForTest?: string;
|
|
352
|
+
/** 持久层快照;undefined = 无记录 */
|
|
353
|
+
state?: WecomSessionCardState;
|
|
354
|
+
/** 活性;undefined = 不渲染该块,null = 暂无数据 */
|
|
355
|
+
activity?: WecomActivityLike | null;
|
|
356
|
+
now?: number;
|
|
357
|
+
/** 关联任务(可选覆盖;缺省从 state.associatedTaskId 推导编号) */
|
|
358
|
+
task?: {
|
|
359
|
+
id: number;
|
|
360
|
+
title?: string;
|
|
361
|
+
status?: string;
|
|
362
|
+
progress?: number;
|
|
363
|
+
};
|
|
364
|
+
/**
|
|
365
|
+
* ★ Task #5419:已关联飞书群 chatId(渲染「飞书群」行)。
|
|
366
|
+
*/
|
|
367
|
+
perTaskChatId?: string;
|
|
368
|
+
/** ★ CV 5419 MAJOR-3:建群失败提示(渲染进 sub_title) */
|
|
369
|
+
errorHint?: string;
|
|
138
370
|
}): {
|
|
139
371
|
cmd: string;
|
|
140
372
|
body: Record<string, unknown>;
|
|
@@ -35,14 +35,44 @@
|
|
|
35
35
|
* @see wecom-ws-bridge.ts(帧发送)
|
|
36
36
|
* @see wecom-task-notify-plugin.ts(hook 接线)
|
|
37
37
|
*/
|
|
38
|
+
import { type SubSessionActivity } from "../task/plugins/sub-session-activity";
|
|
39
|
+
/** 企微侧活性入参别名(与飞书侧同名类型,语义一致) */
|
|
40
|
+
export type WecomActivityLike = SubSessionActivity;
|
|
38
41
|
/** 标准按钮动作 key(回调 event_key 据此分发) */
|
|
39
42
|
export declare const WecomCardActionKey: {
|
|
40
|
-
/**
|
|
43
|
+
/** 查看详情(刷操作时间线) */
|
|
41
44
|
readonly VIEW: "task_view";
|
|
42
45
|
/** 标记完成 */
|
|
43
46
|
readonly MARK_DONE: "task_mark_done";
|
|
44
47
|
/** 重新打开 */
|
|
45
48
|
readonly REOPEN: "task_reopen";
|
|
49
|
+
/**
|
|
50
|
+
* ★ Task #5360:刷新 sub-session 活性(消息数 + 最近一条消息)。
|
|
51
|
+
*
|
|
52
|
+
* ## 为什么与 VIEW 分成两个按钮(而不是把活性塞进「刷新详情」)
|
|
53
|
+
*
|
|
54
|
+
* 企微 `horizontal_content_list` 协议上限 **6 条**(`MAX_HORIZONTAL_ROWS`),
|
|
55
|
+
* 而进展/更新卡的 6 条已经被「状态 + 5 条操作时间线」占满。把活性挤进去
|
|
56
|
+
* 必然挤掉操作时间线 —— 直接违反用户「之前展示的信息一个都不能少」。
|
|
57
|
+
*
|
|
58
|
+
* 所以:`task_view` 管时间线(旧语义零变更),`task_refresh_activity`
|
|
59
|
+
* 管活性(走 quote_area,不占 horizontal 预算)。
|
|
60
|
+
*/
|
|
61
|
+
readonly REFRESH_ACTIVITY: "task_refresh_activity";
|
|
62
|
+
/**
|
|
63
|
+
* ★ Task #5419:建**关联飞书群**(对齐飞书 #5403/#5397)。
|
|
64
|
+
*
|
|
65
|
+
* 用户 2026-11-13:「另外也有按钮进行飞书建群哈,功能跟飞书一样,
|
|
66
|
+
* 建关联飞书群,建完可以展示或者发一条企微消息带上飞书群跳转链接哈」
|
|
67
|
+
*
|
|
68
|
+
* ## 为什么企微卡可以有「飞书群」按钮
|
|
69
|
+
*
|
|
70
|
+
* wecom-card-builder 旧注释(#5360)说「企微侧本来就没有 per-task
|
|
71
|
+
* 群概念」—— 那指的是**企微群**。#5403 之后建群的目标是
|
|
72
|
+
* **飞书群**(群 session 独立 + 注入背景事件),与企微群概念
|
|
73
|
+
* 正交:企微只是「遥控器」,群在飞书侧。
|
|
74
|
+
*/
|
|
75
|
+
readonly CREATE_LARK_GROUP: "task_create_lark_group";
|
|
46
76
|
};
|
|
47
77
|
export type WecomCardActionKey = (typeof WecomCardActionKey)[keyof typeof WecomCardActionKey];
|
|
48
78
|
/** 企微按钮 style:1 默认蓝 / 2 次要灰 / 3 / 4 强调(官方 1~4) */
|
|
@@ -117,6 +147,33 @@ export interface WecomButtonInteractionCard {
|
|
|
117
147
|
* 更新帧的 task_id 必须原样用回调带回的值
|
|
118
148
|
*/
|
|
119
149
|
export declare function wecomCardTaskIdForTask(taskId: number): string;
|
|
150
|
+
/**
|
|
151
|
+
* ★ 补充需求(22:31):**session 卡**的稳定 task_id 前缀。
|
|
152
|
+
*
|
|
153
|
+
* 与 `roy-task-` 并列 —— 回调时用它区分「这张卡挂在 task 上」还是
|
|
154
|
+
* 「挂在 sub-session 上」。两种前缀互不包含(`roy-task-` vs `roy-session-`),
|
|
155
|
+
* 反解无歧义。
|
|
156
|
+
*/
|
|
157
|
+
export declare const ROY_SESSION_PREFIX = "roy-session-";
|
|
158
|
+
/**
|
|
159
|
+
* 造 session 卡的稳定 task_id。
|
|
160
|
+
*
|
|
161
|
+
* ## 格式(★ 澄清 22:37:session 是主键,task 是附加值)
|
|
162
|
+
*
|
|
163
|
+
* ```
|
|
164
|
+
* roy-session-<sessionId> ← 无关联 task
|
|
165
|
+
* roy-session-<sessionId>@task-<taskId> ← 有关联 task
|
|
166
|
+
* ```
|
|
167
|
+
*
|
|
168
|
+
* 用 `@task-` 而不是再嵌前缀:企微 task_id 字符集限定「数字字母和 `_-@`」,
|
|
169
|
+
* `@` 合法;且 `roy-session-` 与 `roy-task-` 本来就互斥,反解无歧义。
|
|
170
|
+
*
|
|
171
|
+
* ⚠️ 反解时**只取 sessionId 部分**(task 段仅用于诊断/未来扩展)——
|
|
172
|
+
* 刷新永远读 session store,这是本次澄清的核心。
|
|
173
|
+
*/
|
|
174
|
+
export declare function wecomCardTaskIdForSession(sessionId: string, taskId?: number): string;
|
|
175
|
+
/** session 卡 task_id 里「附加 task 段」的分隔符 */
|
|
176
|
+
export declare const WECOM_SESSION_TASK_SEP = "@task-";
|
|
120
177
|
/**
|
|
121
178
|
* 生成一张新卡的 task_id:`roy-task-<taskId>-<seq>-<rand>`。
|
|
122
179
|
*
|
|
@@ -158,6 +215,72 @@ export declare function buildWecomButtonInteractionCard(input: {
|
|
|
158
215
|
/** 已有的 task_id(更新场景复用;发新卡时不传自动生成) */
|
|
159
216
|
cardTaskId?: string;
|
|
160
217
|
}): WecomButtonInteractionCard;
|
|
218
|
+
/** session 层生命周期(与飞书侧同义) */
|
|
219
|
+
export type WecomSessionLifecycle = "running" | "completed" | "timeout" | "failed" | "stopped";
|
|
220
|
+
/**
|
|
221
|
+
* ★ Task #5364(DS review R1 MAJOR-2)—— **刷新帧**用的生命周期。
|
|
222
|
+
*
|
|
223
|
+
* 比 `WecomSessionLifecycle` 多一个 `unknown`:刷新时若持久层没有该
|
|
224
|
+
* session 的记录(进程重启 / store 读失败 / 更早版本发的卡),我们
|
|
225
|
+
* **不知道**它是什么状态。此时必须如实说「未知」而不是乐观地报
|
|
226
|
+
* 「运行中」—— 后者会和活性侧的 🔴 疑似停滞 同时出现在一张卡上,
|
|
227
|
+
* 给用户两个互相矛盾的信号。
|
|
228
|
+
*/
|
|
229
|
+
export type WecomSessionUpdateLifecycle = WecomSessionLifecycle | "unknown";
|
|
230
|
+
/**
|
|
231
|
+
* ★ Task #5360(用户明令「企微也是这个逻辑」)—— 构造**企微 session 卡**。
|
|
232
|
+
*
|
|
233
|
+
* ## 与 task 卡的关系:并列,共用零件
|
|
234
|
+
*
|
|
235
|
+
* 不复用 `buildWecomButtonInteractionCard` 的原因:那个签名是
|
|
236
|
+
* `taskId: number`(必填)+ `buildWecomTextNoticeCard` 的进度百分比语义,
|
|
237
|
+
* session 没有 task 号也没有「进度 %」。硬塞会渲染出 `Task #0` / `0%` 这类噪音。
|
|
238
|
+
*
|
|
239
|
+
* 共用的是:`WecomButtonInteractionCard` 结构、按钮裁剪、`formatActivityQuote`
|
|
240
|
+
* (⇒ 活性阈值与文案与飞书/企微 task 卡**完全一致**,不会出现同一个
|
|
241
|
+
* session 在两个渠道颜色不同)。
|
|
242
|
+
*
|
|
243
|
+
* ## 主键
|
|
244
|
+
*
|
|
245
|
+
* `task_id = roy-session-<sessionId>[@task-<n>]` —— 回调时
|
|
246
|
+
* `parseRoySessionId` 反解出干净的 sessionId,刷新走 session 主键路径。
|
|
247
|
+
*
|
|
248
|
+
* ## 建群按钮(★ Task #5419 更新)
|
|
249
|
+
*
|
|
250
|
+
* #5360 时企微侧没有建群按钮(当时建群目标是企微群,确实没有)。
|
|
251
|
+
* #5403 之后建群目标改为**飞书群**(独立群 session + 背景事件),
|
|
252
|
+
* 企微卡只是遥控入口 —— 用户 2026-11-13 明令「也有按钮进行飞书
|
|
253
|
+
* 建群哈,功能跟飞书一样」。故 session 卡无条件渲染「建飞书群」。
|
|
254
|
+
*/
|
|
255
|
+
export declare function buildWecomSessionCard(input: {
|
|
256
|
+
/** ★ 主键:sub-session id */
|
|
257
|
+
sessionId: string;
|
|
258
|
+
/** session 层生命周期(★ 与有无 task 无关) */
|
|
259
|
+
lifecycle?: WecomSessionLifecycle;
|
|
260
|
+
/** 会话标题(描述 / agent 名);缺省用 sessionId 截断 */
|
|
261
|
+
title?: string;
|
|
262
|
+
/** 所属 agent(subagentType) */
|
|
263
|
+
agentType?: string;
|
|
264
|
+
/** 开始时间(ISO) */
|
|
265
|
+
startedAt?: string;
|
|
266
|
+
/** 已运行时长(人类可读) */
|
|
267
|
+
elapsedText?: string;
|
|
268
|
+
/**
|
|
269
|
+
* ★ 该 session 内创建的 task(可选增强)。
|
|
270
|
+
* 有 → 卡上多一行任务信息;无 → 只显示 session 活性。
|
|
271
|
+
*/
|
|
272
|
+
task?: {
|
|
273
|
+
id: number;
|
|
274
|
+
title?: string;
|
|
275
|
+
status?: string;
|
|
276
|
+
progress?: number;
|
|
277
|
+
};
|
|
278
|
+
/** 活性快照。undefined = 不渲染;null = 暂无数据 */
|
|
279
|
+
activity?: WecomActivityLike | null;
|
|
280
|
+
activityNow?: number;
|
|
281
|
+
/** 执行动态(会话级里程碑) */
|
|
282
|
+
milestones?: WecomMilestoneLite[];
|
|
283
|
+
}): WecomButtonInteractionCard;
|
|
161
284
|
/**
|
|
162
285
|
* 构造 aibot_send_msg 直发 template_card 帧。
|
|
163
286
|
*
|
|
@@ -211,6 +334,89 @@ export declare function buildWecomCardUpdateFrame(input: {
|
|
|
211
334
|
taskTitle?: string;
|
|
212
335
|
/** ★ Task #5273:roy 任务号(可选,与 taskTitle 配对渲染) */
|
|
213
336
|
taskNumber?: number;
|
|
337
|
+
/**
|
|
338
|
+
* ★ Task #5360:sub-session 活性(用户点「刷新活性」时传入)。
|
|
339
|
+
*
|
|
340
|
+
* - `undefined` → 不渲染活性(普通 view / mark_done,行为与改造前一致)
|
|
341
|
+
* - `null` → 渲染「暂无数据」(用户点过了,必须有反馈)
|
|
342
|
+
* - 快照 → 渲染信号灯 + 消息数 + 最近消息
|
|
343
|
+
*/
|
|
344
|
+
activity?: WecomActivityLike | null;
|
|
345
|
+
/** ★ Task #5360:活性时间基准(注入便于测试;缺省 Date.now()) */
|
|
346
|
+
activityNow?: number;
|
|
347
|
+
/** ★ Task #5360:任务是否终态(决定报「已结束」而非「疑似停滞」) */
|
|
348
|
+
activityTerminal?: boolean;
|
|
349
|
+
}): {
|
|
350
|
+
cmd: string;
|
|
351
|
+
headers: {
|
|
352
|
+
req_id: string;
|
|
353
|
+
};
|
|
354
|
+
body: Record<string, unknown>;
|
|
355
|
+
};
|
|
356
|
+
/**
|
|
357
|
+
* ★ Task #5364(用户 2026-11-12 08:34 拍板 B)——
|
|
358
|
+
* 构造 **session 卡的更新帧**(`aibot_respond_update_msg`)。
|
|
359
|
+
*
|
|
360
|
+
* ## 为什么需要它(B 方案的落点)
|
|
361
|
+
*
|
|
362
|
+
* 企微协议:`aibot_respond_update_msg` 只能在 `template_card_event` 回调的
|
|
363
|
+
* 5 秒窗口内、用回调带回的 `req_id` 发。生命周期事件没有 req_id ⇒ **无法主动
|
|
364
|
+
* patch**。所以「一张卡承载整个生命周期」只能靠**用户点按钮把窗口打开**。
|
|
365
|
+
*
|
|
366
|
+
* ⇒ 这张帧必须在**一次渲染里装齐全部信息**(这是用户唯一能看到的最新快照):
|
|
367
|
+
*
|
|
368
|
+
* | 信息 | 来源 | 为什么不能省 |
|
|
369
|
+
* |------|------|--------------|
|
|
370
|
+
* | 生命周期状态 | store.lifecycle | 用户要知道「跑完了没 / 是超时还是失败」 |
|
|
371
|
+
* | 会话详情(id/agent/已运行) | store + startedAt | 首次发卡时的信息,刷新不能擦掉 |
|
|
372
|
+
* | 任务增强(Task #id/title/status) | store.associatedTaskId → task | 有 task 时后端不再发 task 卡,信息必须在这 |
|
|
373
|
+
* | 操作记录(milestones 时间线) | store.milestones | 「这一路发生了什么」 |
|
|
374
|
+
* | 活性(消息数 + 最近 msg) | 实时 probe | 判断 LLM 有没有真在推进 |
|
|
375
|
+
*
|
|
376
|
+
* ## 与 `buildWecomSessionCard`(首发帧)的关系
|
|
377
|
+
*
|
|
378
|
+
* 同一套排版口径(生命周期文案表 / 行裁剪 / `formatActivityQuote`),
|
|
379
|
+
* 但它是**整卡替换**(update 帧的 schema 要求),所以这里重新组装一份,
|
|
380
|
+
* 而不是复用首发卡的返回值 —— 首发卡是 `aibot_send_msg` 的 body 形状。
|
|
381
|
+
*
|
|
382
|
+
* @param input.reqId 回调带回的 req_id(**必须**,缺失直接抛)
|
|
383
|
+
* @param input.cardTaskId 回调带回的原始 `template_card.task_id`(原样回填)
|
|
384
|
+
*/
|
|
385
|
+
export declare function buildWecomSessionUpdateFrame(input: {
|
|
386
|
+
reqId: string;
|
|
387
|
+
/** 回调带回的原始 task_id(协议要求原样回填) */
|
|
388
|
+
cardTaskId: string;
|
|
389
|
+
sessionId: string;
|
|
390
|
+
lifecycle: WecomSessionUpdateLifecycle;
|
|
391
|
+
/** 会话标题(缺省用 sessionId 截断) */
|
|
392
|
+
title?: string;
|
|
393
|
+
agentType?: string;
|
|
394
|
+
/** 开始时间(ISO);用于算「已运行」 */
|
|
395
|
+
startedAt?: string;
|
|
396
|
+
/** 已运行时长(优先用调用方算好的;缺省由 startedAt + now 推导) */
|
|
397
|
+
elapsedText?: string;
|
|
398
|
+
/** 关联 roy 任务(可选增强) */
|
|
399
|
+
task?: {
|
|
400
|
+
id: number;
|
|
401
|
+
title?: string;
|
|
402
|
+
status?: string;
|
|
403
|
+
progress?: number;
|
|
404
|
+
};
|
|
405
|
+
/** 累积操作记录(最新在后;渲染时反转成最新在顶部) */
|
|
406
|
+
milestones?: WecomMilestoneLite[];
|
|
407
|
+
/**
|
|
408
|
+
* ★ Task #5419:该 session 已关联的**飞书群** chatId。
|
|
409
|
+
*
|
|
410
|
+
* 有 ⇒ horizontal 加一行「飞书群」(applink 跳转),
|
|
411
|
+
* 建群后按钮翻面语义由 handler 控制(幂等命中不重复建)。
|
|
412
|
+
*/
|
|
413
|
+
perTaskChatId?: string;
|
|
414
|
+
/** ★ CV 5419 MAJOR-3:建群失败提示(渲染进 sub_title) */
|
|
415
|
+
errorHint?: string;
|
|
416
|
+
/** 活性快照。undefined = 不渲染;null = 暂无数据(用户点了必须有反馈) */
|
|
417
|
+
activity?: WecomActivityLike | null;
|
|
418
|
+
/** 时间基准(注入便于测试) */
|
|
419
|
+
now?: number;
|
|
214
420
|
}): {
|
|
215
421
|
cmd: string;
|
|
216
422
|
headers: {
|
|
@@ -125,6 +125,13 @@ export interface WecomReplyChannelInput {
|
|
|
125
125
|
sourceId?: string;
|
|
126
126
|
/** ★ Task #5311:原始 req_id —— WS 被动回帧(带引用语义)需要 */
|
|
127
127
|
reqId?: string;
|
|
128
|
+
/**
|
|
129
|
+
* ★ Task #5360(补充需求):状态通知文本开关(来自 ES 配置)。
|
|
130
|
+
*
|
|
131
|
+
* 写进 `params` 让 delegate 快照带下去 —— 与 lark 侧同字段同语义。
|
|
132
|
+
* 严格 `=== true`;显式写 false(不省略,保留"源上显式关"的信息)。
|
|
133
|
+
*/
|
|
134
|
+
statusNotifications?: boolean;
|
|
128
135
|
}
|
|
129
136
|
/**
|
|
130
137
|
* 构造企微的 replyChannel。
|
|
@@ -182,6 +189,24 @@ export declare function buildWecomUserMessage(text: string, replyContext?: {
|
|
|
182
189
|
* @param frame 原始帧(`aibot_msg_callback` / `aibot_event_callback`)
|
|
183
190
|
*/
|
|
184
191
|
export declare function parseWecomFrame(raw: unknown): ParsedWecomFrame | null;
|
|
192
|
+
/**
|
|
193
|
+
* 企微渠道**恒需**放行的 channel-only 工具。
|
|
194
|
+
*
|
|
195
|
+
* `wecom_respond` 是企微唯一出站通道(wecom-cli 主路径 + WS 回帧 fallback)。
|
|
196
|
+
* 它带有 `metadata.channelOnly = true`(Task #5333),默认对所有 agent 隐藏
|
|
197
|
+
* ——如果不在这里显式放行,企微事件的 agent 将**无法回复**用户。
|
|
198
|
+
*/
|
|
199
|
+
export declare const WECOM_DEFAULT_EXTEND_TOOLS: readonly string[];
|
|
200
|
+
/**
|
|
201
|
+
* 解析企微渠道的 extendTools(默认 + 配置,去重保序)。
|
|
202
|
+
*
|
|
203
|
+
* 顺序:WECOM_DEFAULT_EXTEND_TOOLS 在前(确定性前缀),config.extendTools 在后。
|
|
204
|
+
* 去重保持首次出现位置 —— 保证同一 config 多次调用结果**逐字节一致**
|
|
205
|
+
* (对齐 buildWecomChannelSystemPrompt 的稳定性纪律,避免无意义的 diff)。
|
|
206
|
+
*
|
|
207
|
+
* @param config 事件源配置(可选字段 extendTools)
|
|
208
|
+
*/
|
|
209
|
+
export declare function resolveWecomExtendTools(config: EventSourceConfig | undefined): string[];
|
|
185
210
|
/** 企微渠道 system prompt 的章节标题(lean 卡片指回这里) */
|
|
186
211
|
export declare const WECOM_CHANNEL_PROMPT_SECTION_TITLE = "\u2B50 \u4F01\u4E1A\u5FAE\u4FE1\u56DE\u590D\u89C4\u8303\uFF08system prompt \u6CE8\u5165\u7248\uFF09";
|
|
187
212
|
/** `buildWecomChannelSystemPrompt` 入参(只允许渠道级配置,禁 event) */
|
|
@@ -10,12 +10,14 @@ import {
|
|
|
10
10
|
unregisterWecomRespondTarget,
|
|
11
11
|
wasWecomReplySent,
|
|
12
12
|
wecomRespondTool
|
|
13
|
-
} from "
|
|
14
|
-
import"
|
|
15
|
-
import"
|
|
16
|
-
import"
|
|
17
|
-
import"
|
|
18
|
-
import"
|
|
13
|
+
} from "../../shared/@ai-setting/roy-agent-core-h1e1fm9b.js";
|
|
14
|
+
import"../../shared/@ai-setting/roy-agent-core-c4ec7k0p.js";
|
|
15
|
+
import"../../shared/@ai-setting/roy-agent-core-418zc9ha.js";
|
|
16
|
+
import"../../shared/@ai-setting/roy-agent-core-p31ftgq9.js";
|
|
17
|
+
import"../../shared/@ai-setting/roy-agent-core-5s2t8z00.js";
|
|
18
|
+
import"../../shared/@ai-setting/roy-agent-core-7f7t9wwp.js";
|
|
19
|
+
import"../../shared/@ai-setting/roy-agent-core-85xyctnb.js";
|
|
20
|
+
import"../../shared/@ai-setting/roy-agent-core-fs0mn2jk.js";
|
|
19
21
|
export {
|
|
20
22
|
wecomRespondTool,
|
|
21
23
|
wasWecomReplySent,
|