lark-remote 0.5.19 → 0.5.21
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 +29 -0
- package/dist/bridge/approval-actions.d.ts +1 -1
- package/dist/bridge/approval-actions.js +1 -1
- package/dist/bridge/bash-run.d.ts +71 -0
- package/dist/bridge/bash-run.js +217 -0
- package/dist/bridge/compact.d.ts +155 -0
- package/dist/bridge/compact.js +450 -0
- package/dist/bridge/final-usage.js +4 -4
- package/dist/bridge/inbound-media.js +72 -46
- package/dist/bridge/index.d.ts +106 -153
- package/dist/bridge/index.js +400 -1000
- package/dist/bridge/job-watch.d.ts +68 -0
- package/dist/bridge/job-watch.js +146 -0
- package/dist/bridge/queue-manager.d.ts +3 -3
- package/dist/bridge/queue-manager.js +10 -29
- package/dist/card/approval-render.d.ts +2 -2
- package/dist/card/approval-render.js +141 -130
- package/dist/card/card-budget.js +123 -98
- package/dist/card/card-helpers.d.ts +3 -3
- package/dist/card/card-helpers.js +6 -6
- package/dist/card/final-answer-file.js +1 -1
- package/dist/card/run-renderer.d.ts +3 -3
- package/dist/card/run-renderer.js +114 -159
- package/dist/card/run-state.d.ts +1 -15
- package/dist/card/run-state.js +358 -292
- package/dist/card/tool-render.d.ts +1 -1
- package/dist/card/tool-render.js +21 -17
- package/dist/card/usage-format.d.ts +22 -7
- package/dist/card/usage-format.js +119 -100
- package/dist/cli.js +15 -3
- package/dist/clone.js +2 -2
- package/dist/common/text-width.js +36 -24
- package/dist/common/tool-summary.js +132 -90
- package/dist/config/codex-config.js +130 -106
- package/dist/config/index.d.ts +16 -2
- package/dist/config/index.js +23 -8
- package/dist/connector/index.js +6 -6
- package/dist/error-classification.js +3 -2
- package/dist/inbound/placeholder.d.ts +1 -1
- package/dist/inbound/placeholder.js +1 -1
- package/dist/index.js +387 -281
- package/dist/logger/index.js +6 -6
- package/dist/message-handlers.d.ts +0 -5
- package/dist/message-handlers.js +254 -237
- package/dist/model-catalog.d.ts +2 -2
- package/dist/model-catalog.js +3 -8
- package/dist/platform/identity.js +1 -1
- package/dist/platform/path.d.ts +1 -1
- package/dist/platform/path.js +1 -1
- package/dist/platform/sleep-blocker.js +1 -1
- package/dist/platform/terminator-win32.js +2 -1
- package/dist/router/commands/ls.d.ts +3 -0
- package/dist/router/commands/ls.js +256 -175
- package/dist/router/commands/order.js +184 -159
- package/dist/router/commands/resume.js +190 -152
- package/dist/router/commands/ws.js +219 -174
- package/dist/router/config/dsh.d.ts +4 -8
- package/dist/router/config/dsh.js +3 -10
- package/dist/router/config/kimi.js +1 -1
- package/dist/router/config/types.d.ts +1 -1
- package/dist/router/config-diff.js +1 -1
- package/dist/router/index.d.ts +56 -11
- package/dist/router/index.js +401 -391
- package/dist/runner/bash/runner.js +2 -4
- package/dist/runner/claude/session.d.ts +1 -1
- package/dist/runner/claude/session.js +6 -4
- package/dist/runner/codex/app-server/runner.d.ts +9 -2
- package/dist/runner/codex/app-server/runner.js +30 -25
- package/dist/runner/codex/app-server/translator.d.ts +2 -5
- package/dist/runner/codex/app-server/translator.js +291 -238
- package/dist/runner/common/acp/acp-approval.d.ts +1 -1
- package/dist/runner/common/acp/acp-approval.js +1 -1
- package/dist/runner/common/acp/base-acp-runner.d.ts +5 -2
- package/dist/runner/common/acp/base-acp-runner.js +26 -65
- package/dist/runner/common/acp/base-translator.d.ts +12 -2
- package/dist/runner/common/acp/base-translator.js +50 -26
- package/dist/runner/common/acp/protocol-types.d.ts +1 -1
- package/dist/runner/common/acp/protocol-types.js +2 -2
- package/dist/runner/common/connection-based-runner.d.ts +32 -1
- package/dist/runner/common/connection-based-runner.js +32 -2
- package/dist/runner/common/jsonl-stream.js +154 -187
- package/dist/runner/common/jsonrpc/client.d.ts +29 -0
- package/dist/runner/common/jsonrpc/client.js +43 -12
- package/dist/runner/common/jsonrpc/connection-manager.d.ts +2 -2
- package/dist/runner/common/jsonrpc/connection-manager.js +4 -4
- package/dist/runner/common/spawning-runner.d.ts +6 -1
- package/dist/runner/common/spawning-runner.js +9 -4
- package/dist/runner/common/turn-started.d.ts +8 -0
- package/dist/runner/common/turn-started.js +11 -0
- package/dist/runner/dsh/approval.js +84 -51
- package/dist/runner/dsh/catalog-probe.d.ts +17 -0
- package/dist/runner/dsh/catalog-probe.js +10 -0
- package/dist/runner/dsh/client.d.ts +7 -11
- package/dist/runner/dsh/client.js +356 -289
- package/dist/runner/dsh/exit-cancel.d.ts +2 -2
- package/dist/runner/dsh/exit-cancel.js +2 -2
- package/dist/runner/dsh/inflight.d.ts +1 -1
- package/dist/runner/dsh/inflight.js +1 -1
- package/dist/runner/dsh/mux-stream.js +28 -8
- package/dist/runner/dsh/runner.d.ts +44 -4
- package/dist/runner/dsh/runner.js +296 -199
- package/dist/runner/dsh/translator.d.ts +1 -31
- package/dist/runner/dsh/translator.js +180 -178
- package/dist/runner/index.d.ts +1 -1
- package/dist/runner/kimi/acp/runner.d.ts +1 -2
- package/dist/runner/kimi/acp/runner.js +82 -46
- package/dist/runner/kimi/acp/translator.d.ts +1 -1
- package/dist/runner/kimi/acp/translator.js +3 -4
- package/dist/runner/opencode/acp/error-monitor.js +5 -5
- package/dist/runner/opencode/acp/runner.d.ts +2 -2
- package/dist/runner/opencode/acp/runner.js +4 -4
- package/dist/runner/pi/rpc/client.js +4 -13
- package/dist/runner/pi/rpc/protocol-types.d.ts +1 -1
- package/dist/runner/pi/rpc/protocol-types.js +1 -1
- package/dist/runner/pi/rpc/runner.d.ts +3 -0
- package/dist/runner/pi/rpc/runner.js +27 -42
- package/dist/runner/pi/rpc/translator.js +61 -60
- package/dist/runner/types.d.ts +2 -2
- package/dist/runner/types.js +1 -1
- package/dist/session/claude/sessions.d.ts +45 -0
- package/dist/session/claude/sessions.js +160 -122
- package/dist/session/codex/rollout-reader.js +181 -182
- package/dist/session/common/throw-session-list-error.d.ts +10 -0
- package/dist/session/common/throw-session-list-error.js +16 -0
- package/dist/session/dsh/sessions.js +291 -235
- package/dist/session/kimi/sessions.d.ts +40 -8
- package/dist/session/kimi/sessions.js +373 -301
- package/dist/session/opencode/sessions.d.ts +142 -1
- package/dist/session/opencode/sessions.js +378 -321
- package/dist/session/pi/sessions.js +4 -5
- package/dist/session/session-store.d.ts +9 -1
- package/dist/session/session-store.js +99 -99
- package/dist/update/version-check.js +2 -1
- package/dist/workspace/index.d.ts +1 -1
- package/dist/workspace/index.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { Runner } from '../runner/index.js';
|
|
2
|
+
import type { AgentKind } from '../agent-kinds.js';
|
|
3
|
+
import type { CommandContext } from './index.js';
|
|
4
|
+
import type { RunCardSnapshot } from './index.js';
|
|
5
|
+
/**
|
|
6
|
+
* 终态卡后台任务订阅与停止(bridge 结构治理第 2 刀)。
|
|
7
|
+
*
|
|
8
|
+
* run 的卡片在 `result` 那一帧就关闭了,但后台任务(DSH/kimi 的宿主后台作业)
|
|
9
|
+
* 的生命周期跨 run:job.kill 停止、名单订阅、PATCH 串行链全部收在这里,与
|
|
10
|
+
* 卡片快照(bridge 侧 runCardSnapshots)按 runId 对齐。
|
|
11
|
+
*
|
|
12
|
+
* 依赖显式注入(与 ApprovalActions / CompactLifecycle 同一模式)。两张核心
|
|
13
|
+
* 状态表都归本类所有:
|
|
14
|
+
* - `jobWatches`:runId → 中止句柄。与卡片快照同生命周期——快照被淘汰、任务
|
|
15
|
+
* 全结束、patch 失败时退订。上限天然受 RUN_CARD_SNAPSHOT_MAX 约束(一张卡
|
|
16
|
+
* 最多一条流)。
|
|
17
|
+
* - `jobCardPatches`:同一张卡的 patch 串行链(runId → 链尾)。「停止按钮」和
|
|
18
|
+
* 「订阅帧」都会改同一张终态卡:不串行化时两条 PATCH 并发,后发先至的那条
|
|
19
|
+
* 会把卡片写回旧内容(任务又变回「运行中」)。
|
|
20
|
+
*/
|
|
21
|
+
export interface JobWatchLifecycleDeps {
|
|
22
|
+
getRunner(cwd: string, kind?: AgentKind): Runner;
|
|
23
|
+
/** 终态快照表在 bridge 侧(rememberRunCardSnapshot 收口),这里只读。 */
|
|
24
|
+
getRunCardSnapshot(runId: string): RunCardSnapshot | undefined;
|
|
25
|
+
/** 「停止任务」后的整卡重渲染(失败回退发新卡)。 */
|
|
26
|
+
updateCardInPlace(card: object, ctx: CommandContext): Promise<boolean>;
|
|
27
|
+
/** 订阅帧的原位 PATCH(已知卡,失败不补发)。 */
|
|
28
|
+
patchCard(messageId: string, card: object): Promise<boolean>;
|
|
29
|
+
}
|
|
30
|
+
export declare class JobWatchLifecycle {
|
|
31
|
+
private readonly deps;
|
|
32
|
+
/** 终态卡后台任务订阅(runId → 中止句柄)。 */
|
|
33
|
+
private jobWatches;
|
|
34
|
+
/** 同一张卡的 patch 串行链(runId → 链尾)。 */
|
|
35
|
+
private jobCardPatches;
|
|
36
|
+
constructor(deps: JobWatchLifecycleDeps);
|
|
37
|
+
/** 退订一张终态卡的后台任务名单(幂等)。 */
|
|
38
|
+
stopJobWatch(runId: string): void;
|
|
39
|
+
/**
|
|
40
|
+
* 停止终态卡上的一个后台任务。
|
|
41
|
+
*
|
|
42
|
+
* 后台任务的生命周期跨 run(这就是它需要单独入口的原因),所以解析路径是
|
|
43
|
+
* 终态快照(runId → sessionId/cwd/agentKind)+ 该工作区的 runner 实例,
|
|
44
|
+
* 而不是 activeRuns。成功后同步摘掉 state 里的任务并就地重渲染,否则按钮
|
|
45
|
+
* 会留在卡片上而任务早已结束。
|
|
46
|
+
*/
|
|
47
|
+
killBackgroundJob(runId: string, jobId: string, ctx: CommandContext): Promise<boolean>;
|
|
48
|
+
/**
|
|
49
|
+
* 让终态卡的后台任务小节跟着宿主继续更新。
|
|
50
|
+
*
|
|
51
|
+
* run 的卡片在 `result` 那一帧就关闭了,但后台任务还能再跑很久:不订阅,
|
|
52
|
+
* 卡片会一直写「运行中」并留着停止按钮,点了必然失败。退订条件写
|
|
53
|
+
* 在 {@link consumeJobRoster} 里——名单清空、patch 失败、订阅中断、快照被
|
|
54
|
+
* 淘汰,任一命中即退出;**绝不因为 patch 失败补发新卡**。
|
|
55
|
+
*/
|
|
56
|
+
startBackgroundJobWatch(runId: string, snapshot: RunCardSnapshot, runner: Runner): void;
|
|
57
|
+
/** 消费宿主推来的整份任务名单,直到全结束 / 流断 / patch 失败 / 外部退订。 */
|
|
58
|
+
private consumeJobRoster;
|
|
59
|
+
/** 订阅断了但任务仍未结算:把在跑的任务标成「状态未知」并重渲染一次。 */
|
|
60
|
+
private markJobsUnknown;
|
|
61
|
+
/**
|
|
62
|
+
* 一张终态卡的 PATCH 串行链。
|
|
63
|
+
*
|
|
64
|
+
* 渲染放在链内执行(`task` 里读 `snapshot.state`),后入链的任务必然看到更新
|
|
65
|
+
* 后的状态;否则「停止」与「订阅帧」并发时卡片可能回退。
|
|
66
|
+
*/
|
|
67
|
+
private enqueueJobCardPatch;
|
|
68
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { isLiveBackgroundJob, markBackgroundJobsUnknown, removeBackgroundJob, syncBackgroundJobs, } from '../card/run-state.js';
|
|
2
|
+
import { renderRunCard } from '../card/run-renderer.js';
|
|
3
|
+
import { getLogger } from '../logger/index.js';
|
|
4
|
+
import { errorMessage } from './final-usage.js';
|
|
5
|
+
export class JobWatchLifecycle {
|
|
6
|
+
deps;
|
|
7
|
+
/** 终态卡后台任务订阅(runId → 中止句柄)。 */
|
|
8
|
+
jobWatches = new Map();
|
|
9
|
+
/** 同一张卡的 patch 串行链(runId → 链尾)。 */
|
|
10
|
+
jobCardPatches = new Map();
|
|
11
|
+
constructor(deps) {
|
|
12
|
+
this.deps = deps;
|
|
13
|
+
}
|
|
14
|
+
/** 退订一张终态卡的后台任务名单(幂等)。 */
|
|
15
|
+
stopJobWatch(runId) {
|
|
16
|
+
this.jobWatches.get(runId)?.abort();
|
|
17
|
+
this.jobWatches.delete(runId);
|
|
18
|
+
this.jobCardPatches.delete(runId);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 停止终态卡上的一个后台任务。
|
|
22
|
+
*
|
|
23
|
+
* 后台任务的生命周期跨 run(这就是它需要单独入口的原因),所以解析路径是
|
|
24
|
+
* 终态快照(runId → sessionId/cwd/agentKind)+ 该工作区的 runner 实例,
|
|
25
|
+
* 而不是 activeRuns。成功后同步摘掉 state 里的任务并就地重渲染,否则按钮
|
|
26
|
+
* 会留在卡片上而任务早已结束。
|
|
27
|
+
*/
|
|
28
|
+
async killBackgroundJob(runId, jobId, ctx) {
|
|
29
|
+
const snapshot = this.deps.getRunCardSnapshot(runId);
|
|
30
|
+
const sessionId = snapshot?.state.sessionId;
|
|
31
|
+
if (!snapshot || !sessionId)
|
|
32
|
+
return false;
|
|
33
|
+
const runner = this.deps.getRunner(snapshot.cwd, snapshot.agentKind);
|
|
34
|
+
if (typeof runner.killJob !== 'function')
|
|
35
|
+
return false;
|
|
36
|
+
const killed = await runner.killJob(sessionId, jobId);
|
|
37
|
+
if (!killed)
|
|
38
|
+
return false;
|
|
39
|
+
snapshot.state = removeBackgroundJob(snapshot.state, jobId);
|
|
40
|
+
// 与订阅帧共用一条串行链:两条 PATCH 并发时,后发先至的那条会把卡片写回
|
|
41
|
+
// 旧内容(刚停掉的任务又显示成「运行中」)。
|
|
42
|
+
await this.enqueueJobCardPatch(runId, async () => {
|
|
43
|
+
await this.deps.updateCardInPlace(renderRunCard(snapshot.state, snapshot.options), ctx);
|
|
44
|
+
return true;
|
|
45
|
+
});
|
|
46
|
+
// 卡片上已经没有在跑的任务:不必再等宿主推下一帧,直接退订。
|
|
47
|
+
if (!(snapshot.state.backgroundJobs ?? []).some(isLiveBackgroundJob)) {
|
|
48
|
+
this.stopJobWatch(runId);
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 让终态卡的后台任务小节跟着宿主继续更新。
|
|
54
|
+
*
|
|
55
|
+
* run 的卡片在 `result` 那一帧就关闭了,但后台任务还能再跑很久:不订阅,
|
|
56
|
+
* 卡片会一直写「运行中」并留着停止按钮,点了必然失败。退订条件写
|
|
57
|
+
* 在 {@link consumeJobRoster} 里——名单清空、patch 失败、订阅中断、快照被
|
|
58
|
+
* 淘汰,任一命中即退出;**绝不因为 patch 失败补发新卡**。
|
|
59
|
+
*/
|
|
60
|
+
startBackgroundJobWatch(runId, snapshot, runner) {
|
|
61
|
+
const live = (snapshot.state.backgroundJobs ?? []).some(isLiveBackgroundJob);
|
|
62
|
+
if (!live)
|
|
63
|
+
return;
|
|
64
|
+
const sessionId = snapshot.state.sessionId;
|
|
65
|
+
const messageId = snapshot.messageId;
|
|
66
|
+
const watchJobs = runner.watchJobs;
|
|
67
|
+
if (!sessionId || !messageId || typeof watchJobs !== 'function') {
|
|
68
|
+
// 没有卡 id 就没有 patch 的落点:保留收尾快照,不另发一张卡。
|
|
69
|
+
getLogger().info(`[lark-remote] background jobs stay on the turn snapshot runId=${runId} ` +
|
|
70
|
+
`(sessionId=${sessionId ?? '-'} messageId=${messageId ?? '-'} watchable=${typeof watchJobs === 'function'})`);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const controller = new AbortController();
|
|
74
|
+
this.jobWatches.set(runId, controller);
|
|
75
|
+
void this.consumeJobRoster(runId, snapshot, controller, (signal) => watchJobs.call(runner, sessionId, signal));
|
|
76
|
+
}
|
|
77
|
+
/** 消费宿主推来的整份任务名单,直到全结束 / 流断 / patch 失败 / 外部退订。 */
|
|
78
|
+
async consumeJobRoster(runId, snapshot, controller, watch) {
|
|
79
|
+
const messageId = snapshot.messageId;
|
|
80
|
+
if (!messageId)
|
|
81
|
+
return;
|
|
82
|
+
let allEnded = false;
|
|
83
|
+
// 订阅帧 PATCH 已失败 → 卡片不可达:finally 不再补 markJobsUnknown。
|
|
84
|
+
let cardLost = false;
|
|
85
|
+
try {
|
|
86
|
+
for await (const roster of watch(controller.signal)) {
|
|
87
|
+
const next = syncBackgroundJobs(snapshot.state, roster);
|
|
88
|
+
// 名单没变化就不打 PATCH:宿主可能重复推同一份。
|
|
89
|
+
if (next === snapshot.state)
|
|
90
|
+
continue;
|
|
91
|
+
snapshot.state = next;
|
|
92
|
+
const ok = await this.enqueueJobCardPatch(runId, () => this.deps.patchCard(messageId, renderRunCard(snapshot.state, snapshot.options)));
|
|
93
|
+
if (!ok) {
|
|
94
|
+
getLogger().warn(`[lark-remote] background job card update failed, stop watching runId=${runId}`);
|
|
95
|
+
// 卡片已不可达:markJobsUnknown 的补写注定再失败,且「标未知」
|
|
96
|
+
// 是写给卡片读者看的——没有卡就没有读者。置标志让 finally 跳过。
|
|
97
|
+
cardLost = true;
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (!(snapshot.state.backgroundJobs ?? []).some(isLiveBackgroundJob)) {
|
|
101
|
+
allEnded = true;
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
if (!controller.signal.aborted) {
|
|
108
|
+
getLogger().warn(`[lark-remote] background job watch failed runId=${runId}: ${errorMessage(err)}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
const externallyAborted = controller.signal.aborted;
|
|
113
|
+
controller.abort();
|
|
114
|
+
// 流断了而任务没结算:监控中断 ≠ 任务结束,标成未知而不是继续写「运行中」。
|
|
115
|
+
// 但卡片 PATCH 已失败(cardLost)时不补写:补写注定失败且语义错位。
|
|
116
|
+
if (!allEnded && !cardLost && !externallyAborted)
|
|
117
|
+
await this.markJobsUnknown(runId, snapshot);
|
|
118
|
+
this.jobWatches.delete(runId);
|
|
119
|
+
this.jobCardPatches.delete(runId);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** 订阅断了但任务仍未结算:把在跑的任务标成「状态未知」并重渲染一次。 */
|
|
123
|
+
async markJobsUnknown(runId, snapshot) {
|
|
124
|
+
const next = markBackgroundJobsUnknown(snapshot.state);
|
|
125
|
+
if (next === snapshot.state)
|
|
126
|
+
return;
|
|
127
|
+
snapshot.state = next;
|
|
128
|
+
const messageId = snapshot.messageId;
|
|
129
|
+
if (!messageId)
|
|
130
|
+
return;
|
|
131
|
+
await this.enqueueJobCardPatch(runId, () => this.deps.patchCard(messageId, renderRunCard(snapshot.state, snapshot.options)));
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* 一张终态卡的 PATCH 串行链。
|
|
135
|
+
*
|
|
136
|
+
* 渲染放在链内执行(`task` 里读 `snapshot.state`),后入链的任务必然看到更新
|
|
137
|
+
* 后的状态;否则「停止」与「订阅帧」并发时卡片可能回退。
|
|
138
|
+
*/
|
|
139
|
+
enqueueJobCardPatch(runId, task) {
|
|
140
|
+
const previous = this.jobCardPatches.get(runId) ?? Promise.resolve();
|
|
141
|
+
const next = previous.then(task, task);
|
|
142
|
+
this.jobCardPatches.set(runId, next.then(() => undefined, () => undefined));
|
|
143
|
+
return next;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=job-watch.js.map
|
|
@@ -11,7 +11,7 @@ export interface AgentBinding {
|
|
|
11
11
|
* 会话代际快照(与 sessionId 同刻捕获)。随 binding 带到执行时刻:若执行前
|
|
12
12
|
* session 指针被移动(/new、/cd、/resume、/config 切换),该 run 的 init /
|
|
13
13
|
* turn_started 写回判 stale 跳过,避免「先发消息 → 后点新会话」时旧 sessionId
|
|
14
|
-
*
|
|
14
|
+
* 被写回复活。缺省时回退到执行起点捕获,保持旧行为。
|
|
15
15
|
*/
|
|
16
16
|
sessionEpoch?: number;
|
|
17
17
|
}
|
|
@@ -161,7 +161,7 @@ export declare class QueueManager {
|
|
|
161
161
|
* interrupt credit to exactly the interrupted task's slot) and the display
|
|
162
162
|
* info the queue card needs to name what a waiting message waits for.
|
|
163
163
|
*
|
|
164
|
-
*
|
|
164
|
+
* 一次 Compact 占着 lane,新消息的排队卡曾写「位置: 第 1
|
|
165
165
|
* 位 / 前面还有: 0 条消息」——开卡判据看 lane(含正在执行者),位置文案只看
|
|
166
166
|
* 等待队列,两个口径的差集正是这条记录。
|
|
167
167
|
*/
|
|
@@ -276,7 +276,7 @@ export declare class QueueManager {
|
|
|
276
276
|
/**
|
|
277
277
|
* 排队卡头部。只有前面确实还有等待中的消息时才说「排队」;前面为空时
|
|
278
278
|
* 用户等的是当前正在执行的任务(例如 Compact),用「等待当前任务结束」
|
|
279
|
-
* 表达才不会与「前面还有 0
|
|
279
|
+
* 表达才不会与「前面还有 0 条」自相矛盾。
|
|
280
280
|
*/
|
|
281
281
|
private queueCardHeader;
|
|
282
282
|
/** Send a queue status card showing current queue position and actions. */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getLogger } from '../logger/index.js';
|
|
2
|
-
import { cardWithHeader } from '../card/card-shared.js';
|
|
2
|
+
import { cardButton, cardWithHeader } from '../card/card-shared.js';
|
|
3
3
|
import { displayName } from '../platform/path.js';
|
|
4
4
|
/**
|
|
5
5
|
* Per-workspace cap on the number of tasks WAITING to execute.
|
|
@@ -71,7 +71,7 @@ export class QueueManager {
|
|
|
71
71
|
* interrupt credit to exactly the interrupted task's slot) and the display
|
|
72
72
|
* info the queue card needs to name what a waiting message waits for.
|
|
73
73
|
*
|
|
74
|
-
*
|
|
74
|
+
* 一次 Compact 占着 lane,新消息的排队卡曾写「位置: 第 1
|
|
75
75
|
* 位 / 前面还有: 0 条消息」——开卡判据看 lane(含正在执行者),位置文案只看
|
|
76
76
|
* 等待队列,两个口径的差集正是这条记录。
|
|
77
77
|
*/
|
|
@@ -227,8 +227,8 @@ export class QueueManager {
|
|
|
227
227
|
}
|
|
228
228
|
// 身份不变量 tripwire:同一 cwd 内 queue key 必须唯一(一次入队动作一个
|
|
229
229
|
// key,铸造点 router.mintQueueTaskKey)。撞 key 时数组(追加)与 taskIndex
|
|
230
|
-
//
|
|
231
|
-
//
|
|
230
|
+
// (覆盖)必然漂移,位置显示/撤销/立即执行/卡片更新会串到别的条目上。
|
|
231
|
+
// 这里不改行为,只留证据。
|
|
232
232
|
if (this.indexGet(cwd, queuedTask.messageId)) {
|
|
233
233
|
getLogger().warn(`[queue-manager] duplicate queue key cwd=${cwd} messageId=${queuedTask.messageId} — ` +
|
|
234
234
|
'queue identity must be minted per enqueue action (see router.mintQueueTaskKey)');
|
|
@@ -304,8 +304,7 @@ export class QueueManager {
|
|
|
304
304
|
// so pruning the oldest entries is safe.
|
|
305
305
|
if (this.beganMessageIds.size >= 10_000) {
|
|
306
306
|
const oldest = this.beganMessageIds.values().next().value;
|
|
307
|
-
|
|
308
|
-
this.beganMessageIds.delete(oldest);
|
|
307
|
+
this.beganMessageIds.delete(oldest);
|
|
309
308
|
}
|
|
310
309
|
this.beganMessageIds.add(messageId);
|
|
311
310
|
}
|
|
@@ -453,7 +452,7 @@ export class QueueManager {
|
|
|
453
452
|
/**
|
|
454
453
|
* 排队卡头部。只有前面确实还有等待中的消息时才说「排队」;前面为空时
|
|
455
454
|
* 用户等的是当前正在执行的任务(例如 Compact),用「等待当前任务结束」
|
|
456
|
-
* 表达才不会与「前面还有 0
|
|
455
|
+
* 表达才不会与「前面还有 0 条」自相矛盾。
|
|
457
456
|
*/
|
|
458
457
|
queueCardHeader(tasksAhead) {
|
|
459
458
|
return {
|
|
@@ -537,7 +536,7 @@ export class QueueManager {
|
|
|
537
536
|
if (occupant) {
|
|
538
537
|
// 只有可能挡住队列、需要用户归因的占用者才自报身份。「正在执行: 💬 消息」
|
|
539
538
|
// 对普通消息占用者没有信息量——用户刚发的就是消息,「💡 消息将按顺序执行…」
|
|
540
|
-
//
|
|
539
|
+
// 也只是复述排队本身,一并省去。压缩额外说明何时轮到用户。
|
|
541
540
|
if (occupant.kind !== 'message') {
|
|
542
541
|
elements.push({
|
|
543
542
|
tag: 'div',
|
|
@@ -572,13 +571,7 @@ export class QueueManager {
|
|
|
572
571
|
// Edit button: a pending (queued) task is editable by default. The
|
|
573
572
|
// executing/cancelled states render via dedicated card builders that
|
|
574
573
|
// hard-disable all buttons, so this builder only serves pending cards.
|
|
575
|
-
elements.push({
|
|
576
|
-
tag: 'button',
|
|
577
|
-
text: { tag: 'plain_text', content: '✏️ 编辑' },
|
|
578
|
-
type: 'default',
|
|
579
|
-
size: 'small',
|
|
580
|
-
behaviors: [{ type: 'callback', value: { cmd: 'queue.edit', cwd, messageId } }],
|
|
581
|
-
});
|
|
574
|
+
elements.push(cardButton('✏️ 编辑', { cmd: 'queue.edit', cwd, messageId }, { type: 'default', size: 'small' }));
|
|
582
575
|
}
|
|
583
576
|
elements.push({ tag: 'hr' });
|
|
584
577
|
}
|
|
@@ -604,20 +597,8 @@ export class QueueManager {
|
|
|
604
597
|
*/
|
|
605
598
|
buildQueueActionButtons(cwd, messageId, disabled, opts) {
|
|
606
599
|
return [
|
|
607
|
-
{
|
|
608
|
-
|
|
609
|
-
text: { tag: 'plain_text', content: '❌ 撤销' },
|
|
610
|
-
type: 'danger',
|
|
611
|
-
disabled,
|
|
612
|
-
behaviors: [{ type: 'callback', value: { cmd: 'queue.cancel', cwd, messageId } }],
|
|
613
|
-
},
|
|
614
|
-
{
|
|
615
|
-
tag: 'button',
|
|
616
|
-
text: { tag: 'plain_text', content: opts?.immediateLabel ?? '⚡ 立即执行' },
|
|
617
|
-
type: 'primary',
|
|
618
|
-
disabled: disabled || opts?.immediateLabel !== undefined,
|
|
619
|
-
behaviors: [{ type: 'callback', value: { cmd: 'queue.immediate', cwd, messageId } }],
|
|
620
|
-
},
|
|
600
|
+
cardButton('❌ 撤销', { cmd: 'queue.cancel', cwd, messageId }, { type: 'danger', disabled }),
|
|
601
|
+
cardButton(opts?.immediateLabel ?? '⚡ 立即执行', { cmd: 'queue.immediate', cwd, messageId }, { type: 'primary', disabled: disabled || opts?.immediateLabel !== undefined }),
|
|
621
602
|
];
|
|
622
603
|
}
|
|
623
604
|
/**
|
|
@@ -10,7 +10,7 @@ import { type RunTerminal } from './run-state.js';
|
|
|
10
10
|
* Render the approval area for a run card.
|
|
11
11
|
* Returns an array of CardKit 2.0 elements to append to the card body.
|
|
12
12
|
*/
|
|
13
|
-
export declare function renderApprovalArea(approval: ApprovalView
|
|
13
|
+
export declare function renderApprovalArea(approval: ApprovalView, opts?: {
|
|
14
14
|
expired?: boolean;
|
|
15
15
|
runId?: string;
|
|
16
16
|
terminal?: RunTerminal;
|
|
@@ -24,7 +24,7 @@ export declare function renderApprovalArea(approval: ApprovalView | undefined, o
|
|
|
24
24
|
* 层一起超限,超限卡被飞书整卡拒收(11310)→ 审批不可见。兜底层换用本入口后
|
|
25
25
|
* 结构性保证 ≤ 几个元素 + ≤ 1KB 文本,审批入口(红线)在任何降级档都活着。
|
|
26
26
|
*/
|
|
27
|
-
export declare function renderApprovalAreaCompact(approval: ApprovalView
|
|
27
|
+
export declare function renderApprovalAreaCompact(approval: ApprovalView, opts?: {
|
|
28
28
|
expired?: boolean;
|
|
29
29
|
runId?: string;
|
|
30
30
|
terminal?: RunTerminal;
|