lark-remote 0.1.12 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.en.md +2 -6
  3. package/README.md +3 -7
  4. package/dist/bridge/final-usage.d.ts +24 -0
  5. package/dist/bridge/final-usage.js +55 -0
  6. package/dist/bridge/inbound-media.d.ts +0 -3
  7. package/dist/bridge/inbound-media.js +0 -1
  8. package/dist/bridge/index.d.ts +7 -7
  9. package/dist/bridge/index.js +100 -133
  10. package/dist/bridge/queue-manager.js +4 -3
  11. package/dist/card/approval-render.js +39 -94
  12. package/dist/card/bash-renderer.js +12 -21
  13. package/dist/card/card-shared.d.ts +14 -5
  14. package/dist/card/card-shared.js +23 -34
  15. package/dist/card/run-renderer.d.ts +0 -22
  16. package/dist/card/run-renderer.js +206 -153
  17. package/dist/card/run-state.d.ts +29 -1
  18. package/dist/card/run-state.js +172 -84
  19. package/dist/card/text-truncate.d.ts +0 -9
  20. package/dist/card/text-truncate.js +0 -9
  21. package/dist/card/tool-render.d.ts +4 -1
  22. package/dist/card/tool-render.js +76 -32
  23. package/dist/cli.js +2 -2
  24. package/dist/common/fs.d.ts +14 -0
  25. package/dist/common/fs.js +57 -3
  26. package/dist/common/truncate.d.ts +0 -6
  27. package/dist/common/truncate.js +1 -1
  28. package/dist/common/ttl-cache.d.ts +24 -0
  29. package/dist/common/ttl-cache.js +53 -0
  30. package/dist/config/codex-config.js +14 -11
  31. package/dist/config/index.d.ts +0 -8
  32. package/dist/config/index.js +0 -16
  33. package/dist/config/kimi-config.d.ts +1 -1
  34. package/dist/config/kimi-config.js +2 -1
  35. package/dist/config/opencode-config.d.ts +1 -1
  36. package/dist/config/opencode-config.js +16 -10
  37. package/dist/config/qr.d.ts +36 -0
  38. package/dist/config/qr.js +124 -0
  39. package/dist/config/wizard.js +69 -27
  40. package/dist/connector/index.d.ts +3 -2
  41. package/dist/connector/index.js +5 -3
  42. package/dist/index.js +14 -41
  43. package/dist/instance-lock.js +7 -0
  44. package/dist/persistence/atomic-write.d.ts +2 -0
  45. package/dist/persistence/atomic-write.js +20 -5
  46. package/dist/persistence/load-json-file.d.ts +1 -2
  47. package/dist/persistence/load-json-file.js +2 -3
  48. package/dist/platform/agent-stopper.d.ts +22 -0
  49. package/dist/platform/agent-stopper.js +19 -0
  50. package/dist/platform/command.d.ts +11 -0
  51. package/dist/platform/command.js +107 -0
  52. package/dist/platform/identity.d.ts +33 -0
  53. package/dist/platform/identity.js +187 -0
  54. package/dist/platform/path.d.ts +24 -0
  55. package/dist/platform/path.js +110 -0
  56. package/dist/platform/select.d.ts +9 -0
  57. package/dist/platform/select.js +12 -0
  58. package/dist/platform/shell.d.ts +51 -0
  59. package/dist/platform/shell.js +75 -0
  60. package/dist/platform/spawn.d.ts +41 -0
  61. package/dist/platform/spawn.js +77 -0
  62. package/dist/platform/terminator-posix.d.ts +38 -0
  63. package/dist/platform/terminator-posix.js +103 -0
  64. package/dist/platform/terminator-win32.d.ts +21 -0
  65. package/dist/platform/terminator-win32.js +110 -0
  66. package/dist/platform/terminator.d.ts +44 -0
  67. package/dist/platform/terminator.js +24 -0
  68. package/dist/platform/types.d.ts +23 -0
  69. package/dist/platform/types.js +5 -0
  70. package/dist/restart.js +4 -2
  71. package/dist/router/card-helpers.d.ts +33 -6
  72. package/dist/router/card-helpers.js +67 -11
  73. package/dist/router/config/common/render.d.ts +1 -1
  74. package/dist/router/config/common/render.js +1 -1
  75. package/dist/router/config-diff.d.ts +4 -0
  76. package/dist/router/config-diff.js +70 -0
  77. package/dist/router/index.d.ts +73 -6
  78. package/dist/router/index.js +663 -590
  79. package/dist/router/utils.d.ts +6 -0
  80. package/dist/router/utils.js +12 -0
  81. package/dist/runner/bash/runner.d.ts +9 -2
  82. package/dist/runner/bash/runner.js +45 -20
  83. package/dist/runner/claude/session.d.ts +4 -4
  84. package/dist/runner/claude/session.js +18 -9
  85. package/dist/runner/codex/app-server/protocol-types.d.ts +35 -1
  86. package/dist/runner/codex/app-server/runner.d.ts +1 -16
  87. package/dist/runner/codex/app-server/runner.js +2 -2
  88. package/dist/runner/codex/app-server/translator.d.ts +18 -0
  89. package/dist/runner/codex/app-server/translator.js +146 -0
  90. package/dist/runner/common/acp/base-acp-runner.d.ts +116 -0
  91. package/dist/runner/common/acp/base-acp-runner.js +248 -0
  92. package/dist/runner/common/acp/base-translator.d.ts +141 -0
  93. package/dist/runner/common/acp/base-translator.js +271 -0
  94. package/dist/runner/common/acp/protocol-helpers.d.ts +70 -0
  95. package/dist/runner/common/acp/protocol-helpers.js +82 -0
  96. package/dist/runner/common/connection-based-runner.d.ts +0 -2
  97. package/dist/runner/common/connection-based-runner.js +1 -1
  98. package/dist/runner/common/jsonrpc/transport.d.ts +2 -0
  99. package/dist/runner/common/jsonrpc/transport.js +25 -5
  100. package/dist/runner/common/process-stopper.d.ts +4 -26
  101. package/dist/runner/common/process-stopper.js +4 -76
  102. package/dist/runner/common/runner-utils.d.ts +0 -5
  103. package/dist/runner/common/runner-utils.js +0 -7
  104. package/dist/runner/common/spawning-runner.d.ts +42 -132
  105. package/dist/runner/common/spawning-runner.js +52 -271
  106. package/dist/runner/common/usage.d.ts +2 -0
  107. package/dist/runner/common/usage.js +2 -0
  108. package/dist/runner/dsh/index.d.ts +0 -2
  109. package/dist/runner/dsh/index.js +0 -2
  110. package/dist/runner/dsh/runner.d.ts +0 -2
  111. package/dist/runner/dsh/runner.js +1 -1
  112. package/dist/runner/index.d.ts +1 -1
  113. package/dist/runner/kimi/acp/runner.d.ts +63 -53
  114. package/dist/runner/kimi/acp/runner.js +189 -334
  115. package/dist/runner/kimi/acp/translator.d.ts +18 -101
  116. package/dist/runner/kimi/acp/translator.js +61 -255
  117. package/dist/runner/opencode/acp/runner.d.ts +22 -46
  118. package/dist/runner/opencode/acp/runner.js +74 -297
  119. package/dist/runner/opencode/acp/translator.d.ts +28 -104
  120. package/dist/runner/opencode/acp/translator.js +54 -249
  121. package/dist/runner/pi/rpc/index.d.ts +0 -2
  122. package/dist/runner/pi/rpc/index.js +0 -2
  123. package/dist/runner/pi/rpc/translator.d.ts +3 -0
  124. package/dist/runner/pi/rpc/translator.js +47 -9
  125. package/dist/runner/probe.d.ts +8 -11
  126. package/dist/runner/probe.js +17 -21
  127. package/dist/runner/registry.d.ts +4 -4
  128. package/dist/runner/registry.js +4 -4
  129. package/dist/runner/resolve-agent-choices.js +6 -2
  130. package/dist/runner/sync-agent-choices.js +1 -1
  131. package/dist/runner/types.d.ts +38 -1
  132. package/dist/session/claude/session-index.js +3 -1
  133. package/dist/session/claude/sessions.js +37 -64
  134. package/dist/session/codex/rollout-reader.d.ts +10 -14
  135. package/dist/session/codex/rollout-reader.js +126 -48
  136. package/dist/session/common/constants.d.ts +7 -0
  137. package/dist/session/common/constants.js +9 -0
  138. package/dist/session/common/pagination.d.ts +0 -2
  139. package/dist/session/common/pagination.js +1 -1
  140. package/dist/session/common/recency.d.ts +7 -0
  141. package/dist/session/common/recency.js +10 -0
  142. package/dist/session/common/two-pass.d.ts +22 -0
  143. package/dist/session/common/two-pass.js +70 -0
  144. package/dist/session/common/usage-accumulator.d.ts +14 -0
  145. package/dist/session/common/usage-accumulator.js +15 -0
  146. package/dist/session/dsh/sessions.js +15 -11
  147. package/dist/session/kimi/sessions.d.ts +24 -4
  148. package/dist/session/kimi/sessions.js +99 -103
  149. package/dist/session/opencode/sessions.d.ts +2 -14
  150. package/dist/session/opencode/sessions.js +35 -15
  151. package/dist/session/pi/sessions.js +64 -95
  152. package/dist/update/index.d.ts +2 -3
  153. package/dist/update/index.js +1 -2
  154. package/dist/update/install.d.ts +2 -1
  155. package/dist/update/install.js +58 -9
  156. package/dist/update/version-check.d.ts +5 -0
  157. package/dist/update/version-check.js +9 -0
  158. package/package.json +9 -7
  159. package/dist/update/startup-hint.d.ts +0 -5
  160. package/dist/update/startup-hint.js +0 -11
@@ -6,15 +6,23 @@
6
6
  * → synthetic init → session/prompt → consume session/update notifications
7
7
  * until prompt settles → result event.
8
8
  *
9
- * Structurally aligned with codex AppServerRunner (design doc §3.1) via the
10
- * shared ConnectionBasedRunner base: same notification queue + waitResolve
11
- * pattern, same forceFinish/stopRequested semantics, same turn idle timeout,
12
- * same ConnectionLostError retry.
9
+ * Turn/connection/compact/approval orchestration lives in BaseAcpRunner.
10
+ * Kimi-specific parts:
11
+ * - compaction is a BACKGROUND task: after the compact prompt settles, poll
12
+ * wire.jsonl for a NEW terminal compaction record (§5.2, never fake success)
13
+ * - terminal/* reverse RPC: kimi delegates Bash execution to the client —
14
+ * this runner spawns one-shot local bash processes (handleTerminalRequest)
15
+ * - terminal-backed Bash tool notifications are filtered (bashToolCallIds) so
16
+ * the run card doesn't get duplicate output-less Bash panels
17
+ * - AskUserQuestion flows through elicitation forms + a request_permission
18
+ * question bridge (buildQuestionResponse)
13
19
  */
14
- import type { AgentKind, AgentSessionReader, AgentEvent, AgentStatusInfo, SpawnOptions } from '../../types.js';
15
- import { JsonRpcClient as KimiAcpClient } from '../../common/jsonrpc/client.js';
16
- import { type AcpTranslatorEvent } from './translator.js';
17
- import { ConnectionBasedRunner } from '../../common/connection-based-runner.js';
20
+ import type { AgentKind, AgentSessionReader, AgentStatusInfo, SpawnOptions } from '../../types.js';
21
+ import { JsonRpcClient } from '../../common/jsonrpc/client.js';
22
+ import { KimiAcpTranslator } from './translator.js';
23
+ import { type SessionPromptResult } from '../../common/acp/protocol-types.js';
24
+ import { type AcpPendingApproval } from '../../common/acp/protocol-helpers.js';
25
+ import { BaseAcpRunner } from '../../common/acp/base-acp-runner.js';
18
26
  export interface KimiAcpRunnerOptions {
19
27
  kind: AgentKind;
20
28
  sessionReader: AgentSessionReader;
@@ -30,22 +38,24 @@ export interface KimiAcpRunnerOptions {
30
38
  idleTtlMs?: number;
31
39
  /** How long to wait for turn output before failing. Defaults to 10 min. */
32
40
  turnIdleTimeoutMs?: number;
33
- /** R2: how long to poll wire.jsonl for the compaction record after the
34
- * /compact prompt settles. Defaults to 30s; WARN (not fail) on timeout. */
35
- compactPollTimeoutMs?: number;
41
+ /** §5.2: compaction 等待的沉默超时——距上次观察到任何新 compaction 记录
42
+ * (begin/terminal)超过该时长仍未终态才放弃(outcome unknown,卡片 error,
43
+ * 不再「超时=成功」)。默认 10 分钟(对齐 turnIdleTimeoutMs)。压缩是完整
44
+ * LLM 请求(引擎带重试),时长无上限,旧的固定 30s 轮询超时已删除。 */
45
+ compactIdleTimeoutMs?: number;
36
46
  model?: string;
37
47
  /** Kimi permission mode (user-facing: manual/auto/yolo). */
38
48
  permissionMode?: 'manual' | 'auto' | 'yolo';
39
49
  }
40
- export declare class KimiAcpRunner extends ConnectionBasedRunner<KimiAcpClient, AcpTranslatorEvent> {
41
- private connectionManager;
42
- private currentTranslator;
43
- private activeSessionId;
44
- private model?;
50
+ export declare class KimiAcpRunner extends BaseAcpRunner<KimiAcpTranslator> {
45
51
  private permissionMode;
46
- private readonly compactPollTimeoutMs;
47
- /** Pending approval requests: requestId → kind + view + options. */
48
- private pendingApprovals;
52
+ private readonly compactIdleTimeoutMs;
53
+ /**
54
+ * §5.2 compaction baseline: wire.jsonl records sampled by compactBaseline()
55
+ * BEFORE the compact prompt fires (reset per compact run). onCompactPromptFired
56
+ * derives both the terminal-count baseline and the total-count probe from it.
57
+ */
58
+ private compactBaselineRecords;
49
59
  /** 存活 terminal(kimi 把 Bash 执行下放客户端):terminalId → 本地句柄。 */
50
60
  private terminals;
51
61
  /** terminalId 自增序号(term-1, term-2, …)。 */
@@ -61,32 +71,29 @@ export declare class KimiAcpRunner extends ConnectionBasedRunner<KimiAcpClient,
61
71
  /** 当前 run 的 session cwd(terminal/create 未给 cwd 时回退用)。 */
62
72
  private activeCwd;
63
73
  private readonly processStopper;
64
- /** Tracker for the in-flight prompt request — needed for cancellation. */
65
- private promptSettled;
66
74
  constructor(opts: KimiAcpRunnerOptions);
67
75
  protected get logTag(): string;
68
76
  protected get turnTimeoutErrorMessage(): string;
69
77
  protected get turnInterruptedErrorMessage(): string;
70
- protected currentSessionId(): string | null;
78
+ protected get connectionClosedMessage(): string;
71
79
  protected shouldDeferStop(): boolean;
72
- protected cancelCurrentTurn(): Promise<void>;
73
- protected clearTurnState(): void;
74
- protected releaseConnection(cwd: string): Promise<void>;
75
- protected notifyIdle(cwd: string): void;
76
- protected disposeConnections(): Promise<void>;
80
+ protected createTranslator(): KimiAcpTranslator;
81
+ protected applyTurnSettings(client: JsonRpcClient, sessionId: string): Promise<void>;
77
82
  /**
78
- * Run a compact operation on the current session.
79
- *
80
- * Design doc §6.1: acquire → session/resume → session/prompt with "/compact"
81
- * text (builtin slash command, host intercepts) → consume notifications until
82
- * prompt settles.
83
+ * §5.2: compaction is a BACKGROUND task — the prompt settles before the
84
+ * wire.jsonl terminal record lands. Baselines are captured BEFORE the
85
+ * compact prompt fires (see compactBaseline override — a begin record
86
+ * landing after the fire must count as new activity, not baseline), then
87
+ * wait for a NEW terminal (complete/apply → completed; cancel → cancelled)
88
+ * before producing the result. There is NO total timeout — silence beyond
89
+ * compactIdleTimeoutMs yields 'unknown' (never a fake success). Keeps the
90
+ * connection alive while the background compaction finishes — otherwise
91
+ * dispose/exit kills it and the record never lands (S5/S6 打回复现 /
92
+ * 2026-08-31 事故).
83
93
  */
84
- runCompact(_message: string, opts: SpawnOptions): AsyncGenerator<AgentEvent>;
85
- /**
86
- * Respond to an approval server request. `response` is the bridge
87
- * ApprovalAction (`{ action: 'accept' | 'decline' | 'cancel' }`).
88
- */
89
- respondApproval(requestId: number | string, response: unknown): Promise<void>;
94
+ protected compactBaseline(sessionId: string, opts: SpawnOptions): number;
95
+ protected onCompactPromptFired(promptPromise: Promise<SessionPromptResult>, translator: KimiAcpTranslator, sessionId: string, opts: SpawnOptions, baselineTotalCount: number): void;
96
+ protected buildApprovalOutcome(action: string, pending: AcpPendingApproval, response: unknown): unknown;
90
97
  getStatusInfo(): AgentStatusInfo;
91
98
  /**
92
99
  * Hot-apply a permission-mode change to the live ACP session (§P5).
@@ -101,22 +108,21 @@ export declare class KimiAcpRunner extends ConnectionBasedRunner<KimiAcpClient,
101
108
  permissionMode?: 'manual' | 'auto' | 'yolo';
102
109
  }): Promise<void>;
103
110
  /**
104
- * Acquire the connection and set up the turn:
105
- * session/new (new session) or session/resume (existing sessionId)
106
- * → set permission mode if needed → session/prompt.
107
- */
108
- protected setupTurn(message: string, opts: SpawnOptions): Promise<void>;
109
- /**
110
- * R2: poll wire.jsonl until a NEW compaction record
111
- * (context.apply_compaction / full_compaction.complete) appears.
111
+ * §5.2: 等 wire.jsonl 出现 NEW 压缩终态记录,返回判别结果而非 void。
112
112
  *
113
- * The /compact prompt settles before the background compaction lands its
114
- * record; returning early would let the caller dispose the connection and
115
- * kill the background job. Timeout is WARN-only (the compact may have been
116
- * a no-op) — never fails the turn. Aborts early on stop/forceFinish.
113
+ * 压缩是完整 LLM 请求(引擎 ≤5 次重试 + overflow 收缩重试),时长无上限;
114
+ * 旧「固定 30s 超时 = 成功」已删除。出口:
115
+ * completed — 观察到 full_compaction.complete / context.apply_compaction;
116
+ * cancelled — 观察到 full_compaction.cancel(API 失败/abort 与用户取消共用,
117
+ * 绝不当成功);
118
+ * stopped — 等待中 stop()/forceFinish(consumeTurn 产 interrupted 兜底);
119
+ * unknown — 距上次观察到任何新 compaction 记录(begin/terminal)超过
120
+ * compactIdleTimeoutMs(沉默超时,压缩可能仍在后台进行)。
121
+ * 观察到新记录即重置沉默时钟,并顺带重置 turn idle 时钟(lastEventAt +
122
+ * wakeWaiters),避免数分钟的压缩被 consumeTurn 滚动空闲看门狗误杀。
117
123
  */
118
- private waitForCompactionRecord;
119
- private handleNotification;
124
+ private waitForCompactionTerminal;
125
+ protected handleNotification(method: string, params: unknown): void;
120
126
  /**
121
127
  * Filter kimi's own Bash tool notifications so the run card doesn't get a
122
128
  * duplicate, output-less Bash panel alongside the runner-produced one.
@@ -128,7 +134,7 @@ export declare class KimiAcpRunner extends ConnectionBasedRunner<KimiAcpClient,
128
134
  * Returns true when the notification should be swallowed.
129
135
  */
130
136
  private filterBashNotifications;
131
- private handleServerRequest;
137
+ protected handleServerRequest(id: number | string, method: string, params: unknown): void;
132
138
  /**
133
139
  * Handle a kimi terminal/* reverse RPC by spawning a one-shot local process.
134
140
  *
@@ -154,4 +160,8 @@ export declare class KimiAcpRunner extends ConnectionBasedRunner<KimiAcpClient,
154
160
  private handleTerminalRelease;
155
161
  /** Kill every live terminal (dispose/connection-close 清理钩子)。 */
156
162
  private cleanupTerminals;
163
+ protected onConnectionAcquired(opts: SpawnOptions): void;
164
+ protected onConnectionClosed(): void;
165
+ protected onClearTurnState(): void;
166
+ protected beforeDisposeConnections(): Promise<void>;
157
167
  }