lark-remote 0.4.5 → 0.5.1
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.
- package/CHANGELOG.md +34 -0
- package/dist/bridge/approval-coordinator.d.ts +1 -1
- package/dist/bridge/approval-coordinator.js +3 -3
- package/dist/bridge/inbound-media.js +10 -7
- package/dist/bridge/index.d.ts +55 -17
- package/dist/bridge/index.js +145 -74
- package/dist/bridge/queue-manager.d.ts +71 -20
- package/dist/bridge/queue-manager.js +139 -57
- package/dist/card/approval-render.d.ts +1 -1
- package/dist/card/approval-render.js +6 -6
- package/dist/card/bash-card-session.d.ts +3 -3
- package/dist/card/bash-card-session.js +3 -3
- package/dist/card/bash-renderer.js +1 -1
- package/dist/card/card-session.d.ts +4 -4
- package/dist/card/card-session.js +6 -6
- package/dist/card/run-card-session.js +2 -2
- package/dist/card/run-renderer.d.ts +1 -1
- package/dist/card/run-renderer.js +14 -14
- package/dist/card/run-state.d.ts +2 -2
- package/dist/card/run-state.js +3 -3
- package/dist/card/tool-render.d.ts +1 -1
- package/dist/card/tool-render.js +6 -6
- package/dist/cli.js +2 -1
- package/dist/clone.d.ts +5 -3
- package/dist/clone.js +8 -4
- package/dist/common/truncate.d.ts +1 -1
- package/dist/common/truncate.js +2 -2
- package/dist/common/ttl-cache.d.ts +2 -2
- package/dist/common/ttl-cache.js +2 -2
- package/dist/config/codex-config.d.ts +9 -9
- package/dist/config/codex-config.js +18 -18
- package/dist/config/dir.js +5 -2
- package/dist/config/index.d.ts +3 -3
- package/dist/config/index.js +6 -6
- package/dist/config/opencode-config.js +3 -3
- package/dist/connector/index.d.ts +5 -5
- package/dist/connector/index.js +24 -11
- package/dist/inbound/event.d.ts +1 -1
- package/dist/inbound/event.js +1 -1
- package/dist/inbound/placeholder.d.ts +2 -2
- package/dist/inbound/placeholder.js +2 -2
- package/dist/index.js +23 -12
- package/dist/instance-lock.js +4 -3
- package/dist/logger/index.d.ts +1 -1
- package/dist/logger/index.js +4 -4
- package/dist/persistence/atomic-write.d.ts +1 -1
- package/dist/persistence/atomic-write.js +6 -2
- package/dist/platform/agent-stopper.d.ts +1 -1
- package/dist/platform/identity.d.ts +7 -1
- package/dist/platform/identity.js +2 -2
- package/dist/platform/path.d.ts +6 -0
- package/dist/platform/path.js +14 -8
- package/dist/platform/select.d.ts +1 -1
- package/dist/platform/select.js +1 -1
- package/dist/platform/shell.d.ts +2 -3
- package/dist/platform/spawn.d.ts +2 -2
- package/dist/platform/spawn.js +2 -2
- package/dist/platform/terminator-posix.js +1 -1
- package/dist/platform/terminator-win32.js +2 -2
- package/dist/platform/terminator.d.ts +3 -3
- package/dist/platform/terminator.js +2 -2
- package/dist/platform/types.d.ts +1 -1
- package/dist/restart.d.ts +1 -1
- package/dist/restart.js +5 -3
- package/dist/router/config/codex.d.ts +1 -1
- package/dist/router/config/codex.js +2 -2
- package/dist/router/config/opencode.js +1 -1
- package/dist/router/index.d.ts +65 -16
- package/dist/router/index.js +141 -47
- package/dist/router/order-exec-dispatch.js +2 -2
- package/dist/runner/bash/runner.d.ts +2 -2
- package/dist/runner/bash/runner.js +6 -6
- package/dist/runner/claude/runner.js +1 -1
- package/dist/runner/claude/session.d.ts +2 -2
- package/dist/runner/claude/session.js +14 -14
- package/dist/runner/codex/app-server/runner.d.ts +28 -0
- package/dist/runner/codex/app-server/runner.js +57 -4
- package/dist/runner/codex/app-server/translator.d.ts +2 -2
- package/dist/runner/codex/app-server/translator.js +5 -5
- package/dist/runner/common/acp/acp-approval.d.ts +2 -2
- package/dist/runner/common/acp/acp-approval.js +3 -3
- package/dist/runner/common/acp/base-acp-runner.js +1 -1
- package/dist/runner/common/acp/base-translator.d.ts +3 -3
- package/dist/runner/common/acp/base-translator.js +4 -4
- package/dist/runner/common/acp/protocol-types.js +1 -1
- package/dist/runner/common/connection-based-runner.d.ts +1 -1
- package/dist/runner/common/connection-based-runner.js +2 -2
- package/dist/runner/common/jsonl-stream.d.ts +2 -2
- package/dist/runner/common/jsonl-stream.js +12 -12
- package/dist/runner/common/jsonrpc/client.d.ts +1 -1
- package/dist/runner/common/jsonrpc/client.js +1 -1
- package/dist/runner/common/jsonrpc/connection-manager.d.ts +1 -1
- package/dist/runner/common/jsonrpc/connection-manager.js +1 -1
- package/dist/runner/common/jsonrpc/transport.d.ts +1 -1
- package/dist/runner/common/jsonrpc/transport.js +2 -2
- package/dist/runner/common/spawning-runner.d.ts +21 -8
- package/dist/runner/common/spawning-runner.js +41 -15
- package/dist/runner/dsh/runner.js +2 -2
- package/dist/runner/kimi/acp/runner.d.ts +3 -3
- package/dist/runner/kimi/acp/runner.js +9 -9
- package/dist/runner/kimi/acp/translator.d.ts +2 -2
- package/dist/runner/kimi/acp/translator.js +4 -4
- package/dist/runner/opencode/acp/runner.d.ts +2 -2
- package/dist/runner/opencode/acp/runner.js +3 -3
- package/dist/runner/opencode/acp/translator.js +1 -1
- package/dist/runner/pi/rpc/runner.js +2 -2
- package/dist/runner/pi/rpc/translator.d.ts +1 -1
- package/dist/runner/pi/rpc/translator.js +4 -4
- package/dist/runner/types.d.ts +11 -2
- package/dist/runner/types.js +12 -1
- package/dist/session/claude/session-index.d.ts +12 -0
- package/dist/session/claude/session-index.js +20 -5
- package/dist/session/claude/sessions.js +10 -10
- package/dist/session/codex/rollout-reader.d.ts +4 -4
- package/dist/session/codex/rollout-reader.js +12 -12
- package/dist/session/common/two-pass.js +2 -2
- package/dist/session/common/usage-accumulator.d.ts +2 -2
- package/dist/session/common/usage-accumulator.js +2 -2
- package/dist/session/dsh/sessions.js +2 -2
- package/dist/session/kimi/sessions.d.ts +2 -2
- package/dist/session/kimi/sessions.js +11 -11
- package/dist/session/opencode/sessions.d.ts +3 -3
- package/dist/session/opencode/sessions.js +12 -10
- package/dist/session/pi/sessions.js +13 -12
- package/dist/session/session-store.d.ts +1 -1
- package/dist/session/session-store.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,40 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.5.1] - 2026-10-09
|
|
9
|
+
|
|
10
|
+
### 修复
|
|
11
|
+
|
|
12
|
+
- **旧卡片上的 Compact 按钮点下去不再报「该任务已结束或不属于当前会话」**:Compact 按钮只带本轮 run 的标识,此前按「每个工作目录最新一条 run」反查会话,而 compact 动作走串行队列——排队期间后续 run 收尾会覆盖那一个槽位,旧卡片于是必然失效。现在每条 run 收尾时按自己的标识记下会话与 agent,按钮自证身份,排队多久都不失效;Compact 也改为按该 run 自己的目录反查,中途切过目录不会压错会话
|
|
13
|
+
- **同一会话的多条排队卡片不再互相顶掉**:队列条目此前复用飞书卡片的消息 id 当身份,同一会话里多条卡片撞同一个 key,先入队的那条被后面的覆盖、状态更新串到别的卡片上。改为每次入队铸造独立身份
|
|
14
|
+
- **排队卡片会说清「在等谁」**:Compact 与普通消息共用同一条串行队列,Compact 占着执行位时新消息卡片仍写「位置: 第 1 位 / 前面还有: 0 条」,看着像马上就能轮到自己。现在没有等待中的消息时头部改为「等待当前任务结束」、正文写明正在执行的是 Compact 并收起位置行;占用者是 Compact 时「⚡ 立即执行」在渲染层置灰、执行层再加一道守卫,「❌ 撤销」保持可用
|
|
15
|
+
- **codex 多 agent 会话不再把会话指针写坏**:codex app-server 会把子 agent 的开轮通知一起推过来,此前不判断归属,子线程的事件覆盖了本轮的线程标识,顶层会话指针被写成子线程标识——该值在会话索引里不是键,之后恢复会话报 `cannot resume an unloaded multi-agent v2 sub-agent`,`/restart` 也救不回来。现在通知按线程归属过滤;审批结算仍按请求标识走,子 agent 的审批照常可以回答
|
|
16
|
+
- **带 `dsh` 的卡片不再静默退回默认 agent**:agent 名单此前被手抄成多份并发生漂移,收敛为单一来源、校验由该名单派生,消除「用错 reader → 未找到 session」的静默降级
|
|
17
|
+
|
|
18
|
+
### 变更
|
|
19
|
+
|
|
20
|
+
- **消除两处宿主环境相关的测试假红**:宿主带上本机没有的 locale(macOS 常见的 `LC_ALL=C.UTF-8`)时,bash 每次启动都往 stderr 打 setlocale 警告,让输出断言随机变红,测试 setup 阶段现在剔掉该变量(保留 UTF-8 解析所需项);JSON-RPC 退出计时用例的计时起点从进程启动改到收到 `initialize` 应答,慢速 Windows runner 上不再因启动耗时超过阈值而误红
|
|
21
|
+
- **英文架构文档补齐**:`docs/en/architecture/design.md` 增补与中文侧对应的五个章节,英中两侧不再不对称
|
|
22
|
+
- **注释与用例名清理**:延续上一版的清理,去掉剩余指向未发布文档的引用与评审编号,并修正清理过程中留下的残句。无行为变化
|
|
23
|
+
|
|
24
|
+
## [0.5.0] - 2026-10-07
|
|
25
|
+
|
|
26
|
+
### 新增
|
|
27
|
+
|
|
28
|
+
- **CI 增加 Windows 全量验证**:新增 `windows-latest` job(install → typecheck → test → build → `--version`/`--help` 冒烟)。此前只有 ubuntu job,被平台门控跳过的用例在 CI 里是盲区,win32 独有回归只能靠本地发现
|
|
29
|
+
|
|
30
|
+
### 修复
|
|
31
|
+
|
|
32
|
+
- **一次发多图/多文件不再只保存 1 个**:飞书客户端「一次选多图/多文件」会背靠背秒发成多条独立消息,SDK 层 600ms 去抖把它们合并成一条——只保留最后一条的 `messageId`,却把多条消息的附件求并集。下载侧于是拿同一个 `messageId` 去下所有文件,除最后一条外全部报 234003(HTTP 400)。现关掉 SDK 这层合批(`chatQueue` 串行与卡片动作通道保留),合批交回项目自身的合并窗口
|
|
33
|
+
- **Windows 上会话偶尔「消失」**:按工作目录查会话时,大小写/分隔符/尾斜杠的归一不统一,`C:\Work` 与 `c:/work/` 被当成两个目录,`/resume` 列表会漏列。现统一走同一套判等键
|
|
34
|
+
- **Windows 上含 `<>:"|?*` 或尾点的文件名落盘失败**:入站附件名现在会剥掉 win32 非法字符与尾部点/空格(win32 会静默剥离它们,导致落盘名与记录名不一致)
|
|
35
|
+
- **Windows 上可能误杀其他工作目录的 agent**:pid 文件名此前只按消毒后的目录名区分,`/w/a+b` 与 `/w/a_b` 会撞同一个文件,启动时的孤儿回收可能杀掉对方工作目录里存活的 agent。现后缀掺入原始目录的哈希
|
|
36
|
+
- **`~` 开头的配置目录在 Windows 上不展开**:`~\` 形式此前不识别
|
|
37
|
+
|
|
38
|
+
### 变更
|
|
39
|
+
|
|
40
|
+
- **注释与测试命名清理**:去掉源码、测试注释与用例名中指向未发布内部文档的引用(评审条目号、场景号、轮次号、文件名前缀),让公开仓库里的引用都能落地。无行为变化
|
|
41
|
+
|
|
8
42
|
## [0.4.5] - 2026-10-07
|
|
9
43
|
|
|
10
44
|
### 修复
|
|
@@ -95,7 +95,7 @@ export declare class ApprovalCoordinator {
|
|
|
95
95
|
nonce?: string;
|
|
96
96
|
}): Promise<void>;
|
|
97
97
|
/**
|
|
98
|
-
* AskUserQuestion 自定义答案(Other
|
|
98
|
+
* AskUserQuestion 自定义答案(Other):自由文本直接作为该
|
|
99
99
|
* 单选问题的答案。与单选 toggle 同语义:全部问题答完自动提交。
|
|
100
100
|
*/
|
|
101
101
|
answerCustom(action: {
|
|
@@ -180,7 +180,7 @@ export class ApprovalCoordinator {
|
|
|
180
180
|
}
|
|
181
181
|
const selected = new Set(q.selected ?? []);
|
|
182
182
|
if (q.multiSelect) {
|
|
183
|
-
//
|
|
183
|
+
// 多选切换按钮同一 nonce 重复投递(双击/飞书重投递)只应
|
|
184
184
|
// toggle 一次,否则勾选会被二次 toggle 抵消。单选用例的重复防护在
|
|
185
185
|
// respondQuestionAnswers(提交即幂等,选中是 set 语义)。
|
|
186
186
|
this.assertFreshNonce(ctx.requestId, ctx.nonce);
|
|
@@ -226,7 +226,7 @@ export class ApprovalCoordinator {
|
|
|
226
226
|
}
|
|
227
227
|
}
|
|
228
228
|
/**
|
|
229
|
-
* AskUserQuestion 自定义答案(Other
|
|
229
|
+
* AskUserQuestion 自定义答案(Other):自由文本直接作为该
|
|
230
230
|
* 单选问题的答案。与单选 toggle 同语义:全部问题答完自动提交。
|
|
231
231
|
*/
|
|
232
232
|
async answerCustom(action, ctx) {
|
|
@@ -451,7 +451,7 @@ export class ApprovalCoordinator {
|
|
|
451
451
|
void this.responder(requestId, { action: 'cancel' }).catch((err) => {
|
|
452
452
|
getLogger().warn(`[approval-coordinator] expiry cancel failed requestId=${requestId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
453
453
|
// 响应失败不是「正常过期」:状态升级为 failed,避免误判为已正常通知
|
|
454
|
-
// server(spec
|
|
454
|
+
// server(spec responder 抛错时状态置 failed)。
|
|
455
455
|
tracked.state = 'failed';
|
|
456
456
|
// 兜底:cancel 未能送达时主动中断 turn,避免 server 无限等待审批响应。
|
|
457
457
|
void this.interruptTurn().catch((interruptErr) => {
|
|
@@ -63,7 +63,9 @@ function timestampHms(d) {
|
|
|
63
63
|
}
|
|
64
64
|
/**
|
|
65
65
|
* 文件名 sanitize:
|
|
66
|
-
* path.basename 剥离目录(防 `../`
|
|
66
|
+
* path.basename 剥离目录(防 `../` 穿越),再替换控制字符、路径分隔符与
|
|
67
|
+
* win32 非法字符(`<>:"|?*`,NTFS/Win32 API 拒绝,落盘直接 EPERM/EINVAL),
|
|
68
|
+
* 并剥掉尾部的点与空格(win32 会静默剥离它们,导致落盘名 ≠ originalName);
|
|
67
69
|
* 空名 / `.` / `..` 视为无效(返回空串由调用方生成兜底名)。
|
|
68
70
|
*/
|
|
69
71
|
function sanitizeFileName(name) {
|
|
@@ -71,19 +73,20 @@ function sanitizeFileName(name) {
|
|
|
71
73
|
const chars = [];
|
|
72
74
|
for (const ch of base) {
|
|
73
75
|
const code = ch.charCodeAt(0);
|
|
74
|
-
//
|
|
75
|
-
//
|
|
76
|
-
if (code <= 0x1f || code === 0x7f ||
|
|
76
|
+
// 控制字符、路径分隔符与 win32 非法字符一律替换为下划线(no-control-regex
|
|
77
|
+
// 不允许字面控制字符转义出现在正则里,逐字符判断语义等价且无 lint 冲突)。
|
|
78
|
+
if (code <= 0x1f || code === 0x7f || '/\\<>:"|?*'.includes(ch)) {
|
|
77
79
|
chars.push('_');
|
|
78
80
|
}
|
|
79
81
|
else {
|
|
80
82
|
chars.push(ch);
|
|
81
83
|
}
|
|
82
84
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
+
// 尾部的点与空格:win32 落盘时被静默剥离,提前剥掉保证记录名与磁盘名一致
|
|
86
|
+
const trimmedEnd = chars.join('').replace(/[. ]+$/, '');
|
|
87
|
+
if (trimmedEnd === '' || trimmedEnd === '.' || trimmedEnd === '..')
|
|
85
88
|
return '';
|
|
86
|
-
return
|
|
89
|
+
return trimmedEnd;
|
|
87
90
|
}
|
|
88
91
|
/**
|
|
89
92
|
* 资源扩展名(图片/视频/语音):优先 MIME 映射,未知时按魔数兜底;
|
package/dist/bridge/index.d.ts
CHANGED
|
@@ -4,8 +4,8 @@ import type { SessionReaderRegistry, SessionStore } from '../session/index.js';
|
|
|
4
4
|
import type { AppConfig } from '../config/index.js';
|
|
5
5
|
import { type RunCardChannel } from '../card/run-card-session.js';
|
|
6
6
|
import type { RunTerminal } from '../card/run-state.js';
|
|
7
|
-
import type
|
|
8
|
-
import { QueueManager, type QueuedTask, type EnqueueOptions, type AgentBinding } from './queue-manager.js';
|
|
7
|
+
import { type AgentKind } from '../runner/types.js';
|
|
8
|
+
import { QueueManager, type QueuedTask, type EnqueueOptions, type AgentBinding, type ExecutingInfo } from './queue-manager.js';
|
|
9
9
|
import type { InboundMediaPayload } from '../connector/index.js';
|
|
10
10
|
import type { MediaOutcome } from '../inbound/turn.js';
|
|
11
11
|
/**
|
|
@@ -36,7 +36,7 @@ export interface CommandContext {
|
|
|
36
36
|
/**
|
|
37
37
|
* 本轮(装配窗口)全部入站 messageId,`messageId` 是其中最后一条。
|
|
38
38
|
* 只有走入站装配器的路径会填;卡片动作等单消息路径留空,收尾退化为只处理
|
|
39
|
-
* `messageId`。缺它会导致合并轮次里先到的消息挂着 Typing
|
|
39
|
+
* `messageId`。缺它会导致合并轮次里先到的消息挂着 Typing 不撤。
|
|
40
40
|
*/
|
|
41
41
|
turnMessageIds?: string[];
|
|
42
42
|
}
|
|
@@ -127,7 +127,7 @@ export declare class Bridge {
|
|
|
127
127
|
*/
|
|
128
128
|
private runners;
|
|
129
129
|
/**
|
|
130
|
-
* Runner 槽位在「活跃运行期间配置变更」时被标 stale
|
|
130
|
+
* Runner 槽位在「活跃运行期间配置变更」时被标 stale:clearRunners() 对
|
|
131
131
|
* 活跃 cwd 只标 stale、不立即 evict(避免误杀长驻连接),当前 run 结束后由
|
|
132
132
|
* finalizeRun 安全 evict+dispose,下一轮 getRunner 创建新配置的 runner。
|
|
133
133
|
* key 为 `${cwd}\u0000${agentKind}`。
|
|
@@ -141,10 +141,16 @@ export declare class Bridge {
|
|
|
141
141
|
/** Approval coordinators keyed by runId. */
|
|
142
142
|
private approvalCoordinators;
|
|
143
143
|
/**
|
|
144
|
-
*
|
|
145
|
-
* activeRuns
|
|
144
|
+
* 最近若干次已完成的、runner 有 runCompact 的 run(cwd → runId → 记录)。
|
|
145
|
+
* run 结束后 activeRuns 已清空,而终态卡上的 Compact 按钮只带 runId,
|
|
146
|
+
* 需要它反查 sessionId + agentKind。
|
|
147
|
+
*
|
|
148
|
+
* 为什么按 runId 存而不是「每 cwd 只留最新一条」:compact 卡片动作走串行
|
|
149
|
+
* 队列(会被正在跑的 run 挡住),点击到执行之间可能夹着别的 run 收尾。
|
|
150
|
+
* 单槽会被覆盖 —— 旧卡片的压缩必然报「该任务已结束或不属于当前会话」,
|
|
151
|
+
* 与 session 是否还在、能否压缩无关(2026-10-08 线上缺陷)。
|
|
146
152
|
*/
|
|
147
|
-
private
|
|
153
|
+
private compactableRuns;
|
|
148
154
|
/**
|
|
149
155
|
* Active `!` bash runs, keyed by runId (NOT cwd). Bash runs bypass the serial
|
|
150
156
|
* queue and may run in parallel with claude runs / other bash runs in the same
|
|
@@ -174,17 +180,17 @@ export declare class Bridge {
|
|
|
174
180
|
syncActiveApprovalModes(): void;
|
|
175
181
|
/** Per-agent approval-mode settings snapshot from the current config. */
|
|
176
182
|
private approvalModeSettingsFor;
|
|
177
|
-
/** Get the current runner for a cwd. Used by router for agent-specific commands (
|
|
183
|
+
/** Get the current runner for a cwd. Used by router for agent-specific commands (.2). */
|
|
178
184
|
getCurrentRunner(cwd: string): AgentRunner;
|
|
179
185
|
/**
|
|
180
186
|
* Whether the runner for the given agent kind has runCompact capability.
|
|
181
|
-
* Used by router for compact button gating (
|
|
187
|
+
* Used by router for compact button gating (duck-typing
|
|
182
188
|
* instead of hardcoding agentKind === 'codex').
|
|
183
189
|
*/
|
|
184
190
|
hasRunCompact(cwd: string, kind?: AgentKind): boolean;
|
|
185
191
|
/** 入队时刻快照:当前 defaultAgent + 该 agent 的 sessionId(无 session 则 undefined)。
|
|
186
|
-
*
|
|
187
|
-
* 执行时刻,避免 /new、/config 在排队期间改写 live
|
|
192
|
+
* 唯一捕获点:排队消息在入队时刻把 agent+session 钉进 AgentBinding,随任务闭包带到执行时刻
|
|
193
|
+
* 执行时刻,避免 /new、/config 在排队期间改写 live 状态导致语义漂移。 */
|
|
188
194
|
currentBinding(userId: string): AgentBinding;
|
|
189
195
|
/**
|
|
190
196
|
* Clear all cached runner instances. Call after config changes that affect runner config.
|
|
@@ -192,7 +198,7 @@ export declare class Bridge {
|
|
|
192
198
|
clearRunners(): void;
|
|
193
199
|
/**
|
|
194
200
|
* Evict a (cwd, agentKind) runner cache slot. Unregisters the runner from the
|
|
195
|
-
* process-level exit dispatcher first (
|
|
201
|
+
* process-level exit dispatcher first (without removal the singleton
|
|
196
202
|
* Set<Runner> retains every historical runner instance, so memory still grows
|
|
197
203
|
* with run count), then deletes the slot. Every runner-discarding path
|
|
198
204
|
* (clearRunners / finalizeRun / interruptCurrentRun) must go through this.
|
|
@@ -233,6 +239,11 @@ export declare class Bridge {
|
|
|
233
239
|
tasksAhead: number;
|
|
234
240
|
isRunning: boolean;
|
|
235
241
|
};
|
|
242
|
+
/**
|
|
243
|
+
* lane 当前占用者的展示信息(排队卡与「立即执行」守卫共用)。
|
|
244
|
+
* 典型用途:占用者是 Compact 时拒绝 queue.immediate,避免中断压缩。
|
|
245
|
+
*/
|
|
246
|
+
getQueueExecutingInfo(cwd: string): ExecutingInfo | undefined;
|
|
236
247
|
/** Remove a task from the queue by messageId. Returns true if found and removed. */
|
|
237
248
|
removeFromQueue(cwd: string, messageId: string): boolean;
|
|
238
249
|
/**
|
|
@@ -323,6 +334,17 @@ export declare class Bridge {
|
|
|
323
334
|
* Returns true if the in-place update succeeded, false if it fell back.
|
|
324
335
|
*/
|
|
325
336
|
updateCardInPlace(card: object, ctx: CommandContext): Promise<boolean>;
|
|
337
|
+
/**
|
|
338
|
+
* Best-effort in-place refresh of a KNOWN card (no fallback send).
|
|
339
|
+
*
|
|
340
|
+
* `updateCardInPlace` falls back to sending a new card when the PATCH fails,
|
|
341
|
+
* which is right for the card the user just clicked (a silent failure would
|
|
342
|
+
* leave the click with no feedback) but wrong when refreshing *sibling*
|
|
343
|
+
* cards: an expired/withdrawn card would spawn a duplicate card on every
|
|
344
|
+
* edit. Callers that fan out to several cards use this instead and drop the
|
|
345
|
+
* card id from their set on `false`.
|
|
346
|
+
*/
|
|
347
|
+
patchCard(messageId: string, card: object): Promise<boolean>;
|
|
326
348
|
/** Send a file to the user via Feishu. */
|
|
327
349
|
sendFile(filePath: string, ctx: CommandContext): Promise<void>;
|
|
328
350
|
/**
|
|
@@ -354,7 +376,7 @@ export declare class Bridge {
|
|
|
354
376
|
*/
|
|
355
377
|
private createRunSession;
|
|
356
378
|
/**
|
|
357
|
-
* §9.12 空闲看门狗:单 interval +
|
|
379
|
+
* §9.12 空闲看门狗:单 interval + 截止时间判定,普通 run 与 compact
|
|
358
380
|
* 共用同一套兜底。事件到达只 `touch()` 刷新时间戳(无 timer 操作);静默超过
|
|
359
381
|
* `idleTimeoutMs` 才 finish('idle_timeout') + runner.stop(),让该工作区的串行
|
|
360
382
|
* 队列继续推进(否则一个挂死的 run 永久堵住后续消息)。
|
|
@@ -443,7 +465,7 @@ export declare class Bridge {
|
|
|
443
465
|
nonce: string;
|
|
444
466
|
}): Promise<void>;
|
|
445
467
|
/**
|
|
446
|
-
* Claude AskUserQuestion 自定义答案(Other
|
|
468
|
+
* Claude AskUserQuestion 自定义答案(Other):自由文本直接
|
|
447
469
|
* 作为该单选问题的答案提交。路由到 ApprovalCoordinator.answerCustom。
|
|
448
470
|
*/
|
|
449
471
|
handleApprovalAnswerCustom(opts: {
|
|
@@ -465,11 +487,27 @@ export declare class Bridge {
|
|
|
465
487
|
text: string;
|
|
466
488
|
nonce: string;
|
|
467
489
|
}): Promise<void>;
|
|
490
|
+
/**
|
|
491
|
+
* 记下一次「可压缩 run」:终态卡上的 Compact 按钮点击时据此反查
|
|
492
|
+
* sessionId + agentKind。runId 是按钮自带的唯一键,同 cwd 内唯一。
|
|
493
|
+
* 超出上限按插入序淘汰最旧的一条(Map 保持插入序;重复写同一 runId
|
|
494
|
+
* 先 delete 再 set 以刷新位置)。
|
|
495
|
+
*/
|
|
496
|
+
private recordCompactableRun;
|
|
497
|
+
/**
|
|
498
|
+
* 按 runId 反查可压缩 run 记录(跨 cwd 扫描)。
|
|
499
|
+
*
|
|
500
|
+
* 为什么不带 cwd 过滤:按钮属于「那一次 run」,与用户此刻在哪个工作目录、
|
|
501
|
+
* 排队期间有没有 /cd 无关。`/stop` 的 interruptCurrentRun 同样是全局按 runId
|
|
502
|
+
* 找(从不查当前 cwd),compact 与它保持一致。用当前 cwd 收窄会让「切了工作区
|
|
503
|
+
* 再点旧卡片」和「排队期间 /cd」两种情况误报「该任务已结束或不属于当前会话」。
|
|
504
|
+
*/
|
|
505
|
+
private findCompactableRun;
|
|
468
506
|
/**
|
|
469
507
|
* Handle compact card action — trigger a compaction request for any
|
|
470
|
-
* runCompact-capable runner(codex/kimi/opencode/pi/claude
|
|
471
|
-
*
|
|
472
|
-
*
|
|
508
|
+
* runCompact-capable runner(codex/kimi/opencode/pi/claude)。按钮带的是
|
|
509
|
+
* 那次 run 的 runId,据此反查该 run 实际使用的 sessionId + agentKind
|
|
510
|
+
* + cwd(compactableRuns,按 runId 记录),再调 runner 的 runCompact()。
|
|
473
511
|
*/
|
|
474
512
|
handleCompactAction(value: {
|
|
475
513
|
runId?: string;
|