botmux 3.18.6 → 3.18.7

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 (239) hide show
  1. package/dist/.runtime-build-id +1 -1
  2. package/dist/adapters/backend/riff-backend.d.ts +158 -0
  3. package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
  4. package/dist/adapters/backend/riff-backend.js +330 -7
  5. package/dist/adapters/backend/riff-backend.js.map +1 -1
  6. package/dist/adapters/backend/sandbox.d.ts +42 -0
  7. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  8. package/dist/adapters/backend/sandbox.js +95 -5
  9. package/dist/adapters/backend/sandbox.js.map +1 -1
  10. package/dist/adapters/cli/codex-app.d.ts.map +1 -1
  11. package/dist/adapters/cli/codex-app.js +2 -1
  12. package/dist/adapters/cli/codex-app.js.map +1 -1
  13. package/dist/adapters/cli/dsh.d.ts.map +1 -1
  14. package/dist/adapters/cli/dsh.js +2 -1
  15. package/dist/adapters/cli/dsh.js.map +1 -1
  16. package/dist/adapters/cli/mir.d.ts.map +1 -1
  17. package/dist/adapters/cli/mir.js +2 -1
  18. package/dist/adapters/cli/mir.js.map +1 -1
  19. package/dist/adapters/cli/mira.d.ts.map +1 -1
  20. package/dist/adapters/cli/mira.js +2 -1
  21. package/dist/adapters/cli/mira.js.map +1 -1
  22. package/dist/adapters/hook-command.d.ts +3 -5
  23. package/dist/adapters/hook-command.d.ts.map +1 -1
  24. package/dist/adapters/hook-command.js +59 -13
  25. package/dist/adapters/hook-command.js.map +1 -1
  26. package/dist/autostart.d.ts +76 -0
  27. package/dist/autostart.d.ts.map +1 -1
  28. package/dist/autostart.js +105 -28
  29. package/dist/autostart.js.map +1 -1
  30. package/dist/bot-registry.d.ts +12 -0
  31. package/dist/bot-registry.d.ts.map +1 -1
  32. package/dist/bot-registry.js +43 -3
  33. package/dist/bot-registry.js.map +1 -1
  34. package/dist/cli/dashboard-command.d.ts +142 -0
  35. package/dist/cli/dashboard-command.d.ts.map +1 -1
  36. package/dist/cli/dashboard-command.js +160 -0
  37. package/dist/cli/dashboard-command.js.map +1 -1
  38. package/dist/cli/dashboard-endpoint.d.ts +66 -0
  39. package/dist/cli/dashboard-endpoint.d.ts.map +1 -1
  40. package/dist/cli/dashboard-endpoint.js +144 -30
  41. package/dist/cli/dashboard-endpoint.js.map +1 -1
  42. package/dist/cli/send-dispatch.d.ts +2 -0
  43. package/dist/cli/send-dispatch.d.ts.map +1 -1
  44. package/dist/cli/send-dispatch.js +8 -2
  45. package/dist/cli/send-dispatch.js.map +1 -1
  46. package/dist/cli.d.ts.map +1 -1
  47. package/dist/cli.js +270 -38
  48. package/dist/cli.js.map +1 -1
  49. package/dist/core/binary-self-update.d.ts +7 -0
  50. package/dist/core/binary-self-update.d.ts.map +1 -1
  51. package/dist/core/binary-self-update.js +17 -0
  52. package/dist/core/binary-self-update.js.map +1 -1
  53. package/dist/core/command-handler.d.ts.map +1 -1
  54. package/dist/core/command-handler.js +52 -1
  55. package/dist/core/command-handler.js.map +1 -1
  56. package/dist/core/cost-calculator.d.ts +9 -1
  57. package/dist/core/cost-calculator.d.ts.map +1 -1
  58. package/dist/core/cost-calculator.js +5 -0
  59. package/dist/core/cost-calculator.js.map +1 -1
  60. package/dist/core/passthrough-commands.d.ts.map +1 -1
  61. package/dist/core/passthrough-commands.js +1 -1
  62. package/dist/core/passthrough-commands.js.map +1 -1
  63. package/dist/core/self-spawn.d.ts +46 -1
  64. package/dist/core/self-spawn.d.ts.map +1 -1
  65. package/dist/core/self-spawn.js +57 -0
  66. package/dist/core/self-spawn.js.map +1 -1
  67. package/dist/core/worker-pool.d.ts.map +1 -1
  68. package/dist/core/worker-pool.js +81 -5
  69. package/dist/core/worker-pool.js.map +1 -1
  70. package/dist/daemon.d.ts.map +1 -1
  71. package/dist/daemon.js +93 -0
  72. package/dist/daemon.js.map +1 -1
  73. package/dist/dashboard/autostart-api.d.ts.map +1 -1
  74. package/dist/dashboard/autostart-api.js +16 -3
  75. package/dist/dashboard/autostart-api.js.map +1 -1
  76. package/dist/dashboard/bot-onboarding.d.ts +2 -1
  77. package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
  78. package/dist/dashboard/bot-onboarding.js +22 -6
  79. package/dist/dashboard/bot-onboarding.js.map +1 -1
  80. package/dist/dashboard/bot-payload.d.ts +1 -0
  81. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  82. package/dist/dashboard/bot-payload.js +3 -0
  83. package/dist/dashboard/bot-payload.js.map +1 -1
  84. package/dist/dashboard/connector-api.d.ts.map +1 -1
  85. package/dist/dashboard/connector-api.js +28 -0
  86. package/dist/dashboard/connector-api.js.map +1 -1
  87. package/dist/dashboard/trigger-api.d.ts.map +1 -1
  88. package/dist/dashboard/trigger-api.js +33 -21
  89. package/dist/dashboard/trigger-api.js.map +1 -1
  90. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  91. package/dist/dashboard/web/bot-defaults-page.js +12 -2
  92. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  93. package/dist/dashboard/web/bot-defaults.d.ts +2 -0
  94. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  95. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  96. package/dist/dashboard/web/bot-onboarding.d.ts +40 -1
  97. package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
  98. package/dist/dashboard/web/bot-onboarding.js +52 -2
  99. package/dist/dashboard/web/bot-onboarding.js.map +1 -1
  100. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  101. package/dist/dashboard/web/i18n.js +2 -0
  102. package/dist/dashboard/web/i18n.js.map +1 -1
  103. package/dist/dashboard/webhook-routes.d.ts.map +1 -1
  104. package/dist/dashboard/webhook-routes.js +272 -30
  105. package/dist/dashboard/webhook-routes.js.map +1 -1
  106. package/dist/dashboard-web/app.js +1 -1
  107. package/dist/dashboard-web/chunks/{agent-workbench-dock-page-XHJUYFGN.js → agent-workbench-dock-page-6LC422N6.js} +1 -1
  108. package/dist/dashboard-web/chunks/{agent-workbench-page-FLKTLIRM.js → agent-workbench-page-RSAWY7O2.js} +1 -1
  109. package/dist/dashboard-web/chunks/{bot-defaults-page-XMGLZZ2E.js → bot-defaults-page-67RAWCSQ.js} +1 -1
  110. package/dist/dashboard-web/chunks/{chunk-TLG45URB.js → chunk-IA5KMD5O.js} +1 -1
  111. package/dist/dashboard-web/chunks/{chunk-BU3Q6XC6.js → chunk-K232GT3M.js} +2 -2
  112. package/dist/dashboard-web/chunks/chunk-MMLTCXHP.js +10 -0
  113. package/dist/dashboard-web/chunks/{chunk-ECFC7UG2.js → chunk-R3LJUCEO.js} +1 -1
  114. package/dist/dashboard-web/chunks/{chunk-Z67OSM5P.js → chunk-YJA3KY3J.js} +1 -1
  115. package/dist/dashboard-web/chunks/{connectors-page-WDM4CEAU.js → connectors-page-DJCTHSFB.js} +1 -1
  116. package/dist/dashboard-web/chunks/{feedback-page-GMJ4FLJ4.js → feedback-page-O7SZRKNM.js} +1 -1
  117. package/dist/dashboard-web/chunks/{groups-page-L4ZJNWVR.js → groups-page-7PONUYHE.js} +1 -1
  118. package/dist/dashboard-web/chunks/{insights-page-7LUJU2CX.js → insights-page-J6DAAJ6D.js} +1 -1
  119. package/dist/dashboard-web/chunks/{monitor-room-7LZUJQPF.js → monitor-room-F3QNEW7N.js} +1 -1
  120. package/dist/dashboard-web/chunks/{monitoring-page-AUSXMPYO.js → monitoring-page-JHDD2VS2.js} +1 -1
  121. package/dist/dashboard-web/chunks/{office-page-6ZU6MAZN.js → office-page-MMTN4IKD.js} +1 -1
  122. package/dist/dashboard-web/chunks/{overview-page-QBC5CIYH.js → overview-page-IQ2UJAJP.js} +1 -1
  123. package/dist/dashboard-web/chunks/{roles-page-QO3YCA7D.js → roles-page-FNI4MGX6.js} +1 -1
  124. package/dist/dashboard-web/chunks/{schedules-page-YNGSKDQW.js → schedules-page-6PUU63KS.js} +1 -1
  125. package/dist/dashboard-web/chunks/{sessions-page-BWR4UB6X.js → sessions-page-O4N72EXT.js} +4 -4
  126. package/dist/dashboard-web/chunks/{settings-page-2IRIS3FP.js → settings-page-G7B3STUF.js} +1 -1
  127. package/dist/dashboard-web/chunks/{skills-page-5RZPM6HJ.js → skills-page-CEWKQOIG.js} +1 -1
  128. package/dist/dashboard-web/chunks/{team-federation-page-KERG6LKC.js → team-federation-page-NUP4VK4H.js} +1 -1
  129. package/dist/dashboard-web/chunks/{v3-page-766CBD7H.js → v3-page-M4XF6D5Z.js} +1 -1
  130. package/dist/dashboard-web/chunks/{whiteboards-page-2M6XZD5C.js → whiteboards-page-L755NZX6.js} +1 -1
  131. package/dist/dashboard-web/style.css +13 -0
  132. package/dist/dashboard.js +3 -0
  133. package/dist/dashboard.js.map +1 -1
  134. package/dist/global-config.d.ts +3 -0
  135. package/dist/global-config.d.ts.map +1 -1
  136. package/dist/global-config.js +10 -3
  137. package/dist/global-config.js.map +1 -1
  138. package/dist/i18n/en.d.ts.map +1 -1
  139. package/dist/i18n/en.js +19 -1
  140. package/dist/i18n/en.js.map +1 -1
  141. package/dist/i18n/zh.d.ts.map +1 -1
  142. package/dist/i18n/zh.js +19 -1
  143. package/dist/i18n/zh.js.map +1 -1
  144. package/dist/im/lark/api-gate.d.ts +53 -0
  145. package/dist/im/lark/api-gate.d.ts.map +1 -0
  146. package/dist/im/lark/api-gate.js +322 -0
  147. package/dist/im/lark/api-gate.js.map +1 -0
  148. package/dist/im/lark/audio-transcribe.d.ts +23 -0
  149. package/dist/im/lark/audio-transcribe.d.ts.map +1 -0
  150. package/dist/im/lark/audio-transcribe.js +126 -0
  151. package/dist/im/lark/audio-transcribe.js.map +1 -0
  152. package/dist/im/lark/card-builder.d.ts +6 -0
  153. package/dist/im/lark/card-builder.d.ts.map +1 -1
  154. package/dist/im/lark/card-builder.js +53 -1
  155. package/dist/im/lark/card-builder.js.map +1 -1
  156. package/dist/im/lark/card-handler.d.ts +10 -0
  157. package/dist/im/lark/card-handler.d.ts.map +1 -1
  158. package/dist/im/lark/card-handler.js +68 -1
  159. package/dist/im/lark/card-handler.js.map +1 -1
  160. package/dist/im/lark/client.d.ts.map +1 -1
  161. package/dist/im/lark/client.js +247 -224
  162. package/dist/im/lark/client.js.map +1 -1
  163. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  164. package/dist/im/lark/event-dispatcher.js +34 -3
  165. package/dist/im/lark/event-dispatcher.js.map +1 -1
  166. package/dist/im/lark/message-parser.d.ts +16 -0
  167. package/dist/im/lark/message-parser.d.ts.map +1 -1
  168. package/dist/im/lark/message-parser.js +31 -0
  169. package/dist/im/lark/message-parser.js.map +1 -1
  170. package/dist/services/budget-tracker.d.ts +61 -0
  171. package/dist/services/budget-tracker.d.ts.map +1 -0
  172. package/dist/services/budget-tracker.js +306 -0
  173. package/dist/services/budget-tracker.js.map +1 -0
  174. package/dist/services/connector-store.d.ts +16 -0
  175. package/dist/services/connector-store.d.ts.map +1 -1
  176. package/dist/services/connector-store.js.map +1 -1
  177. package/dist/services/failed-turn-retry.d.ts +43 -0
  178. package/dist/services/failed-turn-retry.d.ts.map +1 -0
  179. package/dist/services/failed-turn-retry.js +50 -0
  180. package/dist/services/failed-turn-retry.js.map +1 -0
  181. package/dist/services/model-pricing.d.ts +80 -0
  182. package/dist/services/model-pricing.d.ts.map +1 -0
  183. package/dist/services/model-pricing.js +182 -0
  184. package/dist/services/model-pricing.js.map +1 -0
  185. package/dist/services/session-store.d.ts.map +1 -1
  186. package/dist/services/session-store.js +13 -3
  187. package/dist/services/session-store.js.map +1 -1
  188. package/dist/services/trigger-types.d.ts +10 -0
  189. package/dist/services/trigger-types.d.ts.map +1 -1
  190. package/dist/services/trigger-types.js.map +1 -1
  191. package/dist/services/usage-ledger.d.ts +10 -0
  192. package/dist/services/usage-ledger.d.ts.map +1 -1
  193. package/dist/services/usage-ledger.js +36 -0
  194. package/dist/services/usage-ledger.js.map +1 -1
  195. package/dist/services/voice/asr.d.ts +17 -0
  196. package/dist/services/voice/asr.d.ts.map +1 -0
  197. package/dist/services/voice/asr.js +64 -0
  198. package/dist/services/voice/asr.js.map +1 -0
  199. package/dist/services/voice/index.d.ts +17 -2
  200. package/dist/services/voice/index.d.ts.map +1 -1
  201. package/dist/services/voice/index.js +43 -0
  202. package/dist/services/voice/index.js.map +1 -1
  203. package/dist/services/voice/types.d.ts +15 -0
  204. package/dist/services/voice/types.d.ts.map +1 -1
  205. package/dist/services/webhook-idempotency.d.ts +134 -0
  206. package/dist/services/webhook-idempotency.d.ts.map +1 -0
  207. package/dist/services/webhook-idempotency.js +265 -0
  208. package/dist/services/webhook-idempotency.js.map +1 -0
  209. package/dist/setup/app-name.d.ts +1 -0
  210. package/dist/setup/app-name.d.ts.map +1 -1
  211. package/dist/setup/app-name.js +7 -0
  212. package/dist/setup/app-name.js.map +1 -1
  213. package/dist/setup/bot-config-editor.d.ts +28 -0
  214. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  215. package/dist/setup/bot-config-editor.js +73 -0
  216. package/dist/setup/bot-config-editor.js.map +1 -1
  217. package/dist/setup/open-platform-automation.d.ts +26 -0
  218. package/dist/setup/open-platform-automation.d.ts.map +1 -1
  219. package/dist/setup/open-platform-automation.js +90 -1
  220. package/dist/setup/open-platform-automation.js.map +1 -1
  221. package/dist/setup/open-platform-outcome.d.ts.map +1 -1
  222. package/dist/setup/open-platform-outcome.js +8 -2
  223. package/dist/setup/open-platform-outcome.js.map +1 -1
  224. package/dist/types.d.ts +20 -1
  225. package/dist/types.d.ts.map +1 -1
  226. package/dist/utils/usage-limit-tracker.d.ts +29 -9
  227. package/dist/utils/usage-limit-tracker.d.ts.map +1 -1
  228. package/dist/utils/usage-limit-tracker.js +122 -14
  229. package/dist/utils/usage-limit-tracker.js.map +1 -1
  230. package/dist/worker.js +27 -6
  231. package/dist/worker.js.map +1 -1
  232. package/dist/workflows/definition.d.ts +56 -56
  233. package/dist/workflows/events/payloads.d.ts +2 -2
  234. package/dist/workflows/events/schema.d.ts +430 -430
  235. package/dist/workflows/migration/v2-run-archive-schema.d.ts +2 -2
  236. package/dist/workflows/v3/run-envelope.d.ts +56 -56
  237. package/package.json +9 -8
  238. package/scripts/postinstall-bin.mjs +25 -0
  239. package/dist/dashboard-web/chunks/chunk-NJCJR3U2.js +0 -10
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Inbound voice-message transcription pipeline (语音接线):
3
+ *
4
+ * msg_type=audio → 下载 opus → OpenAI 兼容 ASR 转写 → 带 🎤 前缀文本注入会话
5
+ *
6
+ * 设计要点:
7
+ * - 对非 audio 消息零开销(第一行 msgType 检查即返回),daemon 在两个入口
8
+ * (新话题 / 话题续聊)admission 之后、session 创建之前调用,转写失败不留
9
+ * 孤儿会话、不浪费额度。
10
+ * - 转写耗时可达数秒至数十秒,先发「正在转写…」占位消息提供即时反馈,成功
11
+ * 后删除占位;失败则删占位并回具体错误。
12
+ * - 幂等:prepared 重投路径若 parsed.content 已带前缀,直接跳过转写。
13
+ * - 所有 reply/delete 调用均 try/catch 容错——反馈通道故障不能炸主流程。
14
+ *
15
+ * ASR 配置(voice.asr,默认关闭)由 services/voice 的 resolveAsrConfig 按
16
+ * per-bot 覆盖 global 解析;本模块不直接读配置文件。
17
+ */
18
+ import { mkdtempSync, rmSync } from 'node:fs';
19
+ import { tmpdir } from 'node:os';
20
+ import { join } from 'node:path';
21
+ import { logger } from '../../utils/logger.js';
22
+ import { deleteMessage, downloadMessageResource } from './client.js';
23
+ import { extractAudioMeta } from './message-parser.js';
24
+ import { resolveAsrConfig } from '../../services/voice/index.js';
25
+ import { transcribeAudioFile } from '../../services/voice/asr.js';
26
+ /** 注入会话的转写文本前缀——CLI 与群成员据此可知输入来自语音转写。 */
27
+ export const AUDIO_TRANSCRIPTION_PREFIX = '🎤 语音转写:';
28
+ function errMsg(err) {
29
+ return err instanceof Error ? err.message : String(err);
30
+ }
31
+ /** 反馈通道(reply/delete)故障只记 debug,不影响转写主流程。 */
32
+ async function safeReply(reply, text) {
33
+ try {
34
+ await reply(text);
35
+ }
36
+ catch (err) {
37
+ logger.debug(`[audio-transcribe] reply failed: ${errMsg(err)}`);
38
+ }
39
+ }
40
+ /**
41
+ * Resolve an inbound audio message into transcript text for session injection.
42
+ *
43
+ * @param larkAppId bot 应用 ID(配置解析 + 资源下载)
44
+ * @param messageId 飞书 om_ 消息 ID(下载资源 + reply 锚点)
45
+ * @param msgType parsed.msgType
46
+ * @param rawEventContent data.message.content 原始 JSON(含 file_key)
47
+ * @param parsedContent parsed.content(幂等检查:已带前缀则跳过)
48
+ * @param reply 发文本消息的回调(daemon 注入 replyMessage)
49
+ */
50
+ export async function resolveInboundAudio(larkAppId, messageId, msgType, rawEventContent, parsedContent, reply) {
51
+ if (msgType !== 'audio')
52
+ return { kind: 'not_audio' };
53
+ // 幂等:prepared 重投等路径下 content 已是转写文本,不重复转写。
54
+ if (parsedContent.startsWith(AUDIO_TRANSCRIPTION_PREFIX)) {
55
+ return { kind: 'transcribed', text: parsedContent };
56
+ }
57
+ const cfg = resolveAsrConfig(larkAppId);
58
+ if (!cfg) {
59
+ const userMessage = '未配置语音识别:请在 voice.asr 配置 enabled/baseUrl/model(可选 apiKey)后重试。';
60
+ await safeReply(reply, userMessage);
61
+ return { kind: 'failed', userMessage };
62
+ }
63
+ // 即时反馈:转写可能耗时数十秒,先回一条占位消息,结束后删除。
64
+ let placeholderId;
65
+ try {
66
+ placeholderId = await reply('🎤 正在转写语音…');
67
+ }
68
+ catch (err) {
69
+ logger.debug(`[audio-transcribe] placeholder reply failed: ${errMsg(err)}`);
70
+ }
71
+ const clearPlaceholder = async () => {
72
+ if (!placeholderId)
73
+ return;
74
+ try {
75
+ await deleteMessage(larkAppId, placeholderId);
76
+ }
77
+ catch (err) {
78
+ logger.debug(`[audio-transcribe] placeholder delete failed: ${errMsg(err)}`);
79
+ }
80
+ };
81
+ const meta = extractAudioMeta(rawEventContent);
82
+ if (!meta) {
83
+ const userMessage = '语音消息解析失败:内容缺少 file_key,无法下载语音。';
84
+ await clearPlaceholder();
85
+ await safeReply(reply, userMessage);
86
+ return { kind: 'failed', userMessage };
87
+ }
88
+ const dir = mkdtempSync(join(tmpdir(), 'botmux-asr-'));
89
+ const audioPath = join(dir, 'voice.ogg');
90
+ try {
91
+ try {
92
+ // 飞书语音是 ogg/opus;type='file' 走 im.v1.message.resource 下载。
93
+ await downloadMessageResource(larkAppId, messageId, meta.fileKey, 'file', audioPath);
94
+ }
95
+ catch (err) {
96
+ // UserTokenMissingError 的 message 已含 /login 提示,直接透传。
97
+ const userMessage = `语音下载失败:${errMsg(err)}`;
98
+ await clearPlaceholder();
99
+ await safeReply(reply, userMessage);
100
+ return { kind: 'failed', userMessage };
101
+ }
102
+ let text;
103
+ try {
104
+ text = await transcribeAudioFile(cfg, audioPath);
105
+ }
106
+ catch (err) {
107
+ const userMessage = `语音转写失败:${errMsg(err)}`;
108
+ await clearPlaceholder();
109
+ await safeReply(reply, userMessage);
110
+ return { kind: 'failed', userMessage };
111
+ }
112
+ text = text.trim();
113
+ if (!text) {
114
+ const userMessage = '语音转写失败:ASR 转写结果为空。';
115
+ await clearPlaceholder();
116
+ await safeReply(reply, userMessage);
117
+ return { kind: 'failed', userMessage };
118
+ }
119
+ await clearPlaceholder();
120
+ return { kind: 'transcribed', text: `${AUDIO_TRANSCRIPTION_PREFIX}\n${text}` };
121
+ }
122
+ finally {
123
+ rmSync(dir, { recursive: true, force: true });
124
+ }
125
+ }
126
+ //# sourceMappingURL=audio-transcribe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-transcribe.js","sourceRoot":"","sources":["../../../src/im/lark/audio-transcribe.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,12 @@ import { type CardUsageSnapshot } from './md-card.js';
10
10
  import type { ConfigCardData } from '../../services/bot-config-store.js';
11
11
  /** select_static 里代表「清回默认 / 未设置」的哨兵值(model / lang 下拉用)。 */
12
12
  export declare const CONFIG_UNSET = "__unset__";
13
+ /** 流式卡片上下文占用百分比变色/高亮的缺省阈值(dashboard.contextCompactThreshold
14
+ * 缺省或非法时使用)。readGlobalConfig 自带 2s TTL 缓存,每次卡片构建调用成本极低。 */
15
+ export declare const DEFAULT_CONTEXT_COMPACT_THRESHOLD = 80;
16
+ /** 上下文占用百分比阈值:读 global-config 的 dashboard.contextCompactThreshold,
17
+ * 校验 finite 且 1..100,否则回退默认 80(与 readDashboard 的 lenient 读法一致)。 */
18
+ export declare function contextCompactThreshold(): number;
13
19
  /**
14
20
  * 交互配置卡片:`/botconfig`(裸)返回它。按配置页逻辑分区(运行 / 卡片行为 / 主动开工 /
15
21
  * 安全·授权),cli·model·lang 用下拉,布尔字段用切换按钮(i18n 文案 + ✅/⬜️),消息额度
@@ -1 +1 @@
1
- {"version":3,"file":"card-builder.d.ts","sourceRoot":"","sources":["../../../src/im/lark/card-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAoC,KAAK,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAC1G,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAK,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAmD,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEvG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAUzE,2DAA2D;AAC3D,eAAO,MAAM,YAAY,cAAc,CAAC;AAuBxC;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CA+G7E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CA8ClF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAyCjF;AAmCD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAEtD;AA0DD,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIpE;AAoCD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,KAAK,EACb,iBAAiB,CAAC,EAAE,OAAO,EAC3B,SAAS,CAAC,EAAE,OAAO,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,aAAa,UAAQ,EACrB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,MAAM,CAiER;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,KAAK,EACb,UAAU,CAAC,EAAE,MAAM,EACnB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,EAChC,MAAM,CAAC,EAAE,MAAM,EACf,kBAAkB,CAAC,EAAE,MAAM,EAC3B,iBAAiB,CAAC,EAAE,OAAO,GAC1B,MAAM,CAsCR;AAED;0EAC0E;AAC1E,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,KAAK,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EACnF,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAqDR;AASD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE;IACN,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,EACD,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CA2FR;AAGD,wBAAgB,gCAAgC,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAexE;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,KAAK,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CA0BR;AAQD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAE,MAA0B,GAAG,MAAM,CAgB9G;AA6ED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,YAAY,EACpB,KAAK,CAAC,EAAE,KAAK,EACb,WAAW,GAAE,WAAsB,EACnC,SAAS,CAAC,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,OAAO,EACnB,YAAY,CAAC,EAAE,OAAO,EACtB,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,kBAAkB,EAC/B,mBAAmB,CAAC,EAAE,MAAM,EAC5B,aAAa,UAAQ,EACrB,KAAK,CAAC,EAAE,iBAAiB,EACzB,kBAAkB,CAAC,EAAE,MAAM,EAC3B,gBAAgB,CAAC,EAAE,MAAM,EACzB,UAAU,CAAC,EAAE,OAAO,GACnB,MAAM,CA+JR;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,KAAK,GAAG,SAAS,EACxB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,kBAAkB,EAC/B,kBAAkB,CAAC,EAAE,MAAM,GAC1B,MAAM,CA2ER;AAsDD;;+CAE+C;AAC/C,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAgNzJ;AAID,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAC1B,2BAA2B;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wCAAwC;AACxC,wBAAgB,cAAc,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAqIxE;AAED;;;;;;;;gCAQgC;AAChC,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,GAAG,QAAQ,EACvB,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EACrF,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAcR;AAED,wDAAwD;AACxD,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAQpG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAwB1H;AAOD,kEAAkE;AAClE,KAAK,gBAAgB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAW3E;;gEAEgE;AAChE,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,EAChC,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,gBAAgB,EAAE,GAC/C,MAAM,CAyBR;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,KAAK,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,EACnG,WAAW,CAAC,EAAE,OAAO,EACrB,cAAc,CAAC,EAAE,MAAM,EAAE,EACzB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CA+FR;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAe1F;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAexF;AAED,kFAAkF;AAClF,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAejF;AAiBD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;mDAE+C;IAC/C,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC;IACrC;;;2DAGuD;IACvD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAUD,MAAM,WAAW,gBAAgB;IAC/B,oFAAoF;IACpF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mFAAmF;IACnF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sFAAsF;IACtF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA+BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,gBAAgB,EAAE,EAC3B,YAAY,EAAE,MAAM,EACpB,mBAAmB,EAAE,MAAM,EAC3B,aAAa,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,gBAAgB;AACxB;;;6CAG6C;AAC7C,WAAW,GAAE,QAAQ,GAAG,MAAe;AACvC;;;;8DAI8D;AAC9D,cAAc,GAAE,OAAO,GAAG,KAAe;AACzC;;;;;;;;;yEASyE;AACzE,UAAU,GAAE,SAAS,GAAG,QAAmB,GAC1C,MAAM,CAkPR;AAuBD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B;;qFAEiF;IACjF,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;6EAY6E;AAC7E,wBAAgB,YAAY,CAAC,CAAC,EAAE,gBAAgB,GAAG,sBAAsB,GAAG,MAAM,CAGjF;AAED;;;;;;;uCAOuC;AACvC,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,KAAK,CAAC,gBAAgB,GAAG,sBAAsB,CAAC,EAC1D,SAAS,EAAE,gBAAgB,EAAE,EAC7B,WAAW,CAAC,EAAE,KAAK,EACnB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,gBAAgB,EAAE,CAmCpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAoBD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,KAAK,CAAC,gBAAgB,GAAG,sBAAsB,CAAC,EAC1D,aAAa,CAAC,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,gBAAgB,EAAE,EAC9B,KAAK,CAAC,EAAE,gBAAgB,EACxB,aAAa,CAAC,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,KAAK,EACnB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,MAAM,CAqLR;AA+BD,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,qBAAqB,EAAE,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAoC/H"}
1
+ {"version":3,"file":"card-builder.d.ts","sourceRoot":"","sources":["../../../src/im/lark/card-builder.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,17 @@ import { isLocalCliOpenEnabled } from '../../services/local-cli-opener.js';
7
7
  import { clampGrantQuotaForCard, DEFAULT_GRANT_DURATION_MS, DEFAULT_GRANT_QUOTA, GRANT_DURATION_OPTIONS, MAX_GRANT_QUOTA, } from '../../services/grant-policy.js';
8
8
  /** select_static 里代表「清回默认 / 未设置」的哨兵值(model / lang 下拉用)。 */
9
9
  export const CONFIG_UNSET = '__unset__';
10
+ /** 流式卡片上下文占用百分比变色/高亮的缺省阈值(dashboard.contextCompactThreshold
11
+ * 缺省或非法时使用)。readGlobalConfig 自带 2s TTL 缓存,每次卡片构建调用成本极低。 */
12
+ export const DEFAULT_CONTEXT_COMPACT_THRESHOLD = 80;
13
+ /** 上下文占用百分比阈值:读 global-config 的 dashboard.contextCompactThreshold,
14
+ * 校验 finite 且 1..100,否则回退默认 80(与 readDashboard 的 lenient 读法一致)。 */
15
+ export function contextCompactThreshold() {
16
+ const v = readGlobalConfig().dashboard?.contextCompactThreshold;
17
+ if (typeof v === 'number' && Number.isFinite(v) && v >= 1 && v <= 100)
18
+ return Math.round(v);
19
+ return DEFAULT_CONTEXT_COMPACT_THRESHOLD;
20
+ }
10
21
  /** 布尔字段按配置页的逻辑分组(与 dashboard 的 Bot Profiles 区块对应)。 */
11
22
  const CONFIG_CARD_BOOLEAN_GROUPS = [
12
23
  { sec: 'card.config.sec.card', keys: ['disableStreamingCard', 'silentTurnReactions', 'writableTerminalLinkInCard', 'privateCard'] },
@@ -731,7 +742,7 @@ export function truncateContent(content, locale, maxBytes = MAX_CONTENT_BYTES) {
731
742
  * card limit, leaving room for JSON escaping + the card's structural overhead. */
732
743
  const PRIVATE_SNAPSHOT_TEXT_MAX = 50_000;
733
744
  const STREAM_TEMPLATE_MAP = {
734
- starting: 'yellow', working: 'blue', idle: 'green', analyzing: 'purple', stalled: 'red', limited: 'red', retry_ready: 'green',
745
+ starting: 'yellow', working: 'blue', idle: 'green', analyzing: 'purple', stalled: 'red', limited: 'red', retry_ready: 'green', interrupted: 'orange',
735
746
  };
736
747
  /** Header status label for a streaming/snapshot card. Shared by the live card
737
748
  * and the private snapshot so the two never drift. */
@@ -748,6 +759,7 @@ function streamStatusLabel(status, usageLimit, locale, silentIdle) {
748
759
  case 'limited': return usageLimit?.retryReady
749
760
  ? t('card.status.retry_ready', undefined, locale)
750
761
  : t('card.status.limited', undefined, locale);
762
+ case 'interrupted': return t('card.status.interrupted', undefined, locale);
751
763
  }
752
764
  }
753
765
  /** Push the shared "output body" elements (usage-limit notice + screenshot) used
@@ -815,6 +827,21 @@ export function buildStreamingCard(sessionId, rootId, terminalUrl, title, screen
815
827
  const elements = [];
816
828
  // ── Output body (shared with the private snapshot card) ──────────────────
817
829
  pushStreamBody(elements, { status, usageLimit, displayMode, imageKey, cliName, locale, usage });
830
+ // ── 上下文余量指示(header 之下、控制行之上的显著位置)────────────────────
831
+ // 数据来自 usage.context.percentUsed(worker-pool 的 getDaemonStreamingCardUsageSnapshot
832
+ // 算好传入);无 contextWindow 数据(percentUsed 非有限数)时不渲染——优雅降级。
833
+ const contextPct = usage?.context?.percentUsed;
834
+ const hasContextPct = typeof contextPct === 'number' && Number.isFinite(contextPct);
835
+ if (hasContextPct) {
836
+ const pct = Math.min(100, Math.round(contextPct));
837
+ const overThreshold = pct >= contextCompactThreshold();
838
+ elements.push({
839
+ tag: 'markdown',
840
+ content: overThreshold
841
+ ? `<font color='red'>⚠️ ${t('card.context.over_threshold', { pct }, locale)}</font>`
842
+ : `<font color='grey'>📊 ${t('card.context.indicator', { pct }, locale)}</font>`,
843
+ });
844
+ }
818
845
  // ── Main control row: display toggle, mode toggle, terminal, manage ─────
819
846
  const headerActions = [];
820
847
  headerActions.push({
@@ -866,6 +893,31 @@ export function buildStreamingCard(sessionId, rootId, terminalUrl, title, screen
866
893
  value: { action: 'get_write_link', ...actionBase },
867
894
  });
868
895
  }
896
+ // 「🗜️ 压缩」:仅在有上下文占用数据时出现(无 contextWindow 的 CLI 优雅降级为不渲染)。
897
+ // 点击走 card-handler 的 compact_session → daemon 的 deliverPassthroughToExistingSession
898
+ // (raw_input 透传 /compact,含完整 turn 生命周期),不新造压缩逻辑。
899
+ if (hasContextPct) {
900
+ headerActions.push({
901
+ tag: 'button',
902
+ text: { tag: 'plain_text', content: t('card.btn.compact', undefined, locale) },
903
+ type: 'default',
904
+ value: { action: 'compact_session', ...actionBase },
905
+ });
906
+ }
907
+ // 「⏹ 停止」:常驻主控制行(不再受 displayMode==='hidden' 折叠态限制——折叠态是 turn
908
+ // 跑飞时用户唯一可见的一行,此前只能 /close 杀整个会话丢上下文)。点击走已有的
909
+ // term_action ctrlc IPC 链路(与展开态 ^C 快捷键完全同款),中断当前 turn 但保留会话。
910
+ // 仅在有 turn 可停的状态显示:idle 无 turn 可停;starting CLI 未起;limited turn 已失败。
911
+ // remote CLI(riff/mojo)无终端可驱动、codex-app 无 PTY 输入通道,均隐藏。
912
+ if (!isRemoteCliId(cliId) && effectiveCliId !== 'codex-app'
913
+ && (status === 'working' || status === 'analyzing' || status === 'stalled')) {
914
+ headerActions.push({
915
+ tag: 'button',
916
+ text: { tag: 'plain_text', content: t('card.btn.stop', undefined, locale) },
917
+ type: 'default',
918
+ value: { action: 'stop_turn', ...actionBase },
919
+ });
920
+ }
869
921
  if (adoptMode) {
870
922
  if (showTakeover) {
871
923
  headerActions.push({