@jesonliu/lark-claudecode-bridge 0.18.1 → 0.20.0

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 (78) hide show
  1. package/README.md +14 -12
  2. package/assets/web/css/main.css +509 -111
  3. package/assets/web/index.html +12 -2
  4. package/assets/web/js/main.js +19 -11
  5. package/assets/web/js/pages/apps.js +10 -5
  6. package/assets/web/js/pages/claude.js +15 -5
  7. package/assets/web/js/pages/mcp.js +265 -0
  8. package/assets/web/js/pages/overview.js +5 -4
  9. package/assets/web/js/pages/permissions.js +56 -30
  10. package/assets/web/js/pages/plugins.js +29 -6
  11. package/assets/web/js/pages/skills.js +342 -0
  12. package/assets/web/js/pages/slash.js +11 -5
  13. package/assets/web/js/pages/workspaces.js +36 -14
  14. package/assets/web/js/theme.js +23 -0
  15. package/assets/web/js/ui.js +75 -4
  16. package/config.example.yaml +2 -3
  17. package/dist/access/access-control.d.ts +17 -1
  18. package/dist/access/access-control.js +31 -2
  19. package/dist/access/access-control.js.map +1 -1
  20. package/dist/bin/lcb.js +5 -0
  21. package/dist/bin/lcb.js.map +1 -1
  22. package/dist/claude-config.d.ts +14 -2
  23. package/dist/claude-config.js +75 -4
  24. package/dist/claude-config.js.map +1 -1
  25. package/dist/cli/setup-wizard.d.ts +0 -1
  26. package/dist/cli/setup-wizard.js +2 -4
  27. package/dist/cli/setup-wizard.js.map +1 -1
  28. package/dist/config.js +39 -14
  29. package/dist/config.js.map +1 -1
  30. package/dist/executor/claude-executor.d.ts +1 -1
  31. package/dist/executor/claude-executor.js +4 -2
  32. package/dist/executor/claude-executor.js.map +1 -1
  33. package/dist/executor/notify-server.d.ts +20 -0
  34. package/dist/executor/notify-server.js +85 -4
  35. package/dist/executor/notify-server.js.map +1 -1
  36. package/dist/executor/plugin-discovery.d.ts +6 -0
  37. package/dist/executor/plugin-discovery.js +14 -0
  38. package/dist/executor/plugin-discovery.js.map +1 -1
  39. package/dist/gateway/card-builder.d.ts +60 -24
  40. package/dist/gateway/card-builder.js +200 -109
  41. package/dist/gateway/card-builder.js.map +1 -1
  42. package/dist/gateway/diff-card.js +1 -1
  43. package/dist/gateway/diff-card.js.map +1 -1
  44. package/dist/gateway/feishu-gateway.d.ts +27 -0
  45. package/dist/gateway/feishu-gateway.js +106 -4
  46. package/dist/gateway/feishu-gateway.js.map +1 -1
  47. package/dist/gateway/progress-card.d.ts +77 -0
  48. package/dist/gateway/progress-card.js +231 -8
  49. package/dist/gateway/progress-card.js.map +1 -1
  50. package/dist/index.d.ts +16 -1
  51. package/dist/index.js +354 -98
  52. package/dist/index.js.map +1 -1
  53. package/dist/notify-sop.d.ts +1 -0
  54. package/dist/notify-sop.js +33 -0
  55. package/dist/notify-sop.js.map +1 -0
  56. package/dist/session/commands.d.ts +1 -1
  57. package/dist/session/commands.js +25 -2
  58. package/dist/session/commands.js.map +1 -1
  59. package/dist/session/session-store.d.ts +3 -0
  60. package/dist/session/session-store.js.map +1 -1
  61. package/dist/types.d.ts +23 -5
  62. package/dist/util/log-tee.d.ts +4 -0
  63. package/dist/util/log-tee.js +99 -0
  64. package/dist/util/log-tee.js.map +1 -0
  65. package/dist/util/runtime-dirs.d.ts +4 -0
  66. package/dist/util/runtime-dirs.js +27 -0
  67. package/dist/util/runtime-dirs.js.map +1 -0
  68. package/dist/util/workspace-diff.js +2 -2
  69. package/dist/util/workspace-diff.js.map +1 -1
  70. package/dist/web/lifecycle.d.ts +4 -1
  71. package/dist/web/lifecycle.js +11 -25
  72. package/dist/web/lifecycle.js.map +1 -1
  73. package/dist/web/server.js +404 -11
  74. package/dist/web/server.js.map +1 -1
  75. package/dist/web/skills-mcp-api.d.ts +120 -0
  76. package/dist/web/skills-mcp-api.js +348 -0
  77. package/dist/web/skills-mcp-api.js.map +1 -0
  78. package/package.json +3 -1
@@ -11,6 +11,24 @@ export interface ProgressState {
11
11
  confirm?: ConfirmationRequest;
12
12
  /** 子代理/后台任务清单(启动加入、落定标记保留到任务结束) */
13
13
  agents: SubagentTask[];
14
+ /** 内嵌计划确认(独立提问卡 #3+#6:方案不再单独发卡,正文收敛为一行 + 内嵌表单按钮 + 「查看完整方案」按钮,原文落盘并通过 send_file 发送) */
15
+ plan?: EmbeddedPlanState;
16
+ /** 内嵌提问确认(AskUserQuestion:选项按钮 + 提交按钮全部在主卡上,qa-pick PATCH 选中态) */
17
+ question?: EmbeddedQuestionState;
18
+ }
19
+ /** 内嵌计划状态:planFilePath 用于「查看完整方案」回调发送原文 md;plan 原文仅在卡片内露出预览片段(防爆卡片) */
20
+ export interface EmbeddedPlanState {
21
+ requestId: string;
22
+ plan: string;
23
+ workspaceName: string;
24
+ planFilePath: string;
25
+ }
26
+ /** 内嵌提问状态:answers 跟随选项点击 PATCH 更新(multiSelect 时为 string[]) */
27
+ export interface EmbeddedQuestionState {
28
+ requestId: string;
29
+ questions: AskQuestionRequest['questions'];
30
+ workspaceName: string;
31
+ answers: Record<number, string | string[]>;
14
32
  }
15
33
  /** 子代理/后台任务的卡片展示条目 */
16
34
  export interface SubagentTask {
@@ -23,11 +41,37 @@ export interface SubagentTask {
23
41
  summary?: string;
24
42
  }
25
43
  export declare function buildTextCard(markdown: string): unknown;
26
- /** 进度卡正文尾部的字符上限(防爆卡片);任务收尾据此判断短回复是否需要独立结果消息 */
27
- export declare const PROGRESS_TAIL_CHARS = 1200;
44
+ /** 进度卡终态结果尾部的字符上限(防爆卡片)。运行中不展示过程文本(产品决策:主卡只留
45
+ * 关键信息——状态/工具/子代理/确认区/计时;思考内容与过程文本一律不进卡),仅任务收尾
46
+ * 露出结果尾部。index.ts 以同一常量判断「短回复是否需要独立结果消息」,两处保持同值,
47
+ * 否则 400–1200 区间内容会卡片/消息两边都不展示 */
48
+ export declare const PROGRESS_TAIL_CHARS = 400;
49
+ /** 独立结果消息的按钮化阈值(0.20.0):最终回复超过此字数不再直接发全文卡片,改为落盘 md
50
+ * + 「查看完整内容」按钮 + 确认/按意见修改引导——飞书单卡 30KB 上限与可读性都不允许长文
51
+ * 铺卡片,旧版 4000 字硬截断会静默丢内容。400~2000 字区间仍直接发全文卡片 */
52
+ export declare const LONG_OUTPUT_THRESHOLD = 2000;
28
53
  /** 图片卡片:caption(可选)显示在图片上方——逐张发图时带编号说明用 */
29
54
  export declare function buildImageCard(caption: string | undefined, imgKey: string): unknown;
30
- export declare function buildProgressCard(state: ProgressState): unknown;
55
+ /** 进度卡局部更新的固定组件 ID(cardkit element_id,长度限 1-20):状态主块 + 计时行。
56
+ * 局部更新只替换这两个 markdown 组件的 content,form/按钮区不触碰——用户在 plan 表单
57
+ * 输入框打的内容不会被状态心跳刷掉(整卡 PATCH 会重置全部客户端输入态) */
58
+ export declare const MAIN_ELEMENT_ID = "lcb_main";
59
+ export declare const TIMER_ELEMENT_ID = "lcb_timer";
60
+ export declare function buildProgressCard(state: ProgressState, widthMode?: 'default' | 'fill'): unknown;
61
+ /**
62
+ * 局部更新 actions(cardkit batch_update 的 partial_update_element):默认只替换状态主块与
63
+ * 计时行两个 markdown 组件的 content,form/按钮区完全不触碰——用户在 plan 意见输入框
64
+ * 里打的字不会被状态心跳刷掉。仅结构未变化时使用(结构变化走全量替换)。
65
+ * includeQaButtons=true 时追加 qa 选项按钮的局部替换(0.20.0:选中态变化不再触发全量
66
+ * 替换——那会清空 form 内未提交的自定义输入,改走按钮 element_id 级局部更新)。
67
+ */
68
+ export declare function buildPartialUpdateActions(state: ProgressState, includeQaButtons?: boolean): Array<{
69
+ action: string;
70
+ params: {
71
+ element_id: string;
72
+ partial_element: unknown;
73
+ };
74
+ }>;
31
75
  export declare const DECISION_TEXT: Record<PermissionDecision, string>;
32
76
  export interface PlanCardRequest {
33
77
  requestId: string;
@@ -35,20 +79,6 @@ export interface PlanCardRequest {
35
79
  workspaceName: string;
36
80
  }
37
81
  export type PlanCardDecision = Extract<CardDecision, `plan-${string}`>;
38
- /**
39
- * 计划确认卡片组:plan 超长时按 ~2800 字拆多张(首卡含表单容器,其余为纯正文续篇)。
40
- * 空白 plan 退化为单卡占位(模型未提交实质计划时用户只能放弃)。
41
- *
42
- * 首卡的按钮 + 意见输入框必须包在 tag:'form' 容器内、按钮带 form_action_type:'submit'——
43
- * 飞书卡片 2.0 中 input 值只有该结构下点击按钮才随 action.form_value 回传,
44
- * 平铺结构点击任何按钮 form_value 恒空(0.17.0 「按意见修改取不到意见」根因)。
45
- * 三个按钮都是 submit:批准/放弃忽略意见字段,input 不设 required。
46
- */
47
- export declare function buildPlanCards(req: PlanCardRequest): unknown[];
48
- /** 计划决策结果卡(决策后由回调响应内联 + 兜底 PATCH 首卡) */
49
- export declare function buildPlanResultCard(req: PlanCardRequest, decision: PlanCardDecision, byName: string, feedback?: string): unknown;
50
- /** 计划确认超时卡(此后迟到点击不再改写此卡片) */
51
- export declare function buildExpiredPlanCard(req: PlanCardRequest, timeoutMs: number): unknown;
52
82
  export interface QuestionCardRequest {
53
83
  requestId: string;
54
84
  questions: AskQuestionRequest['questions'];
@@ -56,12 +86,18 @@ export interface QuestionCardRequest {
56
86
  }
57
87
  /** 已选答案的中间态(wiring 侧维护):问题下标 → 选中的 option label(multiSelect 为数组) */
58
88
  export type QuestionCardAnswers = Record<number, string | string[]>;
89
+ export interface LongOutputCardRequest {
90
+ requestId: string;
91
+ /** 落盘的完整回复 md 路径(「查看完整内容」回调 send_file 用) */
92
+ filePath: string;
93
+ charCount: number;
94
+ workspaceName: string;
95
+ }
59
96
  /**
60
- * 提问卡片:每个问题一节(问题文本 + 选项按钮,每选项独占一行全宽、选中态打 ✓),
61
- * 底部「提交答案」按钮。选项点击仅更新选中态(PATCH 重渲染),全部问题有答案后提交才有效。
97
+ * 长回复收起卡:正文不进卡片(30KB 上限与可读性),「查看完整内容」按钮 send_file 发原文;
98
+ * 下方 form 提供后续引导——「确认方案 / 按意见修改」(点击即以对应 prompt 发起新一轮任务,
99
+ * wiring 侧经 outputPending 挂起项校验发起人),也可直接回复消息。
62
100
  */
63
- export declare function buildQuestionCard(req: QuestionCardRequest, answers: QuestionCardAnswers): unknown;
64
- /** 提交后的结果卡(展示每问的最终答案) */
65
- export declare function buildQuestionResultCard(req: QuestionCardRequest, answers: QuestionCardAnswers, byName: string): unknown;
66
- /** 提问超时卡(此后迟到点击不再改写此卡片) */
67
- export declare function buildExpiredQuestionCard(req: QuestionCardRequest, timeoutMs: number): unknown;
101
+ export declare function buildLongOutputCard(req: LongOutputCardRequest): unknown;
102
+ /** 长回复卡已处理态(确认/提意见后的回调响应内联换卡):保留查看按钮,决策按钮区收为一行文案 */
103
+ export declare function buildLongOutputSettledCard(req: LongOutputCardRequest, settledText: string): unknown;
@@ -1,8 +1,7 @@
1
- import { chunkText } from '../util/chunk-text.js';
2
1
  /** 子代理清单最多渲染条数(防爆卡片;超出折叠为「…等共 N 个」) */
3
2
  const AGENT_LIST_MAX = 5;
4
- function card(elements) {
5
- return { schema: '2.0', config: { update_multi: true }, body: { elements } };
3
+ function card(elements, widthMode = 'default') {
4
+ return { schema: '2.0', config: { update_multi: true, ...(widthMode === 'fill' ? { width_mode: 'fill' } : {}) }, body: { elements } };
6
5
  }
7
6
  function md(content) {
8
7
  return { tag: 'markdown', content };
@@ -10,8 +9,15 @@ function md(content) {
10
9
  export function buildTextCard(markdown) {
11
10
  return card([md(markdown)]);
12
11
  }
13
- /** 进度卡正文尾部的字符上限(防爆卡片);任务收尾据此判断短回复是否需要独立结果消息 */
14
- export const PROGRESS_TAIL_CHARS = 1200;
12
+ /** 进度卡终态结果尾部的字符上限(防爆卡片)。运行中不展示过程文本(产品决策:主卡只留
13
+ * 关键信息——状态/工具/子代理/确认区/计时;思考内容与过程文本一律不进卡),仅任务收尾
14
+ * 露出结果尾部。index.ts 以同一常量判断「短回复是否需要独立结果消息」,两处保持同值,
15
+ * 否则 400–1200 区间内容会卡片/消息两边都不展示 */
16
+ export const PROGRESS_TAIL_CHARS = 400;
17
+ /** 独立结果消息的按钮化阈值(0.20.0):最终回复超过此字数不再直接发全文卡片,改为落盘 md
18
+ * + 「查看完整内容」按钮 + 确认/按意见修改引导——飞书单卡 30KB 上限与可读性都不允许长文
19
+ * 铺卡片,旧版 4000 字硬截断会静默丢内容。400~2000 字区间仍直接发全文卡片 */
20
+ export const LONG_OUTPUT_THRESHOLD = 2000;
15
21
  /** 图片卡片:caption(可选)显示在图片上方——逐张发图时带编号说明用 */
16
22
  export function buildImageCard(caption, imgKey) {
17
23
  const elements = [];
@@ -20,7 +26,13 @@ export function buildImageCard(caption, imgKey) {
20
26
  elements.push({ tag: 'img', img_key: imgKey, alt: { tag: 'plain_text', content: caption ?? '图片' } });
21
27
  return card(elements);
22
28
  }
23
- export function buildProgressCard(state) {
29
+ /** 进度卡局部更新的固定组件 ID(cardkit element_id,长度限 1-20):状态主块 + 计时行。
30
+ * 局部更新只替换这两个 markdown 组件的 content,form/按钮区不触碰——用户在 plan 表单
31
+ * 输入框打的内容不会被状态心跳刷掉(整卡 PATCH 会重置全部客户端输入态) */
32
+ export const MAIN_ELEMENT_ID = 'lcb_main';
33
+ export const TIMER_ELEMENT_ID = 'lcb_timer';
34
+ /** 进度卡主块内容(标题/状态/工具行/子代理清单/收敛提示/终态结果尾部)——整卡渲染与局部更新共用 */
35
+ function buildMainLines(state) {
24
36
  const elapsed = Math.max(0, Math.floor((Date.now() - state.startedAt) / 1000));
25
37
  const duration = `${Math.floor(elapsed / 60)} 分 ${elapsed % 60} 秒`;
26
38
  const lines = [`**${state.title}**`, ``, state.status, ``];
@@ -50,10 +62,40 @@ export function buildProgressCard(state) {
50
62
  // 大量重叠(尤其 plan mode 下计划文本同时出现在正文与计划卡),收敛避免重复刷屏
51
63
  lines.push('---', `⏸ 正文已收起,等待下方确认后继续…`);
52
64
  }
53
- else if (state.textTail) {
54
- lines.push('---', `**📝 最新输出**`, state.textTail.slice(-PROGRESS_TAIL_CHARS)); // 只保留尾部,防爆卡片
65
+ else if (state.question) {
66
+ // 内嵌提问区同样收敛正文:选项已承载信息,正文尾部继续刷只会冲淡提问区
67
+ lines.push('---', `⏸ 正文已收起,等待下方问题作答后继续…`);
55
68
  }
56
- const elements = [md(lines.join('\n'))];
69
+ else if (state.plan) {
70
+ // 内嵌计划区同理收敛正文
71
+ lines.push('---', `⏸ 正文已收起,等待下方计划确认后继续…`);
72
+ }
73
+ else if (state.done && state.textTail) {
74
+ // 终态才展示结果尾部(产品决策:运行中过程文本不进卡片,主卡只留关键信息;思考内容
75
+ // 也不采集不展示)。textTail 仍保留全部内容(appendText 不断积累),超长部分由 index.ts
76
+ // 的独立结果消息承载(阈值与本常量同值),渲染层截断不丢内容
77
+ if (state.textTail.length > PROGRESS_TAIL_CHARS) {
78
+ const folded = state.textTail.length - PROGRESS_TAIL_CHARS;
79
+ lines.push('---', `**📝 结果**`, `<font color='grey'>⋯ 已折叠前面 ${folded} 字符</font>`, state.textTail.slice(-PROGRESS_TAIL_CHARS));
80
+ }
81
+ else {
82
+ lines.push('---', `**📝 结果**`, state.textTail);
83
+ }
84
+ }
85
+ return lines;
86
+ }
87
+ /** 计时行文案——整卡渲染与局部更新共用 */
88
+ function buildTimerLine(state) {
89
+ const elapsed = Math.max(0, Math.floor((Date.now() - state.startedAt) / 1000));
90
+ const duration = `${Math.floor(elapsed / 60)} 分 ${elapsed % 60} 秒`;
91
+ // 终态改为「总耗时」+ 完成时刻:运行中的「已运行」在停止刷新后读起来仍像在计时,任务
92
+ // 是否结束必须一眼可辨(用户分不清计时停了是完成还是卡死)
93
+ return state.done
94
+ ? `<font color='grey'>⏱ 总耗时 ${duration} · 已结束于 ${new Date().toLocaleTimeString('zh-CN', { hour12: false })}</font>`
95
+ : `<font color='grey'>⏱ 已运行 ${duration}</font>`;
96
+ }
97
+ export function buildProgressCard(state, widthMode = 'default') {
98
+ const elements = [{ tag: 'markdown', content: buildMainLines(state).join('\n'), element_id: MAIN_ELEMENT_ID }];
57
99
  // 工具确认区:嵌入进度卡(按钮在计时行上方)——不再单独发确认卡(旧版独立确认卡与
58
100
  // 进度卡正文内容重复、还会把进度卡顶出会话底部)
59
101
  if (state.confirm) {
@@ -77,14 +119,108 @@ export function buildProgressCard(state) {
77
119
  })),
78
120
  });
79
121
  }
122
+ // 内嵌计划确认区(#3+#6):方案正文不进卡片(产品决策:主卡不铺长内容),仅一行就绪提示 +
123
+ // 「查看完整方案」按钮(send_file 发送落盘的原 md)+ 表单(批准/放弃/按意见修改 + 意见输入框)。
124
+ // 用户动线:点按钮看方案文件 → 回卡片选操作
125
+ if (state.plan) {
126
+ elements.push(md(`**📋 执行计划已就绪**(共 ${state.plan.plan.length} 字)· 工作区 \`${state.plan.workspaceName}\`\n\n请先点击下方「📂 查看完整方案」阅读原文,再选择操作`));
127
+ elements.push({
128
+ tag: 'button',
129
+ text: { tag: 'plain_text', content: '📂 查看完整方案' },
130
+ type: 'default',
131
+ behaviors: [{ type: 'callback', value: { requestId: state.plan.requestId, decision: 'plan-view-file' } }],
132
+ });
133
+ elements.push({
134
+ tag: 'form',
135
+ name: 'plan_form',
136
+ elements: [
137
+ {
138
+ tag: 'column_set',
139
+ flex_mode: 'flow',
140
+ columns: [
141
+ { tag: 'column', width: 'auto', weight: 1, vertical_align: 'top', elements: [planButton('plan-approve', '✅ 批准执行', 'primary', state.plan.requestId, 'plan_btn_approve')] },
142
+ { tag: 'column', width: 'auto', weight: 1, vertical_align: 'top', elements: [planButton('plan-reject', '❌ 放弃计划', 'danger', state.plan.requestId, 'plan_btn_reject')] },
143
+ { tag: 'column', width: 'auto', weight: 1, vertical_align: 'top', elements: [planButton('plan-revise', '📝 按意见修改', 'default', state.plan.requestId, 'plan_btn_revise')] },
144
+ ],
145
+ },
146
+ { tag: 'input', name: 'feedback', width: 'fill', multiline: true, rows: 3, max_length: 1000, placeholder: { tag: 'plain_text', content: '修改意见(点「按意见修改」时随意见重新出计划,可多行)' } },
147
+ ],
148
+ });
149
+ }
150
+ // 内嵌提问确认区(#3 + 0.20.0):整个区域包进一个 form——飞书 input 值必须 form 容器 +
151
+ // submit 按钮才回传。每题:标题 + 选项按钮(普通 callback,仅 qa-pick 切选中态,不提交表单)
152
+ // + 自定义输入框(custom_N);底部「提交答案」为 submit 按钮,form_value 携带全部输入。
153
+ // 合并语义(wiring 侧):单选 custom 优先覆盖选项,多选 custom 追加进选中数组
154
+ if (state.question) {
155
+ const q = state.question;
156
+ const formElements = [
157
+ md(`**❓ Claude 需要你确认** · 工作区 \`${q.workspaceName}\`\n\n点选选项,或在每题下方输入框填写其他答案(单选:输入优先;多选:输入追加),完成后点「提交答案」`),
158
+ ];
159
+ q.questions.forEach((qq, qIndex) => {
160
+ const sel = q.answers[qIndex];
161
+ const picked = Array.isArray(sel) ? sel : sel !== undefined ? [sel] : [];
162
+ formElements.push(md(`**${qIndex + 1}. ${qq.question}**${qq.multiSelect ? '(可多选)' : ''}`));
163
+ qq.options.forEach((o, optIndex) => {
164
+ formElements.push(embeddedQaOptionButton(q.requestId, qIndex, optIndex, o.label, picked.includes(o.label)));
165
+ });
166
+ formElements.push({
167
+ tag: 'input',
168
+ name: `custom_${qIndex}`,
169
+ width: 'fill',
170
+ multiline: true,
171
+ rows: 2,
172
+ max_length: 500,
173
+ placeholder: { tag: 'plain_text', content: '其他答案(可选):单选时优先生效,多选时与选项合并' },
174
+ });
175
+ });
176
+ formElements.push({
177
+ tag: 'button',
178
+ // form 容器内交互组件 name 必填(卡片内全局唯一),否则 form 数据发送失败
179
+ name: 'qa_btn_submit',
180
+ text: { tag: 'plain_text', content: '✅ 提交答案' },
181
+ type: 'primary',
182
+ form_action_type: 'submit',
183
+ margin: '8px 0px 0px 0px',
184
+ behaviors: [{ type: 'callback', value: { requestId: q.requestId, decision: 'qa-submit' } }],
185
+ });
186
+ elements.push({ tag: 'form', name: 'qa_form', elements: formElements });
187
+ }
80
188
  // 计时行上方加分隔横线,与正文/确认区做视觉划分
81
189
  elements.push({ tag: 'hr' });
82
- // 终态改为「总耗时」+ 完成时刻:运行中的「已运行」在停止刷新后读起来仍像在计时,任务
83
- // 是否结束必须一眼可辨(用户分不清计时停了是完成还是卡死)
84
- elements.push(md(state.done
85
- ? `<font color='grey'>⏱ 总耗时 ${duration} · 已结束于 ${new Date().toLocaleTimeString('zh-CN', { hour12: false })}</font>`
86
- : `<font color='grey'>⏱ 已运行 ${duration}</font>`));
87
- return card(elements);
190
+ elements.push({ tag: 'markdown', content: buildTimerLine(state), element_id: TIMER_ELEMENT_ID });
191
+ return card(elements, widthMode);
192
+ }
193
+ /**
194
+ * 局部更新 actions(cardkit batch_update 的 partial_update_element):默认只替换状态主块与
195
+ * 计时行两个 markdown 组件的 content,form/按钮区完全不触碰——用户在 plan 意见输入框
196
+ * 里打的字不会被状态心跳刷掉。仅结构未变化时使用(结构变化走全量替换)。
197
+ * includeQaButtons=true 时追加 qa 选项按钮的局部替换(0.20.0:选中态变化不再触发全量
198
+ * 替换——那会清空 form 内未提交的自定义输入,改走按钮 element_id 级局部更新)。
199
+ */
200
+ export function buildPartialUpdateActions(state, includeQaButtons = false) {
201
+ const actions = [
202
+ { action: 'partial_update_element', params: { element_id: MAIN_ELEMENT_ID, partial_element: { content: buildMainLines(state).join('\n') } } },
203
+ { action: 'partial_update_element', params: { element_id: TIMER_ELEMENT_ID, partial_element: { content: buildTimerLine(state) } } },
204
+ ];
205
+ if (includeQaButtons && state.question) {
206
+ const q = state.question;
207
+ q.questions.forEach((qq, qIndex) => {
208
+ const sel = q.answers[qIndex];
209
+ const picked = Array.isArray(sel) ? sel : sel !== undefined ? [sel] : [];
210
+ qq.options.forEach((o, optIndex) => {
211
+ const selected = picked.includes(o.label);
212
+ actions.push({
213
+ action: 'partial_update_element',
214
+ params: {
215
+ element_id: qaOptionElementId(qIndex, optIndex),
216
+ // 按钮可局部更新的字段:文案(✓ 前缀)与样式(primary/default)
217
+ partial_element: { text: { tag: 'plain_text', content: selected ? `✓ ${o.label}` : o.label }, type: selected ? 'primary' : 'default' },
218
+ },
219
+ });
220
+ });
221
+ });
222
+ }
223
+ return actions;
88
224
  }
89
225
  export const DECISION_TEXT = {
90
226
  allow: '✅ 已允许',
@@ -111,71 +247,18 @@ function planButton(decision, label, type, requestId, name) {
111
247
  : {}),
112
248
  };
113
249
  }
114
- /**
115
- * 计划确认卡片组:plan 超长时按 ~2800 字拆多张(首卡含表单容器,其余为纯正文续篇)。
116
- * 空白 plan 退化为单卡占位(模型未提交实质计划时用户只能放弃)。
117
- *
118
- * 首卡的按钮 + 意见输入框必须包在 tag:'form' 容器内、按钮带 form_action_type:'submit'——
119
- * 飞书卡片 2.0 中 input 值只有该结构下点击按钮才随 action.form_value 回传,
120
- * 平铺结构点击任何按钮 form_value 恒空(0.17.0 「按意见修改取不到意见」根因)。
121
- * 三个按钮都是 submit:批准/放弃忽略意见字段,input 不设 required。
122
- */
123
- export function buildPlanCards(req) {
124
- const chunks = chunkText(req.plan, 2800);
125
- if (chunks.length === 0)
126
- chunks.push('(模型未提交计划正文)');
127
- return chunks.map((chunk, i) => {
128
- const header = chunks.length > 1
129
- ? `**📋 Claude 提交执行计划(${i + 1}/${chunks.length})**\n\n工作区: \`${req.workspaceName}\`\n`
130
- : `**📋 Claude 提交执行计划**\n\n工作区: \`${req.workspaceName}\`\n`;
131
- if (i === 0) {
132
- return card([
133
- md(`${header}${chunk}`),
134
- {
135
- tag: 'form',
136
- name: 'plan_form',
137
- elements: [
138
- {
139
- // 卡片 V2 已废弃 tag:'action',与确认卡同款 column_set 分栏按钮
140
- tag: 'column_set',
141
- flex_mode: 'flow',
142
- columns: [
143
- { tag: 'column', width: 'auto', weight: 1, vertical_align: 'top', elements: [planButton('plan-approve', '✅ 批准执行', 'primary', req.requestId, 'plan_btn_approve')] },
144
- { tag: 'column', width: 'auto', weight: 1, vertical_align: 'top', elements: [planButton('plan-reject', '❌ 放弃计划', 'danger', req.requestId, 'plan_btn_reject')] },
145
- { tag: 'column', width: 'auto', weight: 1, vertical_align: 'top', elements: [planButton('plan-revise', '📝 按意见修改', 'default', req.requestId, 'plan_btn_revise')] },
146
- ],
147
- },
148
- // 意见输入框在按钮行下方:先决策后补意见的视觉动线(name=feedback 随 form_value 回传)
149
- {
150
- tag: 'input',
151
- name: 'feedback',
152
- width: 'fill',
153
- placeholder: { tag: 'plain_text', content: '修改意见(点「按意见修改」时随意见重新出计划)' },
154
- },
155
- ],
156
- },
157
- ]);
158
- }
159
- return card([md(`${header}${chunk}`)]);
160
- });
161
- }
162
- /** 计划决策结果卡(决策后由回调响应内联 + 兜底 PATCH 首卡) */
163
- export function buildPlanResultCard(req, decision, byName, feedback) {
164
- const text = decision === 'plan-approve'
165
- ? `✅ 计划已批准,开始执行(由 ${byName} 操作)`
166
- : decision === 'plan-revise'
167
- ? `📝 已提交修改意见,Claude 将修订计划后重新提交(由 ${byName} 操作):\n${(feedback ?? '').slice(0, 500)}`
168
- : `❌ 计划已放弃(由 ${byName} 操作)`;
169
- return card([md(`**📋 Claude 提交执行计划**\n\n工作区: \`${req.workspaceName}\`\n\n${text}`)]);
250
+ /** qa 选项按钮的 cardkit element_id(局部更新定位用):字母开头/仅字母数字下划线/≤20 字符 */
251
+ function qaOptionElementId(qIndex, optIndex) {
252
+ return `qa_opt_${qIndex}_${optIndex}`;
170
253
  }
171
- /** 计划确认超时卡(此后迟到点击不再改写此卡片) */
172
- export function buildExpiredPlanCard(req, timeoutMs) {
173
- return card([md(`**📋 Claude 提交执行计划**\n\n工作区: \`${req.workspaceName}\`\n\n⏰ 已超时自动放弃(${Math.round(timeoutMs / 60000)} 分钟未确认)`)]);
174
- }
175
- function qaOptionButton(reqId, qIndex, label, selected) {
254
+ /** 内嵌提问按钮(qa-pick callback):form 内普通回传按钮(不带 form_action_type,点击仅切换
255
+ * 选中态不提交表单);name/element_id 必备——前者是 form 数据回传要求,后者供 cardkit
256
+ * partial_update_element 局部替换选中态视觉(✓ + primary),不清空 form 内未提交输入 */
257
+ function embeddedQaOptionButton(reqId, qIndex, optIndex, label, selected) {
176
258
  return {
177
259
  tag: 'button',
178
- // 全宽单行:选项文字完整可见(横排 flow 分栏长文本会被 ellipsis 截断,看不全无法决策)
260
+ name: `qa_pick_${qIndex}_${optIndex}`,
261
+ element_id: qaOptionElementId(qIndex, optIndex),
179
262
  width: 'fill',
180
263
  text: { tag: 'plain_text', content: selected ? `✓ ${label}` : label },
181
264
  type: selected ? 'primary' : 'default',
@@ -183,40 +266,48 @@ function qaOptionButton(reqId, qIndex, label, selected) {
183
266
  };
184
267
  }
185
268
  /**
186
- * 提问卡片:每个问题一节(问题文本 + 选项按钮,每选项独占一行全宽、选中态打 ✓),
187
- * 底部「提交答案」按钮。选项点击仅更新选中态(PATCH 重渲染),全部问题有答案后提交才有效。
269
+ * 长回复收起卡:正文不进卡片(30KB 上限与可读性),「查看完整内容」按钮 send_file 发原文;
270
+ * 下方 form 提供后续引导——「确认方案 / 按意见修改」(点击即以对应 prompt 发起新一轮任务,
271
+ * wiring 侧经 outputPending 挂起项校验发起人),也可直接回复消息。
188
272
  */
189
- export function buildQuestionCard(req, answers) {
190
- const elements = [md(`**❓ Claude 需要你确认**\n\n工作区: \`${req.workspaceName}\``)];
191
- req.questions.forEach((q, qIndex) => {
192
- const sel = answers[qIndex];
193
- const picked = Array.isArray(sel) ? sel : sel !== undefined ? [sel] : [];
194
- elements.push(md(`**${qIndex + 1}. ${q.question}**${q.multiSelect ? '(可多选)' : ''}`));
195
- // JSON 2.0 按钮可直接放 elements:逐个纵排替代旧 column_set flow 横排
196
- for (const o of q.options) {
197
- elements.push(qaOptionButton(req.requestId, qIndex, o.label, picked.includes(o.label)));
198
- }
199
- });
200
- elements.push({
201
- tag: 'button',
202
- text: { tag: 'plain_text', content: '✅ 提交答案' },
203
- type: 'primary',
204
- margin: '8px 0px 0px 0px',
205
- behaviors: [{ type: 'callback', value: { requestId: req.requestId, decision: 'qa-submit' } }],
206
- });
273
+ export function buildLongOutputCard(req) {
274
+ const elements = [
275
+ md(`**📄 回复较长已收起**(共 ${req.charCount} 字)· 工作区 \`${req.workspaceName}\`\n\n请先点击「📂 查看完整内容」阅读全文,再选择后续操作;也可直接回复消息(确认或提意见均可)`),
276
+ {
277
+ tag: 'button',
278
+ text: { tag: 'plain_text', content: '📂 查看完整内容' },
279
+ type: 'default',
280
+ behaviors: [{ type: 'callback', value: { requestId: req.requestId, decision: 'view-output-file', filePath: req.filePath } }],
281
+ },
282
+ {
283
+ tag: 'form',
284
+ name: 'output_form',
285
+ elements: [
286
+ {
287
+ tag: 'column_set',
288
+ flex_mode: 'flow',
289
+ columns: [
290
+ { tag: 'column', width: 'auto', weight: 1, vertical_align: 'top', elements: [planButton('output-confirm', '✅ 确认方案', 'primary', req.requestId, 'out_btn_confirm')] },
291
+ { tag: 'column', width: 'auto', weight: 1, vertical_align: 'top', elements: [planButton('output-revise', '✏️ 按意见修改', 'default', req.requestId, 'out_btn_revise')] },
292
+ ],
293
+ },
294
+ { tag: 'input', name: 'feedback', width: 'fill', multiline: true, rows: 2, max_length: 1000, placeholder: { tag: 'plain_text', content: '修改意见(点「按意见修改」时生效,可多行)' } },
295
+ ],
296
+ },
297
+ ];
207
298
  return card(elements);
208
299
  }
209
- /** 提交后的结果卡(展示每问的最终答案) */
210
- export function buildQuestionResultCard(req, answers, byName) {
211
- const lines = req.questions.map((q, i) => {
212
- const a = answers[i];
213
- const ans = a === undefined ? '(未作答)' : Array.isArray(a) ? a.join('、') : a;
214
- return `- ${q.question} → **${ans}**`;
215
- });
216
- return card([md(`**❓ Claude 需要你确认**\n\n工作区: \`${req.workspaceName}\`\n\n${lines.join('\n')}\n\n✅ 答案已提交(由 ${byName} 操作)`)]);
217
- }
218
- /** 提问超时卡(此后迟到点击不再改写此卡片) */
219
- export function buildExpiredQuestionCard(req, timeoutMs) {
220
- return card([md(`**❓ Claude 需要你确认**\n\n工作区: \`${req.workspaceName}\`\n\n⏰ 已超时自动跳过(${Math.round(timeoutMs / 60000)} 分钟未响应),Claude 将自行决策继续`)]);
300
+ /** 长回复卡已处理态(确认/提意见后的回调响应内联换卡):保留查看按钮,决策按钮区收为一行文案 */
301
+ export function buildLongOutputSettledCard(req, settledText) {
302
+ return card([
303
+ md(`**📄 回复较长已收起**(共 ${req.charCount} 字)· 工作区 \`${req.workspaceName}\``),
304
+ {
305
+ tag: 'button',
306
+ text: { tag: 'plain_text', content: '📂 查看完整内容' },
307
+ type: 'default',
308
+ behaviors: [{ type: 'callback', value: { requestId: req.requestId, decision: 'view-output-file', filePath: req.filePath } }],
309
+ },
310
+ md(settledText),
311
+ ]);
221
312
  }
222
313
  //# sourceMappingURL=card-builder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"card-builder.js","sourceRoot":"","sources":["../../src/gateway/card-builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AA0BlD,uCAAuC;AACvC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB,SAAS,IAAI,CAAC,QAAmB;IAC/B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC;AAC/E,CAAC;AACD,SAAS,EAAE,CAAC,OAAe;IACzB,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACtC,CAAC;AACD,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AACD,+CAA+C;AAC/C,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACxC,2CAA2C;AAC3C,MAAM,UAAU,cAAc,CAAC,OAA2B,EAAE,MAAc;IACxE,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,OAAO;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;IACrG,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC;AACxB,CAAC;AACD,MAAM,UAAU,iBAAiB,CAAC,KAAoB;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC/E,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,MAAM,OAAO,GAAG,EAAE,IAAI,CAAC;IACnE,MAAM,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC3D,IAAI,KAAK,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3D,+CAA+C;IAC/C,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,KAAK,GAA2C,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QACrG,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QAChH,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;gBACrE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC/E,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC5E,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,cAAc;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;QAC3E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,0CAA0C;QAC1C,+CAA+C;QAC/C,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC;IAC1C,CAAC;SAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,aAAa;IAC7F,CAAC;IACD,MAAM,QAAQ,GAAc,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnD,2CAA2C;IAC3C,0BAA0B;IAC1B,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI;YAC7B,CAAC,CAAC,eAAe,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU;YAC5D,CAAC,CAAC,WAAW,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC;QAC9D,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,0BAA0B,KAAK,CAAC,OAAO,CAAC,QAAQ,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QACjF,MAAM,MAAM,GAAG,CAAC,QAA4C,EAAE,EAAE,CAAC,CAAC;YAChE,GAAG,EAAE,QAAQ;YACb,IAAI,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE;YACjH,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YACnF,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,OAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC;SAC5F,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC;YACZ,qDAAqD;YACrD,GAAG,EAAE,YAAY;YACjB,SAAS,EAAE,MAAM;YACjB,OAAO,EAAG,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,CAAW,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACxE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK;gBAC9D,QAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;aAC7B,CAAC,CAAC;SACJ,CAAC,CAAC;IACL,CAAC;IACD,0BAA0B;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7B,6CAA6C;IAC7C,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI;QACzB,CAAC,CAAC,4BAA4B,QAAQ,WAAW,IAAI,IAAI,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,SAAS;QACnH,CAAC,CAAC,4BAA4B,QAAQ,SAAS,CAAC,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC;AACxB,CAAC;AACD,MAAM,CAAC,MAAM,aAAa,GAAuC;IAC/D,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,OAAO;IACb,eAAe,EAAE,YAAY;CAC9B,CAAC;AAQF,SAAS,UAAU,CAAC,QAA0B,EAAE,KAAa,EAAE,IAAY,EAAE,SAAiB,EAAE,IAAY;IAC1G,OAAO;QACL,GAAG,EAAE,QAAQ;QACb,yDAAyD;QACzD,IAAI;QACJ,IAAI,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE;QAC3C,IAAI;QACJ,gBAAgB,EAAE,QAAQ;QAC1B,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC;QACjE,yCAAyC;QACzC,GAAG,CAAC,QAAQ,KAAK,aAAa;YAC5B,CAAC,CAAC;gBACA,OAAO,EAAE;oBACP,KAAK,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE;oBAChD,IAAI,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,8BAA8B,EAAE;iBACrE;aACF;YACD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,GAAoB;IACjD,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC;YAC9B,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,aAAa,MAAM;YACtF,CAAC,CAAC,kCAAkC,GAAG,CAAC,aAAa,MAAM,CAAC;QAC9D,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;gBACV,EAAE,CAAC,GAAG,MAAM,GAAG,KAAK,EAAE,CAAC;gBACvB;oBACE,GAAG,EAAE,MAAM;oBACX,IAAI,EAAE,WAAW;oBACjB,QAAQ,EAAE;wBACR;4BACE,gDAAgD;4BAChD,GAAG,EAAE,YAAY;4BACjB,SAAS,EAAE,MAAM;4BACjB,OAAO,EAAE;gCACP,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,EAAE;gCAClK,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,EAAE;gCAC/J,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,EAAE;6BACnK;yBACF;wBACD,0DAA0D;wBAC1D;4BACE,GAAG,EAAE,OAAO;4BACZ,IAAI,EAAE,UAAU;4BAChB,KAAK,EAAE,MAAM;4BACb,WAAW,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,yBAAyB,EAAE;yBACvE;qBACF;iBACF;aACF,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,mBAAmB,CAAC,GAAoB,EAAE,QAA0B,EAAE,MAAc,EAAE,QAAiB;IACrH,MAAM,IAAI,GAAG,QAAQ,KAAK,cAAc;QACtC,CAAC,CAAC,kBAAkB,MAAM,MAAM;QAChC,CAAC,CAAC,QAAQ,KAAK,aAAa;YAC1B,CAAC,CAAC,kCAAkC,MAAM,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;YACpF,CAAC,CAAC,aAAa,MAAM,MAAM,CAAC;IAChC,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,kCAAkC,GAAG,CAAC,aAAa,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACxF,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,oBAAoB,CAAC,GAAoB,EAAE,SAAiB;IAC1E,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,kCAAkC,GAAG,CAAC,aAAa,mBAAmB,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAClI,CAAC;AAaD,SAAS,cAAc,CAAC,KAAa,EAAE,MAAc,EAAE,KAAa,EAAE,QAAiB;IACrF,OAAO;QACL,GAAG,EAAE,QAAQ;QACb,qDAAqD;QACrD,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE;QACrE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QACtC,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;KACpH,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAwB,EAAE,OAA4B;IACtF,MAAM,QAAQ,GAAc,CAAC,EAAE,CAAC,gCAAgC,GAAG,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC;IACxF,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAClC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACrF,sDAAsD;QACtD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YAC1B,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,IAAI,CAAC;QACZ,GAAG,EAAE,QAAQ;QACb,IAAI,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC9C,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,iBAAiB;QACzB,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAoB,EAAE,EAAE,CAAC;KACvG,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC;AACxB,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,uBAAuB,CAAC,GAAwB,EAAE,OAA4B,EAAE,MAAc;IAC5G,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,GAAG,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,OAAO,KAAK,CAAC,CAAC,QAAQ,QAAQ,GAAG,IAAI,CAAC;IACxC,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,gCAAgC,GAAG,CAAC,aAAa,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;AAC7H,CAAC;AAED,2BAA2B;AAC3B,MAAM,UAAU,wBAAwB,CAAC,GAAwB,EAAE,SAAiB;IAClF,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,gCAAgC,GAAG,CAAC,aAAa,mBAAmB,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;AAC/I,CAAC"}
1
+ {"version":3,"file":"card-builder.js","sourceRoot":"","sources":["../../src/gateway/card-builder.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- // 汇总 diff 收尾卡片:code-dev 工作区任务完成后替代整文件上传——只发「改了什么」,
1
+ // 汇总 diff 收尾卡片:git 仓库工作区任务完成后替代整文件上传——只发「改了什么」,
2
2
  // 多文件 diff 合并展示,超长按块拆多张卡(复用 chunkText 贪心分块)
3
3
  import { chunkText } from '../util/chunk-text.js';
4
4
  /** 从 unified diff 文本统计改动规模:+/− 行数(排除 +++/--- 文件头) */
@@ -1 +1 @@
1
- {"version":3,"file":"diff-card.js","sourceRoot":"","sources":["../../src/gateway/diff-card.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,4CAA4C;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAIlD,qDAAqD;AACrD,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,SAAS;QAC/D,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,EAAE,CAAC;aACjC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,EAAE,CAAC;IAC7C,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAClC,CAAC;AAED,6CAA6C;AAC7C,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAElC;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,IAAqB;IAC3E,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,sBAAsB,IAAI,CAAC,aAAa,SAAS,IAAI,CAAC,KAAK,WAAW,SAAS,OAAO,SAAS,QAAQ,CAAC;IACtH,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,eAAe,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,OAAO,qBAAqB,KAAK,UAAU,CAAC;QAC3H,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;IAC/G,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"diff-card.js","sourceRoot":"","sources":["../../src/gateway/diff-card.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,4CAA4C;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAIlD,qDAAqD;AACrD,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,SAAS;QAC/D,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,EAAE,CAAC;aACjC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,EAAE,CAAC;IAC7C,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAClC,CAAC;AAED,6CAA6C;AAC7C,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAElC;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,IAAqB;IAC3E,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,sBAAsB,IAAI,CAAC,aAAa,SAAS,IAAI,CAAC,KAAK,WAAW,SAAS,OAAO,SAAS,QAAQ,CAAC;IACtH,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,eAAe,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,OAAO,qBAAqB,KAAK,UAAU,CAAC;QAC3H,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;IAC/G,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -102,12 +102,15 @@ export interface FeishuSdk {
102
102
  request(payload: {
103
103
  method: string;
104
104
  url: string;
105
+ params?: Record<string, unknown>;
106
+ data?: unknown;
105
107
  }): Promise<{
106
108
  code?: number;
107
109
  msg?: string;
108
110
  bot?: {
109
111
  open_id?: string;
110
112
  };
113
+ data?: Record<string, unknown>;
111
114
  }>;
112
115
  };
113
116
  Domain: {
@@ -179,6 +182,12 @@ export declare class FeishuGateway {
179
182
  * 单张失败仅 warn 记录、不阻塞其余图片与消息转发(im:resource 权限缺失等场景文字任务照常)。
180
183
  */
181
184
  private downloadImages;
185
+ /**
186
+ * 拉取回复链上游消息文本(#5):用户回复某条消息时把上游最多 3 条消息文本一并拼进 prompt。
187
+ * SDK 1.73.0 未封装 im.message.get(只有 list/create/patch/delete),经 Client.request 调
188
+ * GET /open-apis/im/v1/messages/:message_id。失败仅 warn,不阻断主消息流(拉不到时降级为只发当前消息)
189
+ */
190
+ private fetchUpstreamChain;
182
191
  /** 建立 WS 长连接并注册事件分发(im.message.receive_v1 / card.action.trigger) */
183
192
  start(handlers: GatewayHandlers): Promise<void>;
184
193
  /** 优雅关闭长连接(SIGINT/SIGTERM 时逐个 app 调用);未 start 时为 no-op */
@@ -189,6 +198,24 @@ export declare class FeishuGateway {
189
198
  sendText(chatId: string, markdown: string): Promise<string>;
190
199
  /** 更新已发送卡片(流式进度刷新) */
191
200
  updateCard(messageId: string, card: unknown): Promise<void>;
201
+ /**
202
+ * 创建卡片实体并发送(cardkit 实体模式):实体卡片支持 batch_update 局部更新——
203
+ * 状态刷新只改指定 element_id 的组件,plan 表单输入框的用户输入不会被心跳刷掉
204
+ * (整卡 PATCH 会重置全部客户端输入态)。需开通 cardkit:card:write 权限;
205
+ * 调用方(ProgressCard.start)捕获失败后自动降级普通卡片 + 整卡 PATCH。
206
+ */
207
+ sendCardEntity(chatId: string, card: unknown): Promise<{
208
+ messageId: string;
209
+ cardId: string;
210
+ }>;
211
+ /** 卡片实体局部更新(batch_update + partial_update_element):只改 actions 指定组件,其余区域不动 */
212
+ partialUpdateCardElements(cardId: string, sequence: number, actions: unknown[]): Promise<void>;
213
+ /** 卡片实体全量替换(结构变化:交互区增删/终态/选中态),data 为新卡片 JSON。
214
+ * ⚠️ 更新口请求体形状与创建口不同:创建(POST /cards)是顶层 {type,data},
215
+ * 更新(PUT /cards/:id)须把 {type,data} 嵌套在 card 字段下、sequence 同级——
216
+ * 发创建式字段会被飞书直接 400(card is required),所有结构变化(confirm/plan/
217
+ * question 区、终态)都渲染不上屏,且结构签名不变回来前连计时局部更新也一并停摆 */
218
+ replaceCardEntity(cardId: string, sequence: number, card: unknown): Promise<void>;
192
219
  /** 撤回消息(进度卡沉底用:删旧卡后重发,保持进度卡始终在会话最底部) */
193
220
  deleteCard(messageId: string): Promise<void>;
194
221
  /**