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
@@ -7,9 +7,9 @@ import type { AppConfig } from '../config/index.js';
7
7
  * - SDK 的 cardAction dedup eventId = `card:{messageId}:{operator.openId}:{actionId}`
8
8
  * - actionId = `tag|name|option|JSON.stringify(value)`,不含时间戳/事件序号
9
9
  * - config 卡片原地更新(updateCardInPlace),用户在同一张卡上重复触发
10
- * 固定 value 的按钮(如 config.toggle):
10
+ * 固定 value 的按钮(如 config.save):
11
11
  * messageId / operator / value 三段都相同 → eventId 完全相同 → 第二次点击被
12
- * seenCache drop,toggle 不可逆(第二次点击静默失效)。
12
+ * seenCache drop,按钮不可逆(第二次点击静默失效)。
13
13
  *
14
14
  * SDK 默认 12h 太长;60s 仍会误伤连击。300ms 挡飞书瞬时重投递(<100ms 级),
15
15
  * 放过用户连击(慢点两次通常 >500ms)。代价:削弱 message 秒级重投递防护——
@@ -166,8 +166,6 @@ export declare class FeishuConnector {
166
166
  * `rawClient` 缺失(测试 mock)时回退 SDK 入口,行为退化为「看不见业务码」。
167
167
  */
168
168
  updateCard(messageId: string, card: object): Promise<void>;
169
- /** Format error for logging without causing circular serialization */
170
- private formatError;
171
169
  addReaction(messageId: string, emoji: string): Promise<void>;
172
170
  /**
173
171
  * Remove a reaction by emoji (e.g. retract the Typing indicator).
@@ -33,9 +33,9 @@ const noKeepAliveAgent = new https.Agent({ keepAlive: false });
33
33
  * - SDK 的 cardAction dedup eventId = `card:{messageId}:{operator.openId}:{actionId}`
34
34
  * - actionId = `tag|name|option|JSON.stringify(value)`,不含时间戳/事件序号
35
35
  * - config 卡片原地更新(updateCardInPlace),用户在同一张卡上重复触发
36
- * 固定 value 的按钮(如 config.toggle):
36
+ * 固定 value 的按钮(如 config.save):
37
37
  * messageId / operator / value 三段都相同 → eventId 完全相同 → 第二次点击被
38
- * seenCache drop,toggle 不可逆(第二次点击静默失效)。
38
+ * seenCache drop,按钮不可逆(第二次点击静默失效)。
39
39
  *
40
40
  * SDK 默认 12h 太长;60s 仍会误伤连击。300ms 挡飞书瞬时重投递(<100ms 级),
41
41
  * 放过用户连击(慢点两次通常 >500ms)。代价:削弱 message 秒级重投递防护——
@@ -520,7 +520,7 @@ export class FeishuConnector {
520
520
  catch (err) {
521
521
  // 抛出去前先落一条格式化日志(调用方只看到包装后的 message)。
522
522
  // 抛普通 Error 而不是原 err:axios 错误对象跨层序列化会丢信息。
523
- const errorInfo = this.formatError(err);
523
+ const errorInfo = formatErrorForLog(err);
524
524
  getLogger().error('[feishu] streamCard failed:', errorInfo);
525
525
  throw new Error(`streamCard failed: ${errorInfo}`, { cause: err });
526
526
  }
@@ -554,7 +554,7 @@ export class FeishuConnector {
554
554
  catch (err) {
555
555
  // Log the error but don't swallow it - a plain error avoids axios
556
556
  // serialization issues in the logger.
557
- const errorInfo = this.formatError(err);
557
+ const errorInfo = formatErrorForLog(err);
558
558
  getLogger().error('[feishu] updateCard failed:', errorInfo);
559
559
  throw new Error(`updateCard failed: ${errorInfo}`, { cause: err });
560
560
  }
@@ -562,16 +562,12 @@ export class FeishuConnector {
562
562
  throw new Error(`updateCard failed: Feishu rejected the card (code=${rejection.code} msg=${rejection.msg ?? ''})`, { cause: rejection });
563
563
  }
564
564
  }
565
- /** Format error for logging without causing circular serialization */
566
- formatError(err) {
567
- return formatErrorForLog(err);
568
- }
569
565
  async addReaction(messageId, emoji) {
570
566
  try {
571
567
  await this.channel.addReaction(messageId, emoji);
572
568
  }
573
569
  catch (err) {
574
- getLogger().error('[feishu] addReaction failed:', this.formatError(err));
570
+ getLogger().error('[feishu] addReaction failed:', formatErrorForLog(err));
575
571
  }
576
572
  }
577
573
  /**
@@ -583,7 +579,7 @@ export class FeishuConnector {
583
579
  await this.channel.removeReactionByEmoji(messageId, emoji);
584
580
  }
585
581
  catch (err) {
586
- getLogger().error('[feishu] removeReactionByEmoji failed:', this.formatError(err));
582
+ getLogger().error('[feishu] removeReactionByEmoji failed:', formatErrorForLog(err));
587
583
  }
588
584
  }
589
585
  /**
@@ -635,7 +631,7 @@ export class FeishuConnector {
635
631
  }
636
632
  }
637
633
  catch (err) {
638
- const errorInfo = this.formatError(err);
634
+ const errorInfo = formatErrorForLog(err);
639
635
  getLogger().error(`[feishu] ${label} failed:`, errorInfo);
640
636
  throw new Error(`${label} failed: ${errorInfo}`, { cause: err });
641
637
  }
@@ -10,10 +10,10 @@
10
10
  */
11
11
  import { createHash, createHmac } from 'node:crypto';
12
12
  import fs from 'node:fs';
13
- import os from 'node:os';
14
13
  import path from 'node:path';
15
14
  import YAML from 'yaml';
16
- import { isWin32 } from '../../platform/select.js';
15
+ import { isWin32 } from '../platform/select.js';
16
+ import { resolveDshHome } from './home.js';
17
17
  /** Credential record that owns the browser-cookie signing secret. */
18
18
  export const DSH_BROWSER_CREDENTIAL_KEY = 'client-connection/browser-session';
19
19
  /** Short lifetime keeps every request safely inside DSH's configurable max age. */
@@ -29,8 +29,7 @@ function isRecord(value) {
29
29
  * file matches the `DSH_HOME` lark-remote passes to a process it starts.
30
30
  */
31
31
  export function resolveDshCredentialsFile(env = process.env, configuredHome) {
32
- const home = configuredHome?.trim() || env.DSH_HOME?.trim();
33
- return path.join(home && home.length > 0 ? home : path.join(os.homedir(), '.dsh'), '.credentials.yaml');
32
+ return path.join(resolveDshHome(configuredHome, env), '.credentials.yaml');
34
33
  }
35
34
  /** Whether a filesystem error means the credentials file is absent. */
36
35
  export function isDshCredentialsNotFound(error) {
@@ -0,0 +1,2 @@
1
+ /** Resolve the same DSH home DSH itself uses: configured, env, then ~/.dsh. */
2
+ export declare function resolveDshHome(configured?: string, env?: NodeJS.ProcessEnv): string;
@@ -0,0 +1,8 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ /** Resolve the same DSH home DSH itself uses: configured, env, then ~/.dsh. */
4
+ export function resolveDshHome(configured, env = process.env) {
5
+ const value = configured?.trim() || env.DSH_HOME?.trim();
6
+ return path.resolve(value && value.length > 0 ? value : path.join(os.homedir(), '.dsh'));
7
+ }
8
+ //# sourceMappingURL=home.js.map
@@ -0,0 +1,9 @@
1
+ /**
2
+ * DSH 远程调用的线格式助手(中立层,runner 与 session 共用)。
3
+ *
4
+ * 这两个函数原先住在 `runner/dsh/client.ts`,于是 session/dsh 为了拼一个
5
+ * `args` 信封要 import 上层 runner —— 与 AgentSessionReader 同一类反向依赖。
6
+ */
7
+ /** Extract the `token` query parameter from a pasted `dsh web` URL. */
8
+ export declare function extractDshToken(raw: string | undefined): string;
9
+ export declare function dshArgs(method: string, payload: unknown): Record<string, unknown>;
@@ -0,0 +1,61 @@
1
+ /**
2
+ * DSH 远程调用的线格式助手(中立层,runner 与 session 共用)。
3
+ *
4
+ * 这两个函数原先住在 `runner/dsh/client.ts`,于是 session/dsh 为了拼一个
5
+ * `args` 信封要 import 上层 runner —— 与 AgentSessionReader 同一类反向依赖。
6
+ */
7
+ /** Extract the `token` query parameter from a pasted `dsh web` URL. */
8
+ export function extractDshToken(raw) {
9
+ const value = (raw ?? '').trim();
10
+ if (!value)
11
+ return '';
12
+ if (!value.includes('token=') && !value.includes('://'))
13
+ return value;
14
+ try {
15
+ const url = new URL(value.startsWith('?') ? `http://dsh.invalid/${value}` : value);
16
+ const token = url.searchParams.get('token');
17
+ if (token)
18
+ return token;
19
+ // 带 scheme 却没有 token 参数的输入是误贴的 host URL(如
20
+ // `http://127.0.0.1:3080`):整串不是合法 token,参与握手只会得到
21
+ // 指向性缺失的 401。返回空串让上游走「token 缺失」的诊断路径。
22
+ if (value.includes('://'))
23
+ return '';
24
+ return value;
25
+ }
26
+ catch {
27
+ return value;
28
+ }
29
+ }
30
+ /**
31
+ * Remote methods take named parameters. Most session methods call their single
32
+ * argument `request`; `session/list` reserves `_request`; catalog methods take
33
+ * no arguments. `commands/*` address the receiving agent by its wire field
34
+ * `agentId`, so their payload is already in wire shape (pass-through).
35
+ * The gateway rejects any other `args` shape.
36
+ */
37
+ const DSH_ARGS_KEY = {
38
+ 'session/list': '_request',
39
+ 'session/create': 'request',
40
+ 'session/prompt': 'request',
41
+ 'session/cancel': 'request',
42
+ 'session/selectModel': 'request',
43
+ 'session/projections': 'request',
44
+ 'session/page': 'request',
45
+ 'session/follow': 'request',
46
+ 'session/updateQueue': 'request',
47
+ 'job/list': 'request',
48
+ 'job/kill': 'request',
49
+ 'session/modelCatalog': null,
50
+ 'agentPresets/list': null,
51
+ 'permissionPresets/catalog': null,
52
+ };
53
+ export function dshArgs(method, payload) {
54
+ const key = DSH_ARGS_KEY[method];
55
+ if (key === null)
56
+ return {};
57
+ if (key === undefined)
58
+ return payload;
59
+ return { [key]: payload };
60
+ }
61
+ //# sourceMappingURL=protocol.js.map
@@ -227,6 +227,12 @@ export class InboundTurnAssembler {
227
227
  }
228
228
  catch (err) {
229
229
  getLogger().error('[inbound] turn commit failed:', err?.message ?? String(err));
230
+ try {
231
+ await this.deps.onReceipt?.(ctx, '⚠️ 消息处理失败,请重试;若持续失败请查看 lark-remote 日志。');
232
+ }
233
+ catch (receiptErr) {
234
+ getLogger().error('[inbound] failed to report turn commit failure:', receiptErr?.message ?? String(receiptErr));
235
+ }
230
236
  }
231
237
  }
232
238
  }