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.
- package/CHANGELOG.md +28 -2
- package/README.en.md +1 -14
- package/README.md +1 -14
- package/dist/agent-kinds.d.ts +27 -0
- package/dist/agent-kinds.js +38 -0
- package/dist/bridge/approval-actions.d.ts +95 -0
- package/dist/bridge/approval-actions.js +104 -0
- package/dist/bridge/approval-coordinator.d.ts +1 -0
- package/dist/bridge/approval-coordinator.js +12 -24
- package/dist/bridge/final-usage.d.ts +8 -17
- package/dist/bridge/final-usage.js +1 -18
- package/dist/bridge/index.d.ts +52 -38
- package/dist/bridge/index.js +255 -433
- package/dist/bridge/queue-manager.d.ts +25 -1
- package/dist/bridge/queue-manager.js +179 -160
- package/dist/bridge/run-approval.d.ts +16 -0
- package/dist/bridge/run-approval.js +41 -0
- package/dist/bridge/run-usage.d.ts +32 -0
- package/dist/bridge/run-usage.js +87 -0
- package/dist/bridge/session-writeback.d.ts +19 -0
- package/dist/bridge/session-writeback.js +36 -0
- package/dist/card/approval-render.d.ts +3 -2
- package/dist/card/approval-render.js +3 -2
- package/dist/card/bash-card-session.js +2 -5
- package/dist/{router → card}/card-helpers.d.ts +7 -7
- package/dist/{router → card}/card-helpers.js +8 -8
- package/dist/card/card-session.d.ts +6 -2
- package/dist/card/card-session.js +28 -28
- package/dist/card/card-shared.d.ts +4 -4
- package/dist/card/card-shared.js +4 -10
- package/dist/card/collapsible.js +3 -2
- package/dist/card/final-answer-overflow.d.ts +1 -0
- package/dist/card/final-answer-overflow.js +46 -0
- package/dist/card/run-card-session.d.ts +2 -2
- package/dist/card/run-card-session.js +4 -9
- package/dist/card/run-renderer.d.ts +14 -0
- package/dist/card/run-renderer.js +126 -23
- package/dist/card/run-state.d.ts +40 -51
- package/dist/card/run-state.js +96 -34
- package/dist/card/usage-format.d.ts +30 -0
- package/dist/{router → card}/usage-format.js +3 -10
- package/dist/clone.js +6 -1
- package/dist/config/codex-config.js +4 -4
- package/dist/config/index.d.ts +18 -20
- package/dist/config/index.js +6 -20
- package/dist/config/pi-config.js +6 -4
- package/dist/connector/index.d.ts +2 -4
- package/dist/connector/index.js +7 -11
- package/dist/{runner/dsh → dsh}/auth.js +3 -4
- package/dist/dsh/home.d.ts +2 -0
- package/dist/dsh/home.js +8 -0
- package/dist/dsh/protocol.d.ts +9 -0
- package/dist/dsh/protocol.js +61 -0
- package/dist/inbound/turn-assembler.js +6 -0
- package/dist/index.js +25 -414
- package/dist/message-handlers.d.ts +26 -0
- package/dist/message-handlers.js +275 -0
- package/dist/model-catalog.d.ts +14 -0
- package/dist/model-catalog.js +25 -0
- package/dist/platform/path.d.ts +9 -0
- package/dist/platform/path.js +18 -0
- package/dist/router/active-run-usage.d.ts +4 -0
- package/dist/router/active-run-usage.js +12 -0
- package/dist/router/card-action-payload.d.ts +1 -1
- package/dist/router/card-action-payload.js +1 -1
- package/dist/router/commands/ls.d.ts +9 -0
- package/dist/router/commands/ls.js +243 -0
- package/dist/router/commands/order.d.ts +12 -0
- package/dist/router/commands/order.js +178 -0
- package/dist/router/commands/resume.d.ts +48 -0
- package/dist/router/commands/resume.js +246 -0
- package/dist/router/commands/ws.d.ts +15 -0
- package/dist/router/commands/ws.js +189 -0
- package/dist/router/config/claude.js +5 -4
- package/dist/router/config/codex.js +2 -6
- package/dist/router/config/common/render.d.ts +5 -1
- package/dist/router/config/common/render.js +6 -13
- package/dist/router/config/common/turn-idle.d.ts +2 -0
- package/dist/router/config/common/turn-idle.js +9 -0
- package/dist/router/config/dsh.d.ts +1 -1
- package/dist/router/config/index.d.ts +1 -1
- package/dist/router/config/kimi.js +2 -6
- package/dist/router/config/opencode.js +2 -6
- package/dist/router/config/types.d.ts +11 -3
- package/dist/router/index.d.ts +55 -33
- package/dist/router/index.js +233 -1376
- package/dist/router/paging.d.ts +13 -0
- package/dist/router/paging.js +20 -0
- package/dist/router/path-validation.d.ts +27 -0
- package/dist/router/path-validation.js +45 -0
- package/dist/runner/agent-choices-common.d.ts +1 -1
- package/dist/runner/claude/runner.d.ts +23 -6
- package/dist/runner/claude/runner.js +6 -20
- package/dist/runner/claude/session.js +1 -1
- package/dist/runner/codex/app-server/runner.d.ts +3 -1
- package/dist/runner/codex/app-server/translator.d.ts +13 -0
- package/dist/runner/codex/app-server/translator.js +114 -151
- package/dist/runner/common/acp/base-acp-runner.d.ts +3 -1
- package/dist/runner/common/acp/base-translator.d.ts +3 -8
- package/dist/runner/common/acp/base-translator.js +16 -7
- package/dist/runner/common/connection-based-runner.d.ts +3 -1
- package/dist/runner/common/jsonrpc/transport.js +17 -7
- package/dist/runner/common/spawning-runner.js +10 -4
- package/dist/runner/common/turn-started.d.ts +2 -0
- package/dist/runner/common/turn-started.js +10 -0
- package/dist/runner/dsh/client.d.ts +2 -10
- package/dist/runner/dsh/client.js +13 -220
- package/dist/runner/dsh/daemon.d.ts +0 -2
- package/dist/runner/dsh/daemon.js +9 -7
- package/dist/runner/dsh/errors.d.ts +5 -0
- package/dist/runner/dsh/errors.js +11 -0
- package/dist/runner/dsh/exit-cancel.d.ts +0 -2
- package/dist/runner/dsh/exit-cancel.js +2 -2
- package/dist/runner/dsh/inflight.d.ts +0 -2
- package/dist/runner/dsh/inflight.js +1 -1
- package/dist/runner/dsh/mux-stream.d.ts +26 -0
- package/dist/runner/dsh/mux-stream.js +176 -0
- package/dist/runner/dsh/runner.d.ts +21 -1
- package/dist/runner/dsh/runner.js +76 -73
- package/dist/runner/dsh/translator.d.ts +1 -11
- package/dist/runner/dsh/translator.js +1 -1
- package/dist/runner/index.d.ts +1 -1
- package/dist/runner/kimi/acp/runner.d.ts +22 -1
- package/dist/runner/kimi/acp/runner.js +83 -60
- package/dist/runner/kimi/acp/translator.js +1 -12
- package/dist/runner/opencode/acp/error-monitor.d.ts +11 -0
- package/dist/runner/opencode/acp/error-monitor.js +31 -2
- package/dist/runner/opencode/acp/runner.d.ts +3 -1
- package/dist/runner/opencode/acp/translator.js +1 -12
- package/dist/runner/pi/rpc/runner.d.ts +2 -1
- package/dist/runner/pi/rpc/translator.d.ts +2 -8
- package/dist/runner/pi/rpc/translator.js +2 -7
- package/dist/runner/probe.d.ts +1 -1
- package/dist/runner/probe.js +10 -9
- package/dist/runner/registry.d.ts +2 -20
- package/dist/runner/registry.js +0 -32
- package/dist/runner/types.d.ts +37 -155
- package/dist/runner/types.js +4 -24
- package/dist/session/claude/session-index.d.ts +11 -4
- package/dist/session/claude/session-index.js +34 -10
- package/dist/session/claude/session-reader.d.ts +1 -1
- package/dist/session/claude/sessions.d.ts +2 -2
- package/dist/session/claude/sessions.js +41 -26
- package/dist/session/codex/rollout-reader.d.ts +1 -1
- package/dist/session/codex/rollout-reader.js +14 -13
- package/dist/session/codex/sessions.d.ts +1 -1
- package/dist/session/codex/sessions.js +4 -2
- package/dist/session/common/jsonl.js +7 -1
- package/dist/session/common/pagination.d.ts +2 -0
- package/dist/session/common/pagination.js +1 -1
- package/dist/session/common/recency.d.ts +6 -0
- package/dist/session/common/recency.js +7 -5
- package/dist/session/common/two-pass.d.ts +1 -1
- package/dist/session/common/usage-accumulator.d.ts +1 -1
- package/dist/session/dsh/sessions.d.ts +1 -1
- package/dist/session/dsh/sessions.js +37 -12
- package/dist/session/kimi/sessions.d.ts +1 -1
- package/dist/session/kimi/sessions.js +37 -10
- package/dist/session/opencode/sessions.d.ts +1 -1
- package/dist/session/opencode/sessions.js +53 -48
- package/dist/session/pi/sessions.d.ts +1 -1
- package/dist/session/pi/sessions.js +23 -9
- package/dist/session/registry.d.ts +2 -1
- package/dist/session/session-store.d.ts +1 -2
- package/dist/session/session-store.js +14 -7
- package/dist/session-contract.d.ts +178 -0
- package/dist/session-contract.js +9 -0
- package/package.json +1 -1
- package/dist/router/usage-format.d.ts +0 -60
- /package/dist/{runner/dsh → dsh}/auth.d.ts +0 -0
- /package/dist/{runner/dsh → dsh}/types.d.ts +0 -0
- /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.
|
|
10
|
+
* 固定 value 的按钮(如 config.save):
|
|
11
11
|
* messageId / operator / value 三段都相同 → eventId 完全相同 → 第二次点击被
|
|
12
|
-
* seenCache drop
|
|
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).
|
package/dist/connector/index.js
CHANGED
|
@@ -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.
|
|
36
|
+
* 固定 value 的按钮(如 config.save):
|
|
37
37
|
* messageId / operator / value 三段都相同 → eventId 完全相同 → 第二次点击被
|
|
38
|
-
* seenCache drop
|
|
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 =
|
|
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 =
|
|
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:',
|
|
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:',
|
|
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 =
|
|
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 '
|
|
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
|
-
|
|
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) {
|
package/dist/dsh/home.js
ADDED
|
@@ -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
|
}
|