lark-remote 0.5.12 → 0.5.14

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 (172) hide show
  1. package/CHANGELOG.md +28 -2
  2. package/README.en.md +1 -14
  3. package/README.md +1 -14
  4. package/dist/agent-kinds.d.ts +27 -0
  5. package/dist/agent-kinds.js +38 -0
  6. package/dist/bridge/approval-actions.d.ts +95 -0
  7. package/dist/bridge/approval-actions.js +104 -0
  8. package/dist/bridge/approval-coordinator.d.ts +1 -0
  9. package/dist/bridge/approval-coordinator.js +12 -24
  10. package/dist/bridge/final-usage.d.ts +8 -17
  11. package/dist/bridge/final-usage.js +1 -18
  12. package/dist/bridge/index.d.ts +52 -38
  13. package/dist/bridge/index.js +255 -433
  14. package/dist/bridge/queue-manager.d.ts +25 -1
  15. package/dist/bridge/queue-manager.js +179 -160
  16. package/dist/bridge/run-approval.d.ts +16 -0
  17. package/dist/bridge/run-approval.js +41 -0
  18. package/dist/bridge/run-usage.d.ts +32 -0
  19. package/dist/bridge/run-usage.js +87 -0
  20. package/dist/bridge/session-writeback.d.ts +19 -0
  21. package/dist/bridge/session-writeback.js +36 -0
  22. package/dist/card/approval-render.d.ts +3 -2
  23. package/dist/card/approval-render.js +3 -2
  24. package/dist/card/bash-card-session.js +2 -5
  25. package/dist/{router → card}/card-helpers.d.ts +7 -7
  26. package/dist/{router → card}/card-helpers.js +8 -8
  27. package/dist/card/card-session.d.ts +6 -2
  28. package/dist/card/card-session.js +28 -28
  29. package/dist/card/card-shared.d.ts +4 -4
  30. package/dist/card/card-shared.js +4 -10
  31. package/dist/card/collapsible.js +3 -2
  32. package/dist/card/final-answer-overflow.d.ts +1 -0
  33. package/dist/card/final-answer-overflow.js +46 -0
  34. package/dist/card/run-card-session.d.ts +2 -2
  35. package/dist/card/run-card-session.js +4 -9
  36. package/dist/card/run-renderer.d.ts +14 -0
  37. package/dist/card/run-renderer.js +126 -23
  38. package/dist/card/run-state.d.ts +40 -51
  39. package/dist/card/run-state.js +96 -34
  40. package/dist/card/usage-format.d.ts +30 -0
  41. package/dist/{router → card}/usage-format.js +3 -10
  42. package/dist/clone.js +6 -1
  43. package/dist/config/codex-config.js +4 -4
  44. package/dist/config/index.d.ts +18 -20
  45. package/dist/config/index.js +6 -20
  46. package/dist/config/pi-config.js +6 -4
  47. package/dist/connector/index.d.ts +2 -4
  48. package/dist/connector/index.js +7 -11
  49. package/dist/{runner/dsh → dsh}/auth.js +3 -4
  50. package/dist/dsh/home.d.ts +2 -0
  51. package/dist/dsh/home.js +8 -0
  52. package/dist/dsh/protocol.d.ts +9 -0
  53. package/dist/dsh/protocol.js +61 -0
  54. package/dist/inbound/turn-assembler.js +6 -0
  55. package/dist/index.js +25 -414
  56. package/dist/message-handlers.d.ts +26 -0
  57. package/dist/message-handlers.js +275 -0
  58. package/dist/model-catalog.d.ts +14 -0
  59. package/dist/model-catalog.js +25 -0
  60. package/dist/platform/path.d.ts +9 -0
  61. package/dist/platform/path.js +18 -0
  62. package/dist/router/active-run-usage.d.ts +4 -0
  63. package/dist/router/active-run-usage.js +12 -0
  64. package/dist/router/card-action-payload.d.ts +1 -1
  65. package/dist/router/card-action-payload.js +1 -1
  66. package/dist/router/commands/ls.d.ts +9 -0
  67. package/dist/router/commands/ls.js +243 -0
  68. package/dist/router/commands/order.d.ts +12 -0
  69. package/dist/router/commands/order.js +178 -0
  70. package/dist/router/commands/resume.d.ts +48 -0
  71. package/dist/router/commands/resume.js +246 -0
  72. package/dist/router/commands/ws.d.ts +15 -0
  73. package/dist/router/commands/ws.js +189 -0
  74. package/dist/router/config/claude.js +5 -4
  75. package/dist/router/config/codex.js +2 -6
  76. package/dist/router/config/common/render.d.ts +5 -1
  77. package/dist/router/config/common/render.js +6 -13
  78. package/dist/router/config/common/turn-idle.d.ts +2 -0
  79. package/dist/router/config/common/turn-idle.js +9 -0
  80. package/dist/router/config/dsh.d.ts +1 -1
  81. package/dist/router/config/index.d.ts +1 -1
  82. package/dist/router/config/kimi.js +2 -6
  83. package/dist/router/config/opencode.js +2 -6
  84. package/dist/router/config/types.d.ts +11 -3
  85. package/dist/router/index.d.ts +55 -33
  86. package/dist/router/index.js +233 -1376
  87. package/dist/router/paging.d.ts +13 -0
  88. package/dist/router/paging.js +20 -0
  89. package/dist/router/path-validation.d.ts +27 -0
  90. package/dist/router/path-validation.js +45 -0
  91. package/dist/runner/agent-choices-common.d.ts +1 -1
  92. package/dist/runner/claude/runner.d.ts +23 -6
  93. package/dist/runner/claude/runner.js +6 -20
  94. package/dist/runner/claude/session.js +1 -1
  95. package/dist/runner/codex/app-server/runner.d.ts +3 -1
  96. package/dist/runner/codex/app-server/translator.d.ts +13 -0
  97. package/dist/runner/codex/app-server/translator.js +114 -151
  98. package/dist/runner/common/acp/base-acp-runner.d.ts +3 -1
  99. package/dist/runner/common/acp/base-translator.d.ts +3 -8
  100. package/dist/runner/common/acp/base-translator.js +16 -7
  101. package/dist/runner/common/connection-based-runner.d.ts +3 -1
  102. package/dist/runner/common/jsonrpc/transport.js +17 -7
  103. package/dist/runner/common/spawning-runner.js +10 -4
  104. package/dist/runner/common/turn-started.d.ts +2 -0
  105. package/dist/runner/common/turn-started.js +10 -0
  106. package/dist/runner/dsh/client.d.ts +2 -10
  107. package/dist/runner/dsh/client.js +13 -220
  108. package/dist/runner/dsh/daemon.d.ts +0 -2
  109. package/dist/runner/dsh/daemon.js +9 -7
  110. package/dist/runner/dsh/errors.d.ts +5 -0
  111. package/dist/runner/dsh/errors.js +11 -0
  112. package/dist/runner/dsh/exit-cancel.d.ts +0 -2
  113. package/dist/runner/dsh/exit-cancel.js +2 -2
  114. package/dist/runner/dsh/inflight.d.ts +0 -2
  115. package/dist/runner/dsh/inflight.js +1 -1
  116. package/dist/runner/dsh/mux-stream.d.ts +26 -0
  117. package/dist/runner/dsh/mux-stream.js +176 -0
  118. package/dist/runner/dsh/runner.d.ts +21 -1
  119. package/dist/runner/dsh/runner.js +76 -73
  120. package/dist/runner/dsh/translator.d.ts +1 -11
  121. package/dist/runner/dsh/translator.js +1 -1
  122. package/dist/runner/index.d.ts +1 -1
  123. package/dist/runner/kimi/acp/runner.d.ts +22 -1
  124. package/dist/runner/kimi/acp/runner.js +83 -60
  125. package/dist/runner/kimi/acp/translator.js +1 -12
  126. package/dist/runner/opencode/acp/error-monitor.d.ts +11 -0
  127. package/dist/runner/opencode/acp/error-monitor.js +31 -2
  128. package/dist/runner/opencode/acp/runner.d.ts +3 -1
  129. package/dist/runner/opencode/acp/translator.js +1 -12
  130. package/dist/runner/pi/rpc/runner.d.ts +2 -1
  131. package/dist/runner/pi/rpc/translator.d.ts +2 -8
  132. package/dist/runner/pi/rpc/translator.js +2 -7
  133. package/dist/runner/probe.d.ts +1 -1
  134. package/dist/runner/probe.js +10 -9
  135. package/dist/runner/registry.d.ts +2 -20
  136. package/dist/runner/registry.js +0 -32
  137. package/dist/runner/types.d.ts +37 -155
  138. package/dist/runner/types.js +4 -24
  139. package/dist/session/claude/session-index.d.ts +11 -4
  140. package/dist/session/claude/session-index.js +34 -10
  141. package/dist/session/claude/session-reader.d.ts +1 -1
  142. package/dist/session/claude/sessions.d.ts +2 -2
  143. package/dist/session/claude/sessions.js +41 -26
  144. package/dist/session/codex/rollout-reader.d.ts +1 -1
  145. package/dist/session/codex/rollout-reader.js +14 -13
  146. package/dist/session/codex/sessions.d.ts +1 -1
  147. package/dist/session/codex/sessions.js +4 -2
  148. package/dist/session/common/jsonl.js +7 -1
  149. package/dist/session/common/pagination.d.ts +2 -0
  150. package/dist/session/common/pagination.js +1 -1
  151. package/dist/session/common/recency.d.ts +6 -0
  152. package/dist/session/common/recency.js +7 -5
  153. package/dist/session/common/two-pass.d.ts +1 -1
  154. package/dist/session/common/usage-accumulator.d.ts +1 -1
  155. package/dist/session/dsh/sessions.d.ts +1 -1
  156. package/dist/session/dsh/sessions.js +37 -12
  157. package/dist/session/kimi/sessions.d.ts +1 -1
  158. package/dist/session/kimi/sessions.js +37 -10
  159. package/dist/session/opencode/sessions.d.ts +1 -1
  160. package/dist/session/opencode/sessions.js +53 -48
  161. package/dist/session/pi/sessions.d.ts +1 -1
  162. package/dist/session/pi/sessions.js +23 -9
  163. package/dist/session/registry.d.ts +2 -1
  164. package/dist/session/session-store.d.ts +1 -2
  165. package/dist/session/session-store.js +14 -7
  166. package/dist/session-contract.d.ts +178 -0
  167. package/dist/session-contract.js +9 -0
  168. package/package.json +1 -1
  169. package/dist/router/usage-format.d.ts +0 -60
  170. /package/dist/{runner/dsh → dsh}/auth.d.ts +0 -0
  171. /package/dist/{runner/dsh → dsh}/types.d.ts +0 -0
  172. /package/dist/{runner/dsh → dsh}/types.js +0 -0
@@ -4,7 +4,8 @@
4
4
  import fs from 'node:fs';
5
5
  import os from 'node:os';
6
6
  import path from 'node:path';
7
- import { MODEL_ID_TO_ALIAS, MODEL_ALIAS_TO_ID, getModelOptionsFromSettings, CLAUDE_EFFORTS, CLAUDE_PERMISSION_MODES, } from '../../config/index.js';
7
+ import { CLAUDE_EFFORTS, CLAUDE_PERMISSION_MODES, getModelOptionsFromSettings, } from '../../config/index.js';
8
+ import { MODEL_ALIAS_TO_ID, MODEL_ID_TO_ALIAS } from '../../model-catalog.js';
8
9
  /** Claude 官方 --permission-mode 中文注释(value 走 CLAUDE_PERMISSION_MODES SSOT)。 */
9
10
  const PERMISSION_MODE_LABELS = {
10
11
  default: '默认(敏感操作逐项询问)',
@@ -81,9 +82,9 @@ export class ClaudeConfigBuilder {
81
82
  currentValue: currentEffort,
82
83
  });
83
84
  // 权限模式(取值见 CLAUDE_PERMISSION_MODES:除自造的 default 外都是 CLI 的
84
- // --permission-mode 枚举;bypassPermissions 为 schema 默认,保持旧行为无审批卡,
85
- // 配置为其他值后激活交互式审批)
86
- const currentPermissionMode = displayConfig.claude?.permissionMode ?? 'bypassPermissions';
85
+ // --permission-mode 枚举;auto 为 schema 默认,低风险自动放行、高风险走审批,
86
+ // bypassPermissions 仍可在下拉中显式选择)
87
+ const currentPermissionMode = displayConfig.claude?.permissionMode ?? 'auto';
87
88
  // manual 不在下拉里:旧配置按 default 显示,避免打开卡片时该项空选
88
89
  const displayedPermissionMode = currentPermissionMode === 'manual' ? 'default' : currentPermissionMode;
89
90
  fields.push({
@@ -4,6 +4,7 @@
4
4
  import { loadCodexConfig, getReasoningEffortOptions, getDefaultReasoningEffort, } from '../../config/codex-config.js';
5
5
  import { DEFAULT_TURN_IDLE_TIMEOUT_MINUTES } from '../../config/index.js';
6
6
  import { pickMiddleValue, resetModelPatch } from './common/model-patch.js';
7
+ import { turnIdleTimeoutField } from './common/turn-idle.js';
7
8
  export class CodexConfigBuilder {
8
9
  buildFields(displayConfig) {
9
10
  const fields = [];
@@ -66,12 +67,7 @@ export class CodexConfigBuilder {
66
67
  });
67
68
  const currentTurnIdleTimeoutMinutes = displayConfig.agents?.codex?.appServer?.turnIdleTimeoutMinutes ??
68
69
  DEFAULT_TURN_IDLE_TIMEOUT_MINUTES;
69
- fields.push({
70
- key: 'agents.codex.appServer.turnIdleTimeoutMinutes',
71
- label: 'Turn 空闲超时(分钟, 0关闭)',
72
- type: 'input',
73
- currentValue: String(currentTurnIdleTimeoutMinutes),
74
- });
70
+ fields.push(turnIdleTimeoutField('agents.codex.appServer.turnIdleTimeoutMinutes', currentTurnIdleTimeoutMinutes));
75
71
  return fields;
76
72
  }
77
73
  handleFieldChange(key, value, config) {
@@ -1,8 +1,12 @@
1
1
  /**
2
2
  * Shared config card rendering logic.
3
3
  *
4
- * Builds CardKit 2.0 elements for config fields (boolean toggle, select dropdown, input).
4
+ * Builds CardKit 2.0 elements for config fields (select dropdown, input, note).
5
5
  * Used by all agent config builders and the shared tabs (idle, logging).
6
+ *
7
+ * 控件形态只有 `ConfigField.type` 里那三种,且每种在本文件都有对应 builder:
8
+ * 渲染端与处理端(router 的 `config.set` / `config.input`)必须一一对应,
9
+ * 「渲染得出按钮、点了没人处理」是禁止状态(守卫见 config-card-controls.test.ts)。
6
10
  */
7
11
  import { type AppConfig } from '../../../config/index.js';
8
12
  import type { ConfigField } from '../types.js';
@@ -1,8 +1,12 @@
1
1
  /**
2
2
  * Shared config card rendering logic.
3
3
  *
4
- * Builds CardKit 2.0 elements for config fields (boolean toggle, select dropdown, input).
4
+ * Builds CardKit 2.0 elements for config fields (select dropdown, input, note).
5
5
  * Used by all agent config builders and the shared tabs (idle, logging).
6
+ *
7
+ * 控件形态只有 `ConfigField.type` 里那三种,且每种在本文件都有对应 builder:
8
+ * 渲染端与处理端(router 的 `config.set` / `config.input`)必须一一对应,
9
+ * 「渲染得出按钮、点了没人处理」是禁止状态(守卫见 config-card-controls.test.ts)。
6
10
  */
7
11
  import { getConfigValue } from '../../../config/index.js';
8
12
  import { cardButton } from '../../../card/card-shared.js';
@@ -12,12 +16,7 @@ function buildFieldElements(fields, displayConfig) {
12
16
  for (const field of fields) {
13
17
  // Get current value from displayConfig for dynamic fields
14
18
  const currentValue = getConfigValue(displayConfig, field.key);
15
- if (field.type === 'boolean') {
16
- // For boolean, use field.currentValue if set, otherwise use config value
17
- const isOn = field.currentValue !== undefined ? field.currentValue === true : currentValue === true;
18
- elements.push(buildBooleanElement(field, isOn));
19
- }
20
- else if (field.type === 'select' && field.options) {
19
+ if (field.type === 'select' && field.options) {
21
20
  elements.push(buildSelectElement(field, currentValue));
22
21
  }
23
22
  else if (field.type === 'note') {
@@ -53,12 +52,6 @@ function fieldRow(label, control) {
53
52
  ],
54
53
  };
55
54
  }
56
- function buildBooleanElement(field, isOn) {
57
- const displayVal = isOn ? '✅ 已开启' : '⚪ 已关闭';
58
- return fieldRow(field.label, cardButton(displayVal, { cmd: 'config.toggle', key: field.key }, {
59
- type: isOn ? 'primary' : 'default',
60
- }));
61
- }
62
55
  function buildSelectElement(field, currentValue) {
63
56
  // 优先使用 field.currentValue(卡片显示用覆盖值),否则使用 config 中的值
64
57
  const selectedValue = field.currentValue != null
@@ -0,0 +1,2 @@
1
+ import type { ConfigField } from '../types.js';
2
+ export declare function turnIdleTimeoutField(key: string, currentMinutes: number): ConfigField;
@@ -0,0 +1,9 @@
1
+ export function turnIdleTimeoutField(key, currentMinutes) {
2
+ return {
3
+ key,
4
+ label: 'Turn 空闲超时(分钟, 0关闭)',
5
+ type: 'input',
6
+ currentValue: String(currentMinutes),
7
+ };
8
+ }
9
+ //# sourceMappingURL=turn-idle.js.map
@@ -17,7 +17,7 @@
17
17
  */
18
18
  import type { AgentConfigCardBuilder, ConfigField } from './types.js';
19
19
  import { type AppConfig } from '../../config/index.js';
20
- import type { DshModelCatalogValue, DshPermissionCatalogValue, DshPresetListValue } from '../../runner/dsh/types.js';
20
+ import type { DshModelCatalogValue, DshPermissionCatalogValue, DshPresetListValue } from '../../dsh/types.js';
21
21
  /** DshConfigBuilder 预取只依赖的 client 方法子集。 */
22
22
  export interface DshCatalogClient {
23
23
  listModels(): Promise<DshModelCatalogValue>;
@@ -4,7 +4,7 @@
4
4
  * Each agent implements AgentConfigCardBuilder in its own file.
5
5
  * Adding a new agent = add a file + register here (no upstream changes needed).
6
6
  */
7
- import type { AgentKind } from '../../runner/types.js';
7
+ import type { AgentKind } from '../../agent-kinds.js';
8
8
  import type { AgentConfigCardBuilder } from './types.js';
9
9
  /**
10
10
  * 首次启动默认展示的 Coding Agent 顺序:Codex → Claude → OpenCode → Pi → Kimi → DSH。
@@ -7,6 +7,7 @@
7
7
  import { loadKimiConfig, KIMI_THINKING_EFFORTS, FALLBACK_EFFORTS, } from '../../config/kimi-config.js';
8
8
  import { DEFAULT_TURN_IDLE_TIMEOUT_MINUTES } from '../../config/index.js';
9
9
  import { pickMiddleValue } from './common/model-patch.js';
10
+ import { turnIdleTimeoutField } from './common/turn-idle.js';
10
11
  const PERMISSION_MODE_OPTIONS = [
11
12
  // kimi 0.40.0(2026-09-02)起官方语义:manual=始终询问 / yolo=必要时询问 / auto=完全自动
12
13
  { text: 'manual(始终询问)', value: 'manual' },
@@ -48,12 +49,7 @@ export class KimiConfigBuilder {
48
49
  currentValue: currentPermissionMode,
49
50
  });
50
51
  const currentTurnIdleTimeoutMinutes = displayConfig.agents?.kimi?.acp?.turnIdleTimeoutMinutes ?? DEFAULT_TURN_IDLE_TIMEOUT_MINUTES;
51
- fields.push({
52
- key: 'agents.kimi.acp.turnIdleTimeoutMinutes',
53
- label: 'Turn 空闲超时(分钟, 0关闭)',
54
- type: 'input',
55
- currentValue: String(currentTurnIdleTimeoutMinutes),
56
- });
52
+ fields.push(turnIdleTimeoutField('agents.kimi.acp.turnIdleTimeoutMinutes', currentTurnIdleTimeoutMinutes));
57
53
  return fields;
58
54
  }
59
55
  handleFieldChange(key, value, config) {
@@ -4,6 +4,7 @@
4
4
  import { loadOpencodeConfig } from '../../config/opencode-config.js';
5
5
  import { DEFAULT_TURN_IDLE_TIMEOUT_MINUTES } from '../../config/index.js';
6
6
  import { resetModelPatch } from './common/model-patch.js';
7
+ import { turnIdleTimeoutField } from './common/turn-idle.js';
7
8
  const MODE_OPTIONS = [
8
9
  { text: 'build(默认,按 opencode 权限配置)', value: 'build' },
9
10
  { text: 'plan(规划模式)', value: 'plan' },
@@ -52,12 +53,7 @@ export class OpencodeConfigBuilder {
52
53
  // binary/requestTimeoutMs/idleTtlMs 为 YAML-only 工程参数)
53
54
  const currentTurnIdleTimeoutMinutes = displayConfig.agents?.opencode?.acp?.turnIdleTimeoutMinutes ??
54
55
  DEFAULT_TURN_IDLE_TIMEOUT_MINUTES;
55
- fields.push({
56
- key: 'agents.opencode.acp.turnIdleTimeoutMinutes',
57
- label: 'Turn 空闲超时(分钟, 0关闭)',
58
- type: 'input',
59
- currentValue: String(currentTurnIdleTimeoutMinutes),
60
- });
56
+ fields.push(turnIdleTimeoutField('agents.opencode.acp.turnIdleTimeoutMinutes', currentTurnIdleTimeoutMinutes));
61
57
  return fields;
62
58
  }
63
59
  handleFieldChange(key, value, config) {
@@ -16,13 +16,21 @@ export interface SelectOption {
16
16
  export interface ConfigField {
17
17
  key: string;
18
18
  label: string;
19
- type: 'boolean' | 'select' | 'input' | 'note';
19
+ /**
20
+ * 卡片上真实存在的控件形态,每种都在 `common/render.ts` 有对应 builder:
21
+ * select=下拉、input=文本框、note=纯说明行(无回调)。
22
+ *
23
+ * 没有 boolean:卡片曾留着一套「开关」控件(`config.toggle`),但全仓没有
24
+ * 任何字段声明它,2026-10-27 成套删除。原则是**卡片只放配得了的控件**,
25
+ * 实现细节与未上卡的键走 YAML(见 `buildConfigCard` 的分 tab 注释)。
26
+ */
27
+ type: 'select' | 'input' | 'note';
20
28
  /** For select type: the list of options shown in the dropdown.
21
29
  * Accepts plain strings (text=value) or {text, value} objects for
22
30
  * display-value separation (e.g. 'manual(逐项审批)' → value 'manual'). */
23
31
  options?: readonly (string | SelectOption)[];
24
32
  /** Override the currentValue shown in the card (takes priority over getConfigValue). */
25
- currentValue?: string | boolean;
33
+ currentValue?: string;
26
34
  }
27
35
  /**
28
36
  * Builder that provides config fields and handles field changes for a specific agent.
@@ -40,7 +48,7 @@ export interface AgentConfigCardBuilder {
40
48
  * Handle a field change for this agent.
41
49
  *
42
50
  * @param key - The field key (e.g. 'agents.codex.modelProvider')
43
- * @param value - The new value (string for select/input, already toggled for boolean)
51
+ * @param value - The new value (string for select/input)
44
52
  * @param config - The current pendingConfig (read-only reference for deriving dependent values)
45
53
  * @returns An array of {key, value} patches to apply to pendingConfig.
46
54
  * The caller (router) applies these via setNestedValue.
@@ -4,6 +4,18 @@ import type { Bridge, CommandContext, CommandResult } from '../bridge/index.js';
4
4
  import type { AgentBinding } from '../bridge/queue-manager.js';
5
5
  import type { CloneSession } from '../clone.js';
6
6
  import { type VersionCheckResult, type InstallResult } from '../update/index.js';
7
+ /** /resume 列表页内全量预取(readSessionContent)的行数上限;其余行用轻量 summary 兜底。 */
8
+ /**
9
+ * Reader summary 占位符(trim 后匹配)。各 reader 在"无 user 消息"时返回的
10
+ * 兜底文案不同(claude/pi `(无摘要)`、codex `(no user message)`、kimi
11
+ * `New Session`、空串),都不是真实输入,不得渲染成行标题。
12
+ */
13
+ /**
14
+ * 列表卡单行预览:压平空白、去掉反引号,再按字符截断。
15
+ *
16
+ * 为什么去反引号:agent 的输出里 `code` 很常见,截断点落在一对反引号中间时
17
+ * 后半张卡片的 markdown 会被当成代码块渲染(lark_md 不闭合就不回退)。
18
+ */
7
19
  /**
8
20
  * Card-action commands that must run with enqueue({ immediate: true }).
9
21
  * These bypass the serial queue and execute immediately.
@@ -125,12 +137,6 @@ export declare const SESSION_MUTATING_ACTION_CMDS: ReadonlySet<string>;
125
137
  */
126
138
  export declare const COMPACT_ACTION_CMDS: ReadonlySet<string>;
127
139
  export declare class CommandRouter {
128
- /**
129
- * Valid agent kinds — single source of truth for resume.use / resume.page /
130
- * cmdResume. 名单本体在 `runner/types.ts` 的 AGENT_KINDS(与 AgentKind 类型
131
- * 同源),这里只做别名,避免人手抄第二份。
132
- */
133
- static readonly VALID_AGENTS: readonly ["claude", "codex", "opencode", "pi", "kimi", "dsh"];
134
140
  private sessionStore;
135
141
  /** 飞书桥接实例(public:测试直接访问断言,替代 as unknown as)。 */
136
142
  bridge: Bridge;
@@ -203,8 +209,8 @@ export declare class CommandRouter {
203
209
  /**
204
210
  * 串行化 config.* 卡片回调(2026-07-04)。
205
211
  * CardKit 2.0 input/button 回调经 `enqueueImmediate` 分发,**不进串行队列**,
206
- * 多次快速点击 toggle/input 会并发读写 `pendingConfig` 并同时调
207
- * `updateCardInPlace` → Feishu API 乱序到达,导致 toggle 卡死在某个状态。
212
+ * 多次快速点击下拉/文本框会并发读写 `pendingConfig` 并同时调
213
+ * `updateCardInPlace` → Feishu API 乱序到达,控件卡死在某个状态。
208
214
  * 此 Promise chain 把所有 config.* 动作串成一个执行链,保证后到的动作
209
215
  * 等前一个动作的卡片 patch 完成后再读 `pendingConfig`。
210
216
  */
@@ -292,7 +298,37 @@ export declare class CommandRouter {
292
298
  * Handle queue.immediate: stop current run, clear queue before this message, execute this message immediately.
293
299
  * Instead of asking user to resend, we keep the target task in queue and let it execute.
294
300
  */
301
+ /**
302
+ * 把「执行编辑后的内容」注册成原队列槽位的一次性 replacement(复用入队时
303
+ * 捕获的 binding + 恢复 lane cwd,否则编辑后重跑的 run 会丢 cwd 与绑定)。
304
+ *
305
+ * 重新入队不行:`enqueue` 只能追加到 promise 链尾部,会把编辑任务甩到
306
+ * 后来者后面,违背「立即执行 = 下一个就跑」。三个调用点都必须在任何 await
307
+ * 之前注册——begin 路径消费 replacement 的时机不可预测(见
308
+ * handleQueueImmediate 步骤 1.5 的竞态说明)。
309
+ */
310
+ private registerEditedReplacement;
295
311
  private handleQueueImmediate;
312
+ /**
313
+ * 清掉排在目标之前的所有排队任务,返回实际清除条数。
314
+ *
315
+ * 两条红线:
316
+ * - 目标可能在 interruptCurrentRun 等待期间已经接跑(链并发前进),那时它已不在
317
+ * 快照里,剩下的全部排在它**后面**——清除必须在目标位置之前停下,不得越界删掉
318
+ * 用户没要求清除的任务。
319
+ * - 移除循环必须整体同步:队列链在任何 await 处都会推进(卡片 PATCH 也算),
320
+ * 一旦让出事件循环,用户要求清除的任务可能趁撤销卡还在路上就跑起来了。
321
+ * 撤销卡片由 `removeFromQueue` 统一触发(fire-and-forget)。
322
+ */
323
+ private clearTasksAheadOfTarget;
324
+ /**
325
+ * `queue.immediate` 的终态反馈(唯一出口)。
326
+ *
327
+ * 承诺必须与真实调度一致:目标只有确实是停止后的下一个,才可以把它的卡翻成
328
+ * 「执行中」并说「将立即执行」;在途接跑/被撤销/被抢先/远程停止未确认四种状态
329
+ * 各给各的文案(把没发生的事说成发生了,比沉默更糟——用户会据文案决定要不要重发)。
330
+ */
331
+ private reportImmediateOutcome;
296
332
  /**
297
333
  * Handle queue.diagnose: show diagnostic info for why message is queuing.
298
334
  */
@@ -502,6 +538,12 @@ export declare class CommandRouter {
502
538
  * 无 messageId 的调用(测试/文本路径)不登记。
503
539
  */
504
540
  private rememberConfigCard;
541
+ /**
542
+ * 把一次字段变更交给当前 agent 的 config builder(处理 provider→model 这类
543
+ * 依赖关系),逐条写进草稿,再把草稿刷到所有配置卡。
544
+ * `config.set`(下拉)与 `config.input`(输入框提交)共用同一套应用逻辑。
545
+ */
546
+ private applyConfigFieldChange;
505
547
  /**
506
548
  * 把当前草稿刷到所有已知 config 卡片上(含本次点击的那张)。
507
549
  *
@@ -511,12 +553,12 @@ export declare class CommandRouter {
511
553
  */
512
554
  private refreshConfigCards;
513
555
  /**
514
- * 串行化 config.* 卡片回调(2026-07-04 修复 toggle 卡死 bug)。
556
+ * 串行化 config.* 卡片回调(2026-07-04 修复连击卡死 bug)。
515
557
  *
516
558
  * CardKit 2.0 input/button 回调经 `enqueueImmediate` 分发,不进 bridge 的
517
- * 串行队列;多次快速点击 toggle 会并发读写 `pendingConfig` 并同时调
559
+ * 串行队列;多次快速点击下拉/文本框会并发读写 `pendingConfig` 并同时调
518
560
  * `updateCardInPlace` → 两个 patch 请求乱序到达飞书,后到达的 patch(点击 1
519
- * 的旧卡片)覆盖先到达的 patch(点击 2 的新卡片),用户看到 toggle 卡死。
561
+ * 的旧卡片)覆盖先到达的 patch(点击 2 的新卡片),用户看到控件卡死。
520
562
  *
521
563
  * 此方法把所有 config.* 动作串成一个 Promise chain:每个动作等前一个动作
522
564
  * 的 `updateCardInPlace` 完全 settle 后再读 `pendingConfig`。
@@ -606,7 +648,6 @@ export declare class CommandRouter {
606
648
  * - new-session: when requested (always shown on resume cards).
607
649
  */
608
650
  private buildResumeActionButtons;
609
- private static readonly LS_PAGE_SIZE;
610
651
  /**
611
652
  * `/ls` 实现(public:测试直接调用,替代 as unknown as)。
612
653
  *
@@ -626,20 +667,6 @@ export declare class CommandRouter {
626
667
  * 必须给绝对路径)。成功时文件本身即回复,返回 null(不额外发文本)。
627
668
  */
628
669
  cmdDownload(args: string[], ctx: CommandContext): Promise<CommandResult | null>;
629
- /**
630
- * 单文件 ls 结果卡:路径 / 大小 / 修改时间 + 「下载」+「上级」。
631
- *
632
- * `/ls <file>` 命中普通文件时使用——用户可能想下载该文件或确认它是否存在,
633
- * 此前直接回 `ls: xxx: Not a directory` 把文件路径当成错误处理。
634
- */
635
- private buildFileCard;
636
- /**
637
- * `/ws` 实现(public:测试直接调用,替代 as unknown as,与 cmdLs 同款)。
638
- *
639
- * @param offset list 分支的分页起点(条目数)
640
- * @param q list 分支的关键词筛选:name 或完整 path 命中即保留,大小写
641
- * 不敏感。省略/空 = 无筛选。
642
- */
643
670
  cmdWs(args: string[], ctx: CommandContext, offset?: number, q?: string): CommandResult;
644
671
  /**
645
672
  * DSH /resume preset 一致性校验:返回 mismatch 详情,或 undefined(一致/不可判定)。
@@ -667,13 +694,8 @@ export declare class CommandRouter {
667
694
  private prefetchConfigCardCatalogs;
668
695
  /** Build an interactive config card with CardKit 2.0 tabs + batch save */
669
696
  buildConfigCard(): CommandResult;
670
- /** /order 实现(public:测试直接调用,替代 as unknown as)。 */
671
- cmdOrder(args: string[], _ctx: CommandContext, offset?: number): CommandResult;
672
- /** /order alias add:按 orderId 或列表序号(1 基)解析目标指令并绑定别名。 */
673
- private cmdOrderAliasAdd;
674
- /** /order alias rm:按 orderId 或列表序号(1 基)移除指令的别名。 */
675
- private cmdOrderAliasRemove;
676
- /** 将 `/order alias add|rm` 的目标解析为 order:优先 orderId 精确匹配,回退列表序号(1 基)。 */
697
+ /** /order 实现(public:测试直接调用)。 */
698
+ cmdOrder(args: string[], ctx: CommandContext, offset?: number): CommandResult;
677
699
  private resolveOrderTarget;
678
700
  }
679
701
  export {};