larkcc 0.4.0 → 0.6.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 (56) hide show
  1. package/CHANGELOG.md +61 -12
  2. package/README.md +188 -27
  3. package/dist/agent.d.ts +2 -1
  4. package/dist/agent.js +189 -38
  5. package/dist/agent.js.map +1 -1
  6. package/dist/app.js +14 -5
  7. package/dist/app.js.map +1 -1
  8. package/dist/cardkit.d.ts +125 -0
  9. package/dist/cardkit.js +448 -0
  10. package/dist/cardkit.js.map +1 -0
  11. package/dist/config.d.ts +23 -3
  12. package/dist/config.js +43 -47
  13. package/dist/config.js.map +1 -1
  14. package/dist/feishu.d.ts +50 -4
  15. package/dist/feishu.js +287 -97
  16. package/dist/feishu.js.map +1 -1
  17. package/dist/format/builder.d.ts +126 -37
  18. package/dist/format/builder.js +276 -116
  19. package/dist/format/builder.js.map +1 -1
  20. package/dist/format/card-optimize.d.ts +42 -0
  21. package/dist/format/card-optimize.js +74 -0
  22. package/dist/format/card-optimize.js.map +1 -0
  23. package/dist/format/constants.d.ts +80 -9
  24. package/dist/format/constants.js +140 -53
  25. package/dist/format/constants.js.map +1 -1
  26. package/dist/format/document.d.ts +4 -2
  27. package/dist/format/document.js +57 -35
  28. package/dist/format/document.js.map +1 -1
  29. package/dist/format/duration.d.ts +24 -0
  30. package/dist/format/duration.js +72 -0
  31. package/dist/format/duration.js.map +1 -0
  32. package/dist/format/guide.d.ts +19 -0
  33. package/dist/format/guide.js +201 -0
  34. package/dist/format/guide.js.map +1 -0
  35. package/dist/format/image-resolver.d.ts +31 -0
  36. package/dist/format/image-resolver.js +202 -0
  37. package/dist/format/image-resolver.js.map +1 -0
  38. package/dist/format/index.d.ts +8 -3
  39. package/dist/format/index.js +8 -2
  40. package/dist/format/index.js.map +1 -1
  41. package/dist/format/parser.d.ts +16 -0
  42. package/dist/format/parser.js +26 -12
  43. package/dist/format/parser.js.map +1 -1
  44. package/dist/format/sanitize.d.ts +3 -0
  45. package/dist/format/sanitize.js +16 -7
  46. package/dist/format/sanitize.js.map +1 -1
  47. package/dist/format/thinking.d.ts +29 -0
  48. package/dist/format/thinking.js +50 -0
  49. package/dist/format/thinking.js.map +1 -0
  50. package/dist/resources/format-guide.md +109 -0
  51. package/dist/streaming.d.ts +83 -0
  52. package/dist/streaming.js +301 -0
  53. package/dist/streaming.js.map +1 -0
  54. package/dist/version.d.ts +1 -1
  55. package/dist/version.js +1 -1
  56. package/package.json +5 -4
@@ -0,0 +1,448 @@
1
+ /**
2
+ * CardKit 流式卡片控制器
3
+ *
4
+ * 单卡片架构,对齐飞书官方 OpenClaw 方案。
5
+ * 全程只有一个卡片消息,通过 CardKit API 实现打字机效果。
6
+ * 工具调用状态作为前缀拼接在流式内容中,thinking 和最终回答在同一卡片内展示。
7
+ *
8
+ * API 调用链参考飞书官方 openclaw-lark 项目:
9
+ * https://github.com/larksuite/openclaw-lark
10
+ *
11
+ * 状态机:idle → creating → streaming → completed / aborted
12
+ *
13
+ * API 调用链(使用 SDK CardKit 客户端):
14
+ * 1. client.cardkit.v1.card.create() → 创建卡片实体
15
+ * 2. im.message.reply({ card_id }) → 发送消息引用卡片
16
+ * 3. client.cardkit.v1.cardElement.content() → 流式打字机
17
+ * 4. client.cardkit.v1.card.settings() → 关闭 streaming_mode
18
+ * 5. client.cardkit.v1.card.update() → 最终更新卡片内容
19
+ */
20
+ import { optimizeForCard } from "./format/card-optimize.js";
21
+ import { stripThinking } from "./format/thinking.js";
22
+ import { buildThinkingPanel } from "./format/duration.js";
23
+ import { replyFinalCard, prepareOverflowContext, createOverflowDocument, registerDocument } from "./feishu.js";
24
+ import { FlushController } from "./streaming.js";
25
+ import { countTables } from "./format/index.js";
26
+ // ── 常量 ──────────────────────────────────────────────────
27
+ const TRUNCATE_LIMIT = 4000;
28
+ // ── CardKit API 错误 ──────────────────────────────────────
29
+ class CardKitApiError extends Error {
30
+ code;
31
+ constructor(code, msg, context) {
32
+ super(`${context} failed (${code}): ${msg}`);
33
+ this.name = "CardKitApiError";
34
+ this.code = code;
35
+ }
36
+ get isRateLimit() {
37
+ return this.code === 230020;
38
+ }
39
+ get isTableLimit() {
40
+ return this.code === 230099 || this.code === 11310;
41
+ }
42
+ }
43
+ /**
44
+ * 检查 SDK 响应中的错误码,返回 CardKitApiError 或 null
45
+ */
46
+ function checkCardKitError(response, context) {
47
+ if (response?.code !== undefined && response.code !== 0) {
48
+ return new CardKitApiError(response.code, response.msg ?? "unknown", context);
49
+ }
50
+ return null;
51
+ }
52
+ // ── 控制器 ──────────────────────────────────────────────────
53
+ export class CardKitController {
54
+ phase = "idle";
55
+ client;
56
+ rootMsgId;
57
+ cardTitle;
58
+ thinkingEnabled;
59
+ context;
60
+ cardId = null;
61
+ streamElementId = "streaming_content";
62
+ sequence = 0;
63
+ statusText = "";
64
+ apiMutex = Promise.resolve();
65
+ flushCtrl;
66
+ constructor(params) {
67
+ this.client = params.client;
68
+ this.rootMsgId = params.rootMsgId;
69
+ this.cardTitle = params.cardTitle;
70
+ this.thinkingEnabled = params.thinkingEnabled;
71
+ this.context = params.context;
72
+ this.flushCtrl = new FlushController({
73
+ minIntervalMs: params.intervalMs,
74
+ onFlush: (content) => this.performFlush(content),
75
+ onError: (error) => {
76
+ console.error("[CARDKIT] Flush failed:", error);
77
+ },
78
+ });
79
+ }
80
+ // ── 公共方法 ──────────────────────────────────────────────
81
+ /**
82
+ * 追加文本内容(thinking 或正文)
83
+ * 首次调用时自动创建卡片
84
+ */
85
+ async append(text) {
86
+ if (this.phase === "completed" || this.phase === "aborted")
87
+ return;
88
+ await this.ensureCardCreated();
89
+ if (this.phase !== "streaming")
90
+ return;
91
+ this.flushCtrl.append(text);
92
+ }
93
+ /**
94
+ * 互斥执行 API 调用,防止 sequence 乱序
95
+ */
96
+ async withMutex(fn) {
97
+ const prev = this.apiMutex;
98
+ let resolve;
99
+ this.apiMutex = new Promise(r => { resolve = r; });
100
+ await prev;
101
+ try {
102
+ return await fn();
103
+ }
104
+ catch (err) {
105
+ console.error("[CARDKIT] withMutex error:", err);
106
+ throw err;
107
+ }
108
+ finally {
109
+ resolve();
110
+ }
111
+ }
112
+ /**
113
+ * 两步关闭:关闭 streaming_mode → 更新最终卡片内容(对齐 openclaw-lark)
114
+ */
115
+ async closeAndFinalize(cardJson) {
116
+ await this.withMutex(async () => {
117
+ this.sequence++;
118
+ await this.closeStreamingMode();
119
+ this.sequence++;
120
+ await this.updateCard(cardJson);
121
+ });
122
+ }
123
+ /**
124
+ * 设置工具状态文本(拼接在流式内容前缀)
125
+ * 传空字符串清除状态
126
+ */
127
+ async updateStatus(text) {
128
+ this.statusText = text;
129
+ if (this.phase === "completed" || this.phase === "aborted")
130
+ return;
131
+ await this.ensureCardCreated();
132
+ if (this.phase === "streaming") {
133
+ await this.flushCtrl.flush();
134
+ }
135
+ }
136
+ /**
137
+ * 清除工具状态
138
+ */
139
+ async clearStatus() {
140
+ this.statusText = "";
141
+ if (this.phase === "streaming") {
142
+ await this.flushCtrl.flush();
143
+ }
144
+ }
145
+ /**
146
+ * 完成:关闭 streaming_mode,写入最终内容
147
+ */
148
+ async complete(finalContent, options) {
149
+ if (this.phase === "completed")
150
+ return;
151
+ this.flushCtrl.stop();
152
+ this.statusText = "";
153
+ // 卡片未创建成功或创建失败,降级为普通消息
154
+ if (!this.cardId || this.phase === "aborted") {
155
+ this.phase = "completed";
156
+ const fallbackOptions = { ...options, metadata: this.appendFallbackHint(options?.metadata) };
157
+ await replyFinalCard(this.client, this.context.chatId, this.rootMsgId, finalContent, this.context, fallbackOptions);
158
+ return;
159
+ }
160
+ // 构建最终内容(含 metadata)
161
+ let content = finalContent;
162
+ if (options?.metadata) {
163
+ content += `\n\n---\n${options.metadata}`;
164
+ }
165
+ // ── 溢出检查(在 optimizeForCard 之前,避免溢出路径的无用计算) ──
166
+ const threshold = this.context.overflow.document.threshold;
167
+ const tableCount = countTables(finalContent);
168
+ const maxTables = this.context.card_table?.max_tables_per_card ?? 5;
169
+ if (content.length > threshold || tableCount > maxTables) {
170
+ await this.handleOverflow(finalContent, options);
171
+ this.phase = "completed";
172
+ return;
173
+ }
174
+ // ── 正常完成:两步关闭(对齐 openclaw-lark) ──
175
+ const optimized = optimizeForCard(content);
176
+ const extraElements = this.buildThinkingElements(options?.thinking, options?.reasoningElapsedMs);
177
+ try {
178
+ const finalCardJson = this.buildFinalCard(optimized, extraElements);
179
+ await this.closeAndFinalize(finalCardJson);
180
+ }
181
+ catch (error) {
182
+ console.error("[CARDKIT] Final update failed, sending as new message:", error);
183
+ const fallbackOptions = { ...options, metadata: this.appendFallbackHint(options?.metadata) };
184
+ await replyFinalCard(this.client, this.context.chatId, this.rootMsgId, finalContent, this.context, fallbackOptions);
185
+ }
186
+ this.phase = "completed";
187
+ }
188
+ /**
189
+ * 中断:保留已有内容,构建完整终态卡片(对齐 openclaw-lark)
190
+ */
191
+ async abort(options) {
192
+ if (this.phase === "completed" || this.phase === "aborted")
193
+ return;
194
+ this.flushCtrl.stop();
195
+ this.statusText = "";
196
+ this.phase = "aborted";
197
+ if (!this.cardId)
198
+ return;
199
+ const text = options?.content || "⏹ 任务已中断";
200
+ const optimized = optimizeForCard(text);
201
+ const extraElements = this.buildThinkingElements(options?.thinking, options?.reasoningElapsedMs);
202
+ try {
203
+ const abortCardJson = this.buildFinalCard(optimized, extraElements);
204
+ await this.closeAndFinalize(abortCardJson);
205
+ }
206
+ catch (error) {
207
+ console.error("[CARDKIT] Abort update failed:", error);
208
+ }
209
+ }
210
+ /**
211
+ * 卡片是否创建失败(用于降级判断)
212
+ */
213
+ isDisabled() {
214
+ return this.phase === "aborted" && !this.cardId;
215
+ }
216
+ /**
217
+ * 在现有 metadata 后追加降级提示
218
+ */
219
+ appendFallbackHint(existing) {
220
+ const hint = "⚠️ 卡片模式不可用,已降级为普通消息";
221
+ return existing ? `${existing}\n${hint}` : hint;
222
+ }
223
+ // ── 卡片创建(懒触发) ────────────────────────────────────
224
+ async ensureCardCreated() {
225
+ if (this.phase === "streaming")
226
+ return;
227
+ if (this.phase === "creating") {
228
+ while (this.phase === "creating") {
229
+ await new Promise(r => setTimeout(r, 50));
230
+ }
231
+ return;
232
+ }
233
+ this.phase = "creating";
234
+ try {
235
+ await this.createCardEntity();
236
+ await this.sendCardMessage();
237
+ this.flushCtrl.start();
238
+ this.phase = "streaming";
239
+ }
240
+ catch (error) {
241
+ console.error("[CARDKIT] Card creation failed:", error);
242
+ this.phase = "aborted";
243
+ }
244
+ }
245
+ /**
246
+ * 创建 CardKit 卡片实体(使用 SDK)
247
+ *
248
+ * 对齐 openclaw-lark:
249
+ * - config: streaming_mode, wide_screen_mode, update_multi
250
+ * - summary: 对象格式 { content, i18n_content }
251
+ * - 单元素架构:只有 streaming_content,工具状态作为前缀拼接
252
+ */
253
+ async createCardEntity() {
254
+ const cardJson = {
255
+ schema: "2.0",
256
+ config: {
257
+ streaming_mode: true,
258
+ wide_screen_mode: true,
259
+ update_multi: true,
260
+ },
261
+ summary: {
262
+ content: "思考中...",
263
+ i18n_content: {
264
+ zh_cn: "思考中...",
265
+ en_us: "Thinking...",
266
+ },
267
+ },
268
+ body: {
269
+ elements: [
270
+ {
271
+ tag: "markdown",
272
+ content: "⏳ 思考中...",
273
+ element_id: this.streamElementId,
274
+ },
275
+ ],
276
+ },
277
+ };
278
+ if (this.cardTitle) {
279
+ cardJson.header = {
280
+ title: { tag: "plain_text", content: this.cardTitle },
281
+ template: "blue",
282
+ };
283
+ }
284
+ const res = await this.client.cardkit.v1.card.create({
285
+ data: {
286
+ type: "card_json",
287
+ data: JSON.stringify(cardJson),
288
+ },
289
+ });
290
+ const err = checkCardKitError(res, "Create card");
291
+ if (err) {
292
+ console.error(`[CARDKIT] ${err.message}`);
293
+ throw err;
294
+ }
295
+ this.cardId = res.data?.card_id;
296
+ if (!this.cardId) {
297
+ console.error(`[CARDKIT] Create card response: ${JSON.stringify(res).slice(0, 500)}`);
298
+ throw new Error("CardKit: no card_id in response");
299
+ }
300
+ console.error(`[CARDKIT] Card created: ${this.cardId}`);
301
+ }
302
+ /**
303
+ * 通过 IM 消息 API 发送卡片到聊天
304
+ */
305
+ async sendCardMessage() {
306
+ await this.client.im.message.reply({
307
+ path: { message_id: this.rootMsgId },
308
+ data: {
309
+ content: JSON.stringify({ type: "card", data: { card_id: this.cardId } }),
310
+ msg_type: "interactive",
311
+ },
312
+ });
313
+ }
314
+ // ── 流式更新 ──────────────────────────────────────────────
315
+ /**
316
+ * 刷新卡片内容(打字机效果,使用 SDK)
317
+ * 工具状态作为前缀拼接在内容前
318
+ */
319
+ async performFlush(content) {
320
+ if (this.phase !== "streaming" || !this.cardId)
321
+ return;
322
+ let displayContent = content;
323
+ if (!this.thinkingEnabled) {
324
+ displayContent = stripThinking(content);
325
+ }
326
+ // 拼接工具状态前缀
327
+ if (this.statusText) {
328
+ displayContent = `${this.statusText}\n\n${displayContent}`;
329
+ }
330
+ if (!displayContent.trim())
331
+ return;
332
+ // 先截断再优化,避免对超长内容做无用正则处理
333
+ const preTruncated = displayContent.length > TRUNCATE_LIMIT
334
+ ? displayContent.slice(0, TRUNCATE_LIMIT) + "\n\n..."
335
+ : displayContent;
336
+ const optimized = optimizeForCard(preTruncated);
337
+ await this.withMutex(async () => {
338
+ this.sequence++;
339
+ const res = await this.client.cardkit.v1.cardElement.content({
340
+ path: { card_id: this.cardId, element_id: this.streamElementId },
341
+ data: { content: optimized, sequence: this.sequence },
342
+ });
343
+ const err = checkCardKitError(res, "Stream update");
344
+ if (err) {
345
+ console.error(`[CARDKIT] ${err.message}`);
346
+ throw err;
347
+ }
348
+ });
349
+ }
350
+ // ── 溢出处理 ──────────────────────────────────────────────
351
+ /**
352
+ * 内容溢出时写入云文档,卡片显示文档链接
353
+ */
354
+ async handleOverflow(rawContent, options) {
355
+ try {
356
+ const { token, title, originalMessage, meta } = await prepareOverflowContext(this.client, this.rootMsgId, this.context);
357
+ const { docUrl, docId } = await createOverflowDocument(token, title, rawContent, originalMessage, meta);
358
+ registerDocument(docId, this.context.profile);
359
+ let cardContent = `📝 内容较长,已写入云文档:[${title}](${docUrl})`;
360
+ if (options?.metadata) {
361
+ cardContent += `\n\n---\n${options.metadata}`;
362
+ }
363
+ const extraElements = this.buildThinkingElements(options?.thinking, options?.reasoningElapsedMs);
364
+ const finalCardJson = this.buildFinalCard(cardContent, extraElements);
365
+ await this.closeAndFinalize(finalCardJson);
366
+ }
367
+ catch (error) {
368
+ console.error("[CARDKIT] Overflow document failed, truncating:", error);
369
+ const optimized = optimizeForCard(rawContent);
370
+ const truncated = optimized.length > TRUNCATE_LIMIT
371
+ ? optimized.slice(0, TRUNCATE_LIMIT) + "\n\n..."
372
+ : optimized;
373
+ const finalCardJson = this.buildFinalCard(truncated);
374
+ await this.closeAndFinalize(finalCardJson);
375
+ }
376
+ }
377
+ // ── CardKit API helpers(使用 SDK) ──────────────────────
378
+ /**
379
+ * 关闭 streaming_mode(对齐 openclaw-lark 两步关闭的第一步)
380
+ */
381
+ async closeStreamingMode() {
382
+ const res = await this.client.cardkit.v1.card.settings({
383
+ path: { card_id: this.cardId },
384
+ data: {
385
+ settings: JSON.stringify({ streaming_mode: false }),
386
+ sequence: this.sequence,
387
+ },
388
+ });
389
+ const err = checkCardKitError(res, "Close streaming");
390
+ if (err)
391
+ console.error(`[CARDKIT] ${err.message}`);
392
+ }
393
+ /**
394
+ * 更新整个卡片内容(使用 SDK)
395
+ */
396
+ async updateCard(cardJson) {
397
+ const res = await this.client.cardkit.v1.card.update({
398
+ path: { card_id: this.cardId },
399
+ data: {
400
+ card: { type: "card_json", data: JSON.stringify(cardJson) },
401
+ sequence: this.sequence,
402
+ },
403
+ });
404
+ const err = checkCardKitError(res, "Card update");
405
+ if (err) {
406
+ console.error(`[CARDKIT] ${err.message}`);
407
+ throw err;
408
+ }
409
+ }
410
+ // ── 卡片构建 ──────────────────────────────────────────────
411
+ /**
412
+ * 构建最终卡片 JSON
413
+ */
414
+ buildFinalCard(content, extraElements) {
415
+ const cardJson = {
416
+ schema: "2.0",
417
+ config: {
418
+ wide_screen_mode: true,
419
+ },
420
+ body: {
421
+ elements: [
422
+ ...(extraElements ?? []),
423
+ {
424
+ tag: "markdown",
425
+ content,
426
+ element_id: this.streamElementId,
427
+ },
428
+ ],
429
+ },
430
+ };
431
+ if (this.cardTitle) {
432
+ cardJson.header = {
433
+ title: { tag: "plain_text", content: this.cardTitle },
434
+ template: "blue",
435
+ };
436
+ }
437
+ return cardJson;
438
+ }
439
+ /**
440
+ * 构建 thinking 折叠面板(委托共享函数)
441
+ */
442
+ buildThinkingElements(thinking, reasoningElapsedMs) {
443
+ if (!thinking)
444
+ return [];
445
+ return buildThinkingPanel({ thinking, reasoningElapsedMs });
446
+ }
447
+ }
448
+ //# sourceMappingURL=cardkit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cardkit.js","sourceRoot":"","sources":["../src/cardkit.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -29,7 +29,6 @@ export interface OverflowConfig {
29
29
  }
30
30
  export interface CardTableConfig {
31
31
  max_tables_per_card: number;
32
- max_tables_split: number;
33
32
  }
34
33
  export interface ExecSecurity {
35
34
  enabled: boolean;
@@ -41,6 +40,19 @@ export interface ReactionConfig {
41
40
  done: string;
42
41
  error: string;
43
42
  }
43
+ export interface FormatGuideConfig {
44
+ enabled: boolean;
45
+ }
46
+ export interface StreamingConfig {
47
+ enabled: boolean;
48
+ mode: "cardkit" | "update" | "none";
49
+ flush_interval_ms: number;
50
+ thinking_enabled: boolean;
51
+ fallback_on_error: boolean;
52
+ }
53
+ export interface ImageResolverConfig {
54
+ enabled: boolean;
55
+ }
44
56
  export interface ProfileConfig {
45
57
  feishu: FeishuConfig;
46
58
  claude: {
@@ -48,6 +60,8 @@ export interface ProfileConfig {
48
60
  allowed_tools?: string[];
49
61
  };
50
62
  overflow?: OverflowConfig;
63
+ format_guide?: FormatGuideConfig;
64
+ image_resolver?: ImageResolverConfig;
51
65
  image_prompt?: string;
52
66
  file?: Partial<FileConfig>;
53
67
  commands?: Record<string, string>;
@@ -56,20 +70,26 @@ export interface ProfileConfig {
56
70
  }
57
71
  export interface LarkccConfig extends ProfileConfig {
58
72
  reaction?: ReactionConfig;
59
- thinking_words?: string[];
73
+ card_title?: string;
60
74
  card_table?: CardTableConfig;
75
+ format_guide?: FormatGuideConfig;
76
+ streaming?: StreamingConfig;
77
+ image_resolver?: ImageResolverConfig;
61
78
  }
62
79
  export interface RawConfig {
63
80
  feishu: FeishuConfig;
64
81
  claude?: ProfileConfig["claude"];
65
82
  overflow?: OverflowConfig;
83
+ format_guide?: FormatGuideConfig;
84
+ streaming?: StreamingConfig;
85
+ image_resolver?: ImageResolverConfig;
66
86
  image_prompt?: string;
67
87
  file?: Partial<FileConfig>;
68
88
  commands?: Record<string, string>;
69
89
  exec_commands?: Record<string, string>;
70
90
  exec_security?: ExecSecurity;
71
91
  reaction?: ReactionConfig;
72
- thinking_words?: string[];
92
+ card_title?: string;
73
93
  card_table?: CardTableConfig;
74
94
  profiles?: Record<string, Partial<ProfileConfig>>;
75
95
  }
package/dist/config.js CHANGED
@@ -51,49 +51,21 @@ const DEFAULT_REACTION = {
51
51
  };
52
52
  const DEFAULT_CARD_TABLE = {
53
53
  max_tables_per_card: 5,
54
- max_tables_split: 10,
55
54
  };
56
- const DEFAULT_THINKING_WORDS = [
57
- "💭 思考中...",
58
- "🔍 分析中...",
59
- "📚 查阅中...",
60
- "✍️ 处理中...",
61
- "🧠 构思中...",
62
- "⚡ 计算中...",
63
- "🔬 研究中...",
64
- "📝 整理中...",
65
- "🎯 规划中...",
66
- "🔧 调试中...",
67
- "📖 阅读中...",
68
- "🌐 搜索中...",
69
- "🧩 组合中...",
70
- "🎨 设计中...",
71
- "💡 灵感中...",
72
- "🚀 启动中...",
73
- "🔄 更新中...",
74
- "📊 统计中...",
75
- "🛠️ 构建中...",
76
- "🧪 测试中...",
77
- "📦 打包中...",
78
- "⚡ 执行中...",
79
- "📥 获取中...",
80
- "📤 推送中...",
81
- "🔗 连接中...",
82
- "🧹 清理中...",
83
- "🎪 准备中...",
84
- "🎲 随机中...",
85
- "⏳ 进行中...",
86
- "💻 编码中...",
87
- "🌲 分叉中...",
88
- "🌿 合并中...",
89
- "📝 提交中...",
90
- "👀 审查中...",
91
- "🐛 除错中...",
92
- "✨ 优化中...",
93
- "🔨 重构中...",
94
- "📋 解析中...",
95
- "🧬 解构中...",
96
- ];
55
+ const DEFAULT_FORMAT_GUIDE = {
56
+ enabled: true,
57
+ };
58
+ const DEFAULT_STREAMING = {
59
+ enabled: true,
60
+ mode: "cardkit",
61
+ flush_interval_ms: 200,
62
+ thinking_enabled: true,
63
+ fallback_on_error: true,
64
+ };
65
+ const DEFAULT_IMAGE_RESOLVER = {
66
+ enabled: true,
67
+ };
68
+ const DEFAULT_CARD_TITLE = "Claude";
97
69
  function loadYml(filePath) {
98
70
  if (!fs.existsSync(filePath))
99
71
  return null;
@@ -182,10 +154,22 @@ export function loadConfig(cwd, profile) {
182
154
  done: raw.reaction?.done ?? DEFAULT_REACTION.done,
183
155
  error: raw.reaction?.error ?? DEFAULT_REACTION.error,
184
156
  },
185
- thinking_words: raw.thinking_words ?? DEFAULT_THINKING_WORDS,
157
+ card_title: raw.card_title ?? DEFAULT_CARD_TITLE,
186
158
  card_table: {
187
159
  max_tables_per_card: raw.card_table?.max_tables_per_card ?? DEFAULT_CARD_TABLE.max_tables_per_card,
188
- max_tables_split: raw.card_table?.max_tables_split ?? DEFAULT_CARD_TABLE.max_tables_split,
160
+ },
161
+ format_guide: {
162
+ enabled: raw.format_guide?.enabled ?? DEFAULT_FORMAT_GUIDE.enabled,
163
+ },
164
+ streaming: {
165
+ enabled: raw.streaming?.enabled ?? DEFAULT_STREAMING.enabled,
166
+ mode: raw.streaming?.mode ?? DEFAULT_STREAMING.mode,
167
+ flush_interval_ms: raw.streaming?.flush_interval_ms ?? DEFAULT_STREAMING.flush_interval_ms,
168
+ thinking_enabled: raw.streaming?.thinking_enabled ?? DEFAULT_STREAMING.thinking_enabled,
169
+ fallback_on_error: raw.streaming?.fallback_on_error ?? DEFAULT_STREAMING.fallback_on_error,
170
+ },
171
+ image_resolver: {
172
+ enabled: raw.image_resolver?.enabled ?? DEFAULT_IMAGE_RESOLVER.enabled,
189
173
  },
190
174
  };
191
175
  }
@@ -232,9 +216,21 @@ export function saveProfile(profile, feishu) {
232
216
  if (!raw.reaction) {
233
217
  raw.reaction = DEFAULT_REACTION;
234
218
  }
235
- // 添加默认 thinking_words 配置(首次创建时)
236
- if (!raw.thinking_words) {
237
- raw.thinking_words = DEFAULT_THINKING_WORDS;
219
+ // 添加默认 card_title 配置(首次创建时)
220
+ if (!raw.card_title) {
221
+ raw.card_title = DEFAULT_CARD_TITLE;
222
+ }
223
+ // 添加默认 streaming 配置(首次创建时)
224
+ if (!raw.streaming) {
225
+ raw.streaming = DEFAULT_STREAMING;
226
+ }
227
+ // 添加默认 image_resolver 配置(首次创建时)
228
+ if (!raw.image_resolver) {
229
+ raw.image_resolver = DEFAULT_IMAGE_RESOLVER;
230
+ }
231
+ // 添加默认 format_guide 配置(首次创建时)
232
+ if (!raw.format_guide) {
233
+ raw.format_guide = DEFAULT_FORMAT_GUIDE;
238
234
  }
239
235
  fs.writeFileSync(GLOBAL_CONFIG_PATH, yaml.dump(raw), "utf8");
240
236
  }