@ai-setting/roy-agent-core 1.7.93 → 1.7.94

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.
@@ -17,7 +17,7 @@ import {
17
17
  resolveLarkChannelSystemPrompt,
18
18
  timerHandler,
19
19
  wecomCliHandler
20
- } from "../../shared/@ai-setting/roy-agent-core-33n84tf9.js";
20
+ } from "../../shared/@ai-setting/roy-agent-core-w9qpbpa1.js";
21
21
  import"../../shared/@ai-setting/roy-agent-core-ev110pkx.js";
22
22
  import {
23
23
  cliCommandHandler
@@ -25,7 +25,7 @@ import {
25
25
  import"../../shared/@ai-setting/roy-agent-core-mgmp2gfm.js";
26
26
  import"../../shared/@ai-setting/roy-agent-core-kfspjx59.js";
27
27
  import"../../shared/@ai-setting/roy-agent-core-2stt4rp5.js";
28
- import"../../shared/@ai-setting/roy-agent-core-px73ewzd.js";
28
+ import"../../shared/@ai-setting/roy-agent-core-f2m9yg68.js";
29
29
  import"../../shared/@ai-setting/roy-agent-core-th8fq714.js";
30
30
  import"../../shared/@ai-setting/roy-agent-core-c4ec7k0p.js";
31
31
  import"../../shared/@ai-setting/roy-agent-core-brw8wp2q.js";
@@ -34,8 +34,8 @@ import"../../shared/@ai-setting/roy-agent-core-1pg0fepg.js";
34
34
  import"../../shared/@ai-setting/roy-agent-core-msktt7y7.js";
35
35
  import"../../shared/@ai-setting/roy-agent-core-m46fe3x4.js";
36
36
  import"../../shared/@ai-setting/roy-agent-core-4rtg69cn.js";
37
- import"../../shared/@ai-setting/roy-agent-core-v3wm8gyj.js";
38
- import"../../shared/@ai-setting/roy-agent-core-0yzxapfa.js";
37
+ import"../../shared/@ai-setting/roy-agent-core-yfxdzysd.js";
38
+ import"../../shared/@ai-setting/roy-agent-core-stcr4w4f.js";
39
39
  import"../../shared/@ai-setting/roy-agent-core-418zc9ha.js";
40
40
  import"../../shared/@ai-setting/roy-agent-core-pxqz1d1m.js";
41
41
  import"../../shared/@ai-setting/roy-agent-core-bwyc2j0n.js";
@@ -1,7 +1,7 @@
1
1
  import"../../shared/@ai-setting/roy-agent-core-m1fgtnrc.js";
2
2
  import {
3
3
  EventSourceComponent
4
- } from "../../shared/@ai-setting/roy-agent-core-mp7sqfb5.js";
4
+ } from "../../shared/@ai-setting/roy-agent-core-18xsrema.js";
5
5
  import {
6
6
  BountyIMInstance,
7
7
  COMMAND_PREFIX,
@@ -56,7 +56,7 @@ import {
56
56
  translateCardActionToCommand,
57
57
  wecomCliHandler,
58
58
  writeFallbackModelList
59
- } from "../../shared/@ai-setting/roy-agent-core-33n84tf9.js";
59
+ } from "../../shared/@ai-setting/roy-agent-core-w9qpbpa1.js";
60
60
  import {
61
61
  BUILT_IN_EVENT_SOURCE_TYPES,
62
62
  BUILT_IN_EVENT_SOURCE_TYPE_LIST,
@@ -76,7 +76,7 @@ import {
76
76
  import"../../shared/@ai-setting/roy-agent-core-mgmp2gfm.js";
77
77
  import"../../shared/@ai-setting/roy-agent-core-kfspjx59.js";
78
78
  import"../../shared/@ai-setting/roy-agent-core-2stt4rp5.js";
79
- import"../../shared/@ai-setting/roy-agent-core-px73ewzd.js";
79
+ import"../../shared/@ai-setting/roy-agent-core-f2m9yg68.js";
80
80
  import"../../shared/@ai-setting/roy-agent-core-th8fq714.js";
81
81
  import"../../shared/@ai-setting/roy-agent-core-c4ec7k0p.js";
82
82
  import {
@@ -90,8 +90,8 @@ import"../../shared/@ai-setting/roy-agent-core-1pg0fepg.js";
90
90
  import"../../shared/@ai-setting/roy-agent-core-msktt7y7.js";
91
91
  import"../../shared/@ai-setting/roy-agent-core-m46fe3x4.js";
92
92
  import"../../shared/@ai-setting/roy-agent-core-4rtg69cn.js";
93
- import"../../shared/@ai-setting/roy-agent-core-v3wm8gyj.js";
94
- import"../../shared/@ai-setting/roy-agent-core-0yzxapfa.js";
93
+ import"../../shared/@ai-setting/roy-agent-core-yfxdzysd.js";
94
+ import"../../shared/@ai-setting/roy-agent-core-stcr4w4f.js";
95
95
  import"../../shared/@ai-setting/roy-agent-core-418zc9ha.js";
96
96
  import"../../shared/@ai-setting/roy-agent-core-pxqz1d1m.js";
97
97
  import"../../shared/@ai-setting/roy-agent-core-bwyc2j0n.js";
package/dist/env/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  BaseEnvironment
3
- } from "../shared/@ai-setting/roy-agent-core-vz886vr8.js";
3
+ } from "../shared/@ai-setting/roy-agent-core-xtwnakt8.js";
4
4
  import {
5
5
  TaskComponent
6
- } from "../shared/@ai-setting/roy-agent-core-aeh7qg1r.js";
6
+ } from "../shared/@ai-setting/roy-agent-core-vw4gv5am.js";
7
7
  import"../shared/@ai-setting/roy-agent-core-jzmk4kdh.js";
8
8
  import"../shared/@ai-setting/roy-agent-core-jm136jzh.js";
9
9
  import"../shared/@ai-setting/roy-agent-core-m4x47ne9.js";
@@ -15,11 +15,11 @@ import"../shared/@ai-setting/roy-agent-core-bcv09vrt.js";
15
15
  import"../shared/@ai-setting/roy-agent-core-p5cz9m8v.js";
16
16
  import {
17
17
  EventSourceComponent
18
- } from "../shared/@ai-setting/roy-agent-core-mp7sqfb5.js";
18
+ } from "../shared/@ai-setting/roy-agent-core-18xsrema.js";
19
19
  import {
20
20
  builtInHandlers,
21
21
  larkCliHandler
22
- } from "../shared/@ai-setting/roy-agent-core-33n84tf9.js";
22
+ } from "../shared/@ai-setting/roy-agent-core-w9qpbpa1.js";
23
23
  import {
24
24
  EventSourceInitHooks,
25
25
  getDefaultConfigForType,
@@ -31,7 +31,7 @@ import"../shared/@ai-setting/roy-agent-core-64py47c3.js";
31
31
  import"../shared/@ai-setting/roy-agent-core-mgmp2gfm.js";
32
32
  import"../shared/@ai-setting/roy-agent-core-kfspjx59.js";
33
33
  import"../shared/@ai-setting/roy-agent-core-2stt4rp5.js";
34
- import"../shared/@ai-setting/roy-agent-core-px73ewzd.js";
34
+ import"../shared/@ai-setting/roy-agent-core-f2m9yg68.js";
35
35
  import"../shared/@ai-setting/roy-agent-core-th8fq714.js";
36
36
  import"../shared/@ai-setting/roy-agent-core-c4ec7k0p.js";
37
37
  import"../shared/@ai-setting/roy-agent-core-brw8wp2q.js";
@@ -40,8 +40,8 @@ import"../shared/@ai-setting/roy-agent-core-1pg0fepg.js";
40
40
  import"../shared/@ai-setting/roy-agent-core-msktt7y7.js";
41
41
  import"../shared/@ai-setting/roy-agent-core-m46fe3x4.js";
42
42
  import"../shared/@ai-setting/roy-agent-core-4rtg69cn.js";
43
- import"../shared/@ai-setting/roy-agent-core-v3wm8gyj.js";
44
- import"../shared/@ai-setting/roy-agent-core-0yzxapfa.js";
43
+ import"../shared/@ai-setting/roy-agent-core-yfxdzysd.js";
44
+ import"../shared/@ai-setting/roy-agent-core-stcr4w4f.js";
45
45
  import"../shared/@ai-setting/roy-agent-core-418zc9ha.js";
46
46
  import"../shared/@ai-setting/roy-agent-core-pxqz1d1m.js";
47
47
  import {
@@ -5,7 +5,7 @@ import {
5
5
  TaskPriorityEnum,
6
6
  TaskStatusEnum,
7
7
  TaskTypeEnum
8
- } from "../../shared/@ai-setting/roy-agent-core-aeh7qg1r.js";
8
+ } from "../../shared/@ai-setting/roy-agent-core-vw4gv5am.js";
9
9
  import"../../shared/@ai-setting/roy-agent-core-jzmk4kdh.js";
10
10
  import"../../shared/@ai-setting/roy-agent-core-jm136jzh.js";
11
11
  import"../../shared/@ai-setting/roy-agent-core-m4x47ne9.js";
@@ -30,7 +30,7 @@ import {
30
30
  parseExtractorOutput,
31
31
  registerLayaCompletionTaskHook,
32
32
  renderCompletionState
33
- } from "../../../shared/@ai-setting/roy-agent-core-px73ewzd.js";
33
+ } from "../../../shared/@ai-setting/roy-agent-core-f2m9yg68.js";
34
34
  import"../../../shared/@ai-setting/roy-agent-core-th8fq714.js";
35
35
  import"../../../shared/@ai-setting/roy-agent-core-c4ec7k0p.js";
36
36
  import"../../../shared/@ai-setting/roy-agent-core-brw8wp2q.js";
@@ -66,7 +66,7 @@ import {
66
66
  renderWorkflowInfoLines,
67
67
  resolveTaskTitleForDisplay,
68
68
  sanitizeInlineText
69
- } from "../../../shared/@ai-setting/roy-agent-core-0yzxapfa.js";
69
+ } from "../../../shared/@ai-setting/roy-agent-core-stcr4w4f.js";
70
70
  import"../../../shared/@ai-setting/roy-agent-core-418zc9ha.js";
71
71
  import"../../../shared/@ai-setting/roy-agent-core-pxqz1d1m.js";
72
72
  import"../../../shared/@ai-setting/roy-agent-core-ecap4nws.js";
@@ -13,7 +13,7 @@
13
13
  * - 不依赖具体 bot 身份 / profile(由 caller 注入)
14
14
  * - 失败必须明确返回 ok=false,不静默成功
15
15
  */
16
- import { buildTaskCard, DEFAULT_APP_LINK_BASE, type LarkCardPatchNotifier } from "./lark-card-patch-notifier";
16
+ import { buildTaskCard, DEFAULT_APP_LINK_BASE, type LarkCardPatchNotifier, type Milestone, type SessionCardTaskSummary } from "./lark-card-patch-notifier";
17
17
  import { type ActivityMessage, type ToolCallView, type ActivityProbeResult } from "./sub-session-activity";
18
18
  /** 卡片按钮点击事件的关键字段(精简版,caller 从 event 里挑出) */
19
19
  export interface CardActionEvent {
@@ -55,8 +55,8 @@ export interface CardActionEvent {
55
55
  /** lark-cli profile */
56
56
  profile?: string;
57
57
  }
58
- /** 卡片动作名(★ Task #5360:加 `refresh_activity`) */
59
- export type CardActionName = "create_group" | "disband_group" | "refresh_activity";
58
+ /** 卡片动作名(★ Task #5360:加 `refresh_activity`;★ Task #5580:加 `select_task`) */
59
+ export type CardActionName = "create_group" | "disband_group" | "refresh_activity" | "select_task";
60
60
  /**
61
61
  * 运行时判定一个字符串是否是本 handler 认识的 action。
62
62
  *
@@ -91,6 +91,13 @@ export type CardActionValidation = {
91
91
  ok: true;
92
92
  action: "refresh_activity";
93
93
  sessionId: string;
94
+ }
95
+ /** ★ Task #5580:切任务需要 sessionId(卡片主键)+ taskId(切到哪个任务) */
96
+ | {
97
+ ok: true;
98
+ action: "select_task";
99
+ sessionId: string;
100
+ taskId: number;
94
101
  } | {
95
102
  ok: false;
96
103
  action: string;
@@ -131,6 +138,34 @@ export type SessionCardRefreshHandler = (opts: {
131
138
  cardUpdate?: ReturnType<typeof buildTaskCard>;
132
139
  error?: string;
133
140
  }>;
141
+ /**
142
+ * ★ Task #5580(CV P6 配套):`loadSessionTasks` 的**带总数**返回形态。
143
+ *
144
+ * ## 为什么需要
145
+ *
146
+ * 端口为了压掉 N+1 查询,详情只取**前 N 个**(默认 20);但卡片要写
147
+ * 「共 12 个任务」,数字必须来自**真实总数**,不能退化成「共 20 个」。
148
+ *
149
+ * 兼容:端口也可以直接返回数组(老形态)—— 那时总数按数组长度计。
150
+ */
151
+ export interface SessionCardTaskListResult {
152
+ tasks: SessionCardTaskSummaryPortItem[];
153
+ /** 该 session 关联的**全部** task 数量(可大于 tasks.length) */
154
+ total?: number;
155
+ }
156
+ /**
157
+ * ★ Task #5580:`loadSessionTasks` 端口的条目形状(= 渲染层摘要 + 可选详情字段)。
158
+ *
159
+ * 端口实现可以直接返回 `Task` 实体(多字段无害),渲染层只取它认识的。
160
+ */
161
+ export type SessionCardTaskSummaryPortItem = SessionCardTaskSummary & {
162
+ currentStatus?: string;
163
+ priority?: string;
164
+ parentTaskId?: number;
165
+ goals?: string;
166
+ createdAt?: string;
167
+ updatedAt?: string;
168
+ };
134
169
  /** 端口注入(caller 提供 IO 能力,本模块保持纯函数) */
135
170
  export interface CardActionPorts {
136
171
  /** 读取 task(用于读 context)★ #5581:session_id 可选透传(MCP 路径按钮主键) */
@@ -222,6 +257,26 @@ export interface CardActionPorts {
222
257
  * 返回 [] ⇒ 面板照出 + 「暂无消息」(诚实)。
223
258
  */
224
259
  loadSessionMessages?: (sessionId: string, limit?: number) => Promise<ActivityMessage[] | ToolCallView[] | undefined> | ActivityMessage[] | ToolCallView[] | undefined;
260
+ /**
261
+ * ★ Task #5580:读该 session 内的**全部 task**(最近优先,最多若干条)。
262
+ *
263
+ * 用途:session 卡的「🗂️ 任务列表」面板(一个 session 复用多次时会有多个
264
+ * task 生命周期,只显示单 task 不够)。
265
+ *
266
+ * 装配点实现:`taskComponent.getTaskIdsBySessionId(sessionId)` + 逐个 `getTask`。
267
+ *
268
+ * 不注入 / 抛错 ⇒ 不渲染任务列表面板(降级不抛,与其它端口同一套
269
+ * best-effort 语义);返回 [] ⇒ 面板不渲染(没有任务 = 没有这个面板)。
270
+ */
271
+ loadSessionTasks?: (sessionId: string) => Promise<SessionCardTaskListResult | SessionCardTaskSummaryPortItem[] | undefined> | SessionCardTaskListResult | SessionCardTaskSummaryPortItem[] | undefined;
272
+ /**
273
+ * ★ Task #5580:读某个 task 的里程碑(task_operation 的 milestone 形态)。
274
+ *
275
+ * 用途:点 `select_task` 后渲染「📌 任务里程碑」区。
276
+ *
277
+ * 不注入 / 抛错 ⇒ 里程碑区显示「(该任务暂无里程碑)」,绝不阻断整卡 patch。
278
+ */
279
+ loadTaskMilestones?: (taskId: number) => Promise<Milestone[] | undefined> | Milestone[] | undefined;
225
280
  /**
226
281
  * ★ Task #5403:建群成功后初始化「群 session」—— **关联建群**。
227
282
  *
@@ -551,6 +551,28 @@ export declare function renderMilestones(milestones: Milestone[]): string;
551
551
  * 样式:`- **HH:mm:ss → 现在** <title>` + 可选缩进说明行
552
552
  */
553
553
  export declare function renderProcessSteps(steps: ProcessStep[]): string;
554
+ /**
555
+ * ★ Task #5580 —— session 卡「任务列表」最多展示几个(用户定稿:最近 5 个)。
556
+ *
557
+ * 用户需求(2026-11-13):一个 sub session 会被复用跑很多 task,卡片要能
558
+ * 「罗列最近 5 个 + 展示任务总数」,再多就靠总数提示(不刷屏)。
559
+ */
560
+ export declare const SESSION_TASK_LIST_MAX = 5;
561
+ /**
562
+ * ★ Task #5580 —— 渲染 session 卡「任务列表」面板内容。
563
+ *
564
+ * ## 规则(用户定稿)
565
+ * - `tasks` 按**最近优先**传入(新 → 旧),渲染层取前 `SESSION_TASK_LIST_MAX` 个
566
+ * —— 「最近 5 个」是渲染契约,调用方不必自己截断(少一处漂移点)。
567
+ * - 超过 5 个 → 标题/首行给总数提示「共 N 个任务,最近 5 个:」
568
+ * - 每个条目一个 `select_task` 按钮(点击 → 执行动态 / 任务里程碑切到该任务)
569
+ *
570
+ * @returns `{ title, elements }`,由调用方包进 collapsible_panel(`session_task_list`)
571
+ */
572
+ export declare function renderSessionTaskList(sessionId: string, tasks: SessionCardTaskSummary[], taskTotal?: number): {
573
+ title: string;
574
+ elements: Array<Record<string, any>>;
575
+ };
554
576
  /**
555
577
  * ★ Task #4889 —— 按语义来源把过程步骤分成两组。
556
578
  *
@@ -660,6 +682,17 @@ export interface SessionCardState {
660
682
  activity?: SubSessionActivity | null;
661
683
  /** ★ Task #5420:上次的最近消息列表(patch 未传时沿用,避免擦面板) */
662
684
  recentMessages?: ActivityMessage[] | ToolCallView[];
685
+ /**
686
+ * ★ Task #5580:该 session 的全部 task 摘要(「🗂️ 任务列表」面板)。
687
+ * 与 task / recentMessages 同语义:本次没传就沿用上一次(不擦面板)。
688
+ */
689
+ sessionTasks?: SessionCardTaskSummary[];
690
+ /** ★ Task #5580:任务总数(tasks 被截断到 5 时用于「共 N 个任务」提示) */
691
+ taskTotal?: number;
692
+ /** ★ Task #5580:「📌 任务里程碑」区展示的是哪个任务 */
693
+ selectedTask?: NonNullable<Parameters<typeof buildSessionCard>[0]["selectedTask"]>;
694
+ /** ★ Task #5580:选中任务的里程碑 list */
695
+ selectedTaskMilestones?: Milestone[];
663
696
  /**
664
697
  * ★ Task #5364 返工(BLOCKER-5):该 session 内创建的 roy 任务(**可选增强**)。
665
698
  *
@@ -715,6 +748,41 @@ export declare function buildSessionCard(opts: {
715
748
  createdAt?: string;
716
749
  updatedAt?: string;
717
750
  };
751
+ /**
752
+ * ★ Task #5580:该 session 内**全部 task** 的摘要 list(最近优先)。
753
+ *
754
+ * 渲染规则(用户 2026-11-13 定稿):
755
+ * - ≤5 个 → 直接罗列
756
+ * - >5 个 → 只罗列**最近 5 个** + 总数提示(「共 N 个任务,最近 5 个:」)
757
+ * - 每条带 `select_task` 按钮(点击 → 执行动态切换到该任务)
758
+ * - undefined → 不渲染面板(零噪音,与 task 区块同语义)
759
+ */
760
+ tasks?: SessionCardTaskSummary[];
761
+ /** ★ Task #5580:任务总数(tasks 被截断到 5 时用于「共 N 个任务」提示) */
762
+ taskTotal?: number;
763
+ /**
764
+ * ★ Task #5580:当前**选中**的任务(点 select_task 后切换到这里)。
765
+ * undefined → 不渲染「任务里程碑」面板。
766
+ *
767
+ * ★ CV P3(已记录取舍):**没有 null 清除路径** —— 选中态的生命周期绑定
768
+ * 在任务存续上,任务删除/归档后由刷新把它从 `tasks` 列表里剔除(此时
769
+ * `selectedTask` 不再出现在任务列表里,用户自然会点别的任务)。
770
+ * 若将来需要"取消选中",把类型扩成 `| null` 并在 rememberSessionCard
771
+ * 区分 `undefined`(沿用)/ `null`(清除)即可。
772
+ */
773
+ selectedTask?: SessionCardTaskSummary & {
774
+ currentStatus?: string;
775
+ priority?: string;
776
+ parentTaskId?: number;
777
+ goals?: string;
778
+ createdAt?: string;
779
+ updatedAt?: string;
780
+ };
781
+ /**
782
+ * ★ Task #5580:选中任务的里程碑 list(task_operation 的 milestone),
783
+ * 渲染进「任务里程碑」面板,随 select_task 切换。
784
+ */
785
+ selectedTaskMilestones?: Milestone[];
718
786
  /** 所属 agent(subagentType),可选 */
719
787
  agentType?: string;
720
788
  /** 开始时间(ISO) */
@@ -1028,6 +1096,15 @@ export declare class LarkCardPatchNotifier {
1028
1096
  activity?: SubSessionActivity | null;
1029
1097
  /** ★ Task #5364 返工:该 session 内的任务信息(渲染进**同一张** session 卡) */
1030
1098
  task?: Parameters<typeof buildSessionCard>[0]["task"];
1099
+ /** ★ Task #5580:该 session 内全部 task 的摘要列表(「🗂️ 任务列表」面板) */
1100
+ tasks?: SessionCardTaskSummary[];
1101
+ /**
1102
+ * ★ Task #5420:最近消息列表(「💬 会话查看」面板)。
1103
+ *
1104
+ * 补声明:方法体内一直读 `opts.recentMessages`(carry-forward 逻辑),
1105
+ * 但 opts 类型漏了这一项 ⇒ tsc 长期报 TS2339(存量缺陷,本次顺手修掉)。
1106
+ */
1107
+ recentMessages?: ActivityMessage[] | ToolCallView[];
1031
1108
  perTaskChatId?: string;
1032
1109
  perTaskChatName?: string;
1033
1110
  }): Promise<boolean>;
@@ -1049,6 +1126,28 @@ export declare class LarkCardPatchNotifier {
1049
1126
  private findSessionCardBySessionId;
1050
1127
  /** 这个 messageId 是否属于一张 **session 卡**(★ Task #5384 守卫入口)。 */
1051
1128
  isSessionCardMessage(messageId: string): boolean;
1129
+ /**
1130
+ * ★ Task #5602:这个 messageId 是否属于一张 **task 卡**。
1131
+ *
1132
+ * ## 为什么需要
1133
+ *
1134
+ * task 卡上的「💬 会话查看」按钮(action=refresh_activity)走
1135
+ * session 主键路径;`buildSessionCardWithActivity` 只查
1136
+ * `sessionStates` ⇒ task 卡查不到 ⇒ fallback `buildSessionCard`
1137
+ * 整卡重建 ⇒ **task 卡被 session 渲染器覆盖**(用户实测:
1138
+ * 「📋 任务卡」点一下变成「💬 会话卡」)。
1139
+ *
1140
+ * handler 据此把 refresh_activity 委托回 task 路径
1141
+ * (`handleRefreshActivity`,保持 task 卡身份渲染)。
1142
+ *
1143
+ * ## 判定来源(两处,覆盖两个生命周期)
1144
+ *
1145
+ * - 运行中:`states`(`startTask` / `hydrateState` 写入)
1146
+ * - 终态后:`finalisedCards`(`finishTask` 会 `states.delete`,
1147
+ * 但卡还在飞书里,用户仍可点按钮 —— #5020 终态守卫的集合
1148
+ * 恰好就是「曾是 task 卡」的权威记录)
1149
+ */
1150
+ isTaskCardMessage(messageId: string): boolean;
1052
1151
  /**
1053
1152
  * ★ Task #5384:把 **task 侧的更新**应用进 session 卡,返回可 patch 的卡片。
1054
1153
  *
@@ -1162,6 +1261,8 @@ export declare class LarkCardPatchNotifier {
1162
1261
  activity?: SubSessionActivity | null;
1163
1262
  /** ★ Task #5364 返工(BLOCKER-5):session 内的任务信息(合并渲染) */
1164
1263
  task?: Parameters<typeof buildSessionCard>[0]["task"];
1264
+ /** ★ Task #5580:该 session 内全部 task 的摘要列表(「🗂️ 任务列表」面板) */
1265
+ tasks?: SessionCardTaskSummary[];
1165
1266
  perTaskChatId?: string;
1166
1267
  perTaskChatName?: string;
1167
1268
  }): Promise<{
@@ -1204,6 +1305,8 @@ export declare class LarkCardPatchNotifier {
1204
1305
  * 用户 08:13 定稿:**一张 session 卡**,task 信息是卡上的区块。
1205
1306
  */
1206
1307
  task?: Parameters<typeof buildSessionCard>[0]["task"];
1308
+ /** ★ Task #5580:该 session 内全部 task 的摘要列表(首卡就带上) */
1309
+ tasks?: SessionCardTaskSummary[];
1207
1310
  perTaskChatId?: string;
1208
1311
  perTaskChatName?: string;
1209
1312
  }): Promise<StartTaskResult>;
@@ -1228,6 +1331,15 @@ export declare class LarkCardPatchNotifier {
1228
1331
  * undefined = 本次没查(沿用 state 里的上次值,与 activity 同语义)。
1229
1332
  */
1230
1333
  recentMessages?: ActivityMessage[] | ToolCallView[];
1334
+ /**
1335
+ * ★ Task #5580:该 session 的全部 task 摘要(「🗂️ 任务列表」面板)。
1336
+ * undefined = 本次没查(沿用 state);[] = 查了确实没有(不渲染面板)。
1337
+ */
1338
+ sessionTasks?: SessionCardTaskSummary[];
1339
+ /** ★ Task #5580:当前选中的任务(点 select_task 后的焦点) */
1340
+ selectedTask?: Parameters<typeof buildSessionCard>[0]["selectedTask"];
1341
+ /** ★ Task #5580:选中任务的里程碑(「📌 任务里程碑」区) */
1342
+ selectedTaskMilestones?: Milestone[];
1231
1343
  }): CardPayload | undefined;
1232
1344
  /**
1233
1345
  * ★ 补充需求(22:31)—— 记录 session 卡的累计状态(供 refresh 重建)。
@@ -1252,6 +1364,11 @@ export declare class LarkCardPatchNotifier {
1252
1364
  activity?: SubSessionActivity | null;
1253
1365
  /** ★ Task #5420:上次的最近消息列表 */
1254
1366
  recentMessages?: ActivityMessage[] | ToolCallView[];
1367
+ /** ★ Task #5580:session 内的任务列表 / 总数 / 选中任务 / 里程碑 */
1368
+ sessionTasks?: SessionCardTaskSummary[];
1369
+ taskTotal?: number;
1370
+ selectedTask?: NonNullable<Parameters<typeof buildSessionCard>[0]["selectedTask"]>;
1371
+ selectedTaskMilestones?: Milestone[];
1255
1372
  /** ★ Task #5364 返工:任务区块 + 专属群(合并渲染) */
1256
1373
  task?: NonNullable<Parameters<typeof buildSessionCard>[0]["task"]>;
1257
1374
  perTaskChatId?: string;
@@ -1415,6 +1532,19 @@ export declare class LarkCardPatchNotifier {
1415
1532
  * - 单测要隔离:显式传 `cardNotifier` 构造参数(既有 55 条测试都这么做),
1416
1533
  * 或者调用 {@link __resetSharedLarkCardNotifierForTest}
1417
1534
  */
1535
+ /**
1536
+ * ★ Task #5580:session 卡任务列表的**单条摘要**(渲染层最小字段集)。
1537
+ *
1538
+ * 与 `SessionCardTaskPayload`(单 task 详情区块)的区别:
1539
+ * 列表条目只需要「点得动、认得出」—— id / 标题 / 状态 / 进度,
1540
+ * 不搬 goals / parentTaskId / createdAt 等重字段(点进详情再看)。
1541
+ */
1542
+ export interface SessionCardTaskSummary {
1543
+ id: number;
1544
+ title?: string;
1545
+ status?: string;
1546
+ progress?: number;
1547
+ }
1418
1548
  /**
1419
1549
  * ★ Task #5364 返工:session 卡上「任务信息」区块的渲染载荷类型。
1420
1550
  *
@@ -2,6 +2,7 @@ import {
2
2
  DEFAULT_APP_LINK_BASE,
3
3
  HEAD_TITLE_MAX_WIDTH,
4
4
  LarkCardPatchNotifier,
5
+ SESSION_TASK_LIST_MAX,
5
6
  __resetSharedLarkCardNotifierForTest,
6
7
  buildChatAppLink,
7
8
  buildCollapsiblePanel,
@@ -21,12 +22,13 @@ import {
21
22
  renderMilestones,
22
23
  renderProcessSteps,
23
24
  renderProgressBar,
25
+ renderSessionTaskList,
24
26
  renderTaskInfoLines,
25
27
  renderWorkflowInfoLines,
26
28
  resolveTaskTitleForDisplay,
27
29
  sanitizeInlineText,
28
30
  truncateHeadTitle
29
- } from "../../../shared/@ai-setting/roy-agent-core-0yzxapfa.js";
31
+ } from "../../../shared/@ai-setting/roy-agent-core-stcr4w4f.js";
30
32
  import"../../../shared/@ai-setting/roy-agent-core-418zc9ha.js";
31
33
  import"../../../shared/@ai-setting/roy-agent-core-pxqz1d1m.js";
32
34
  import"../../../shared/@ai-setting/roy-agent-core-yshw2fvj.js";
@@ -39,6 +41,7 @@ export {
39
41
  resolveTaskTitleForDisplay,
40
42
  renderWorkflowInfoLines,
41
43
  renderTaskInfoLines,
44
+ renderSessionTaskList,
42
45
  renderProgressBar,
43
46
  renderProcessSteps,
44
47
  renderMilestones,
@@ -58,6 +61,7 @@ export {
58
61
  buildCollapsiblePanel,
59
62
  buildChatAppLink,
60
63
  __resetSharedLarkCardNotifierForTest,
64
+ SESSION_TASK_LIST_MAX,
61
65
  LarkCardPatchNotifier,
62
66
  HEAD_TITLE_MAX_WIDTH,
63
67
  DEFAULT_APP_LINK_BASE
@@ -91,6 +91,63 @@ export interface TaskNotifyConfig {
91
91
  * 老卡片再也无法 patch(永远停在"进行中")+ pin 一直挂着。
92
92
  */
93
93
  cardStateStore?: LarkCardStateStore;
94
+ /**
95
+ * ★ Task #5580:是否在 session 卡之外**再发一张任务卡片**(默认 true)。
96
+ *
97
+ * ## 背景(用户 2026-11-13 定稿)
98
+ *
99
+ * 「之前的任务卡片功能必须保留:lark-cli ES 插件中根据 task hook 触发的
100
+ * 任务卡片消息也要发出来并 pin 住。不能只有 session 卡片——两者并存:
101
+ * 任务卡片(用户关心任务级别)+ session 卡片(调试用,功能以后削弱)」
102
+ *
103
+ * 这**反转**了 #5364 的「单卡语义」(当时定稿:一个 session 只发一张卡,
104
+ * task 信息作为卡上区块)。现在两者并存:
105
+ * - session 卡:会话视角(任务列表 / 执行动态 / 活性)—— 调试用,后续削弱
106
+ * - task 卡:任务视角(进度 / 里程碑 / 建群)—— 用户主关注
107
+ *
108
+ * 设 `false` 可退回 #5364 的单卡语义(软回滚开关)。
109
+ */
110
+ emitTaskCard?: boolean;
111
+ /**
112
+ * ★ Task #5580:config.jsonc 开关读取端口(生产装配注入)。
113
+ * 不传 ⇒ 退回 `emitTaskCard` 代码级默认 / true。
114
+ */
115
+ cardNotifyConfigReader?: () => LarkCardNotifyFlags;
116
+ }
117
+ /**
118
+ * ★ Task #5580(2026-11-15 补充):config.jsonc 可配的卡片开关。
119
+ *
120
+ * ## 配置键(config.jsonc)
121
+ *
122
+ * ```jsonc
123
+ * {
124
+ * "task": {
125
+ * "plugins": {
126
+ * "larkCard": {
127
+ * // task hook 触发的任务卡片(用户主关注,pin)
128
+ * "emitTaskCard": true,
129
+ * // sub-session 生命周期触发的 session 卡片(调试用)
130
+ * "emitSessionCard": true
131
+ * }
132
+ * }
133
+ * }
134
+ * }
135
+ * ```
136
+ *
137
+ * ## 生效方式(热更新)
138
+ *
139
+ * config.jsonc 是 task 组件的 file source(watch 开启)⇒
140
+ * **改文件即生效,无需重启 ES**。开关在每次 hook 执行 / 每次
141
+ * session 生命周期事件时**现读**(不是构造时缓存)。
142
+ *
143
+ * ## 优先级
144
+ *
145
+ * 显式传给 hook 的 `config.emitTaskCard`(代码级)优先于
146
+ * config.jsonc(文件级)—— 便于单测与特殊部署覆盖。
147
+ */
148
+ export interface LarkCardNotifyFlags {
149
+ emitTaskCard: boolean;
150
+ emitSessionCard: boolean;
94
151
  }
95
152
  /**
96
153
  * 卡片路由端口(Task #4230 follow-up)
@@ -118,6 +175,14 @@ export declare class LarkCliTaskNotifyHook implements Hook {
118
175
  readonly pluginName?: string;
119
176
  readonly sourceId?: string;
120
177
  private readonly config;
178
+ /**
179
+ * ★ Task #5580:config.jsonc 开关的读取端口(可选注入)。
180
+ *
181
+ * 生产装配点(task-component)注入 `taskComponent.getCardNotifyConfig`;
182
+ * 不注入(单测 / 未接线)⇒ 退回 `config.emitTaskCard` 代码级默认。
183
+ * 每次 hook 执行时现读 ⇒ config.jsonc 热更新即时生效。
184
+ */
185
+ cardNotifyConfigReader?: () => LarkCardNotifyFlags;
121
186
  /** 卡片模式 notifier 实例 */
122
187
  private cardNotifier?;
123
188
  /**
@@ -185,6 +250,16 @@ export declare class LarkCliTaskNotifyHook implements Hook {
185
250
  setCardRoutingPorts(ports: CardRoutingPorts): void;
186
251
  /** 诊断:端口是否注入 */
187
252
  hasCardRoutingPorts(): boolean;
253
+ /**
254
+ * ★ Task #5580:emitTaskCard 的**现读**语义。
255
+ *
256
+ * 优先级:显式 config.emitTaskCard(代码级)> config.jsonc
257
+ * (文件级,经 cardNotifyConfigReader)> 默认 true。
258
+ *
259
+ * 为什么不用构造时缓存:config.jsonc 是 file source(watch 开),
260
+ * 用户改文件应即时生效 —— 每次执行现读。
261
+ */
262
+ private currentEmitTaskCard;
188
263
  execute(ctx: HookContext<unknown>): Promise<void>;
189
264
  /** 任务创建:发初始卡片(+ pin) */
190
265
  private onAfterCreate;
@@ -87,6 +87,31 @@ export declare class TaskComponent extends BaseComponent {
87
87
  * or has been disposed.
88
88
  */
89
89
  getBackgroundTaskManager(): BackgroundTaskManager | undefined;
90
+ /**
91
+ * ★ Task #5580(2026-11-15 补充)—— lark 卡片开关(config.jsonc 可配)。
92
+ *
93
+ * ## 配置键(沿用 task 组件点号惯例)
94
+ *
95
+ * - `task.plugins.larkCard.emitTaskCard`(默认 true)
96
+ * —— task hook 触发的**任务卡片**(用户主关注,pin)
97
+ * - `task.plugins.larkCard.emitSessionCard`(默认 true)
98
+ * —— sub-session 生命周期触发的 **session 卡片**(调试用)
99
+ *
100
+ * ## 生效方式
101
+ *
102
+ * config.jsonc 是 task 组件的 file source(watch 开启)⇒
103
+ * 改文件即热更新,**无需重启 ES**。每次 hook 执行时现读
104
+ * (`LarkCliTaskNotifyHook` 在 execute 内调用本方法)。
105
+ *
106
+ * ## 降级
107
+ *
108
+ * configComponent 缺失 / 键未配置 / 值不是 boolean ⇒ 默认 true
109
+ * (与改造前行为一致:两卡并存)。
110
+ */
111
+ getCardNotifyConfig(): {
112
+ emitTaskCard: boolean;
113
+ emitSessionCard: boolean;
114
+ };
90
115
  /**
91
116
  * 发布 EnvEvent
92
117
  */
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  LarkCliWorkflowNotifyHook,
3
3
  createLarkCliWorkflowNotifyHook
4
- } from "../../../shared/@ai-setting/roy-agent-core-v3wm8gyj.js";
5
- import"../../../shared/@ai-setting/roy-agent-core-0yzxapfa.js";
4
+ } from "../../../shared/@ai-setting/roy-agent-core-yfxdzysd.js";
5
+ import"../../../shared/@ai-setting/roy-agent-core-stcr4w4f.js";
6
6
  import"../../../shared/@ai-setting/roy-agent-core-418zc9ha.js";
7
7
  import"../../../shared/@ai-setting/roy-agent-core-pxqz1d1m.js";
8
8
  import"../../../shared/@ai-setting/roy-agent-core-5e9vmj5e.js";
package/dist/index.js CHANGED
@@ -62,10 +62,10 @@ import {
62
62
  BaseEnvironment,
63
63
  generateDescendingId,
64
64
  generateId
65
- } from "./shared/@ai-setting/roy-agent-core-vz886vr8.js";
65
+ } from "./shared/@ai-setting/roy-agent-core-xtwnakt8.js";
66
66
  import {
67
67
  TaskComponent
68
- } from "./shared/@ai-setting/roy-agent-core-aeh7qg1r.js";
68
+ } from "./shared/@ai-setting/roy-agent-core-vw4gv5am.js";
69
69
  import"./shared/@ai-setting/roy-agent-core-jzmk4kdh.js";
70
70
  import"./shared/@ai-setting/roy-agent-core-jm136jzh.js";
71
71
  import"./shared/@ai-setting/roy-agent-core-m4x47ne9.js";
@@ -80,7 +80,7 @@ import"./shared/@ai-setting/roy-agent-core-bcv09vrt.js";
80
80
  import"./shared/@ai-setting/roy-agent-core-p5cz9m8v.js";
81
81
  import {
82
82
  EventSourceComponent
83
- } from "./shared/@ai-setting/roy-agent-core-mp7sqfb5.js";
83
+ } from "./shared/@ai-setting/roy-agent-core-18xsrema.js";
84
84
  import {
85
85
  BountyIMInstance,
86
86
  COMMAND_PREFIX,
@@ -135,7 +135,7 @@ import {
135
135
  translateCardActionToCommand,
136
136
  wecomCliHandler,
137
137
  writeFallbackModelList
138
- } from "./shared/@ai-setting/roy-agent-core-33n84tf9.js";
138
+ } from "./shared/@ai-setting/roy-agent-core-w9qpbpa1.js";
139
139
  import {
140
140
  BUILT_IN_EVENT_SOURCE_TYPES,
141
141
  BUILT_IN_EVENT_SOURCE_TYPE_LIST,
@@ -161,7 +161,7 @@ import"./shared/@ai-setting/roy-agent-core-2stt4rp5.js";
161
161
  import {
162
162
  TaskTagPlugin,
163
163
  createAutoTaskPlugin
164
- } from "./shared/@ai-setting/roy-agent-core-px73ewzd.js";
164
+ } from "./shared/@ai-setting/roy-agent-core-f2m9yg68.js";
165
165
  import"./shared/@ai-setting/roy-agent-core-th8fq714.js";
166
166
  import"./shared/@ai-setting/roy-agent-core-c4ec7k0p.js";
167
167
  import {
@@ -191,8 +191,8 @@ import {
191
191
  TASK_COMPLETED_STATUS_WORD,
192
192
  TASK_DELIVERABLE_RECORDED
193
193
  } from "./shared/@ai-setting/roy-agent-core-4rtg69cn.js";
194
- import"./shared/@ai-setting/roy-agent-core-v3wm8gyj.js";
195
- import"./shared/@ai-setting/roy-agent-core-0yzxapfa.js";
194
+ import"./shared/@ai-setting/roy-agent-core-yfxdzysd.js";
195
+ import"./shared/@ai-setting/roy-agent-core-stcr4w4f.js";
196
196
  import"./shared/@ai-setting/roy-agent-core-418zc9ha.js";
197
197
  import {
198
198
  SQLiteTaskStore,