lark-remote 0.5.20 → 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 +10 -0
- package/dist/bridge/inbound-media.js +71 -45
- package/dist/bridge/index.d.ts +9 -0
- package/dist/bridge/index.js +230 -203
- package/dist/card/approval-render.js +32 -33
- package/dist/card/card-budget.js +123 -98
- package/dist/card/run-renderer.js +82 -68
- package/dist/card/run-state.d.ts +0 -14
- package/dist/card/run-state.js +335 -207
- package/dist/card/tool-render.js +20 -16
- package/dist/card/usage-format.d.ts +12 -9
- package/dist/card/usage-format.js +111 -97
- package/dist/common/text-width.js +36 -24
- package/dist/common/tool-summary.js +132 -90
- package/dist/index.js +226 -190
- package/dist/message-handlers.js +253 -236
- 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 +189 -133
- package/dist/router/commands/ws.js +219 -174
- package/dist/router/index.js +192 -201
- package/dist/runner/bash/runner.js +2 -4
- package/dist/runner/codex/app-server/translator.d.ts +2 -0
- package/dist/runner/codex/app-server/translator.js +287 -221
- package/dist/runner/common/acp/base-translator.js +19 -17
- 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/spawning-runner.d.ts +5 -0
- package/dist/runner/common/spawning-runner.js +8 -3
- 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/client.d.ts +7 -9
- package/dist/runner/dsh/client.js +356 -287
- package/dist/runner/dsh/mux-stream.js +28 -8
- package/dist/runner/dsh/runner.d.ts +4 -3
- package/dist/runner/dsh/runner.js +88 -64
- package/dist/runner/dsh/translator.d.ts +1 -31
- package/dist/runner/dsh/translator.js +180 -178
- package/dist/runner/kimi/acp/runner.js +81 -44
- package/dist/runner/opencode/acp/error-monitor.js +5 -5
- package/dist/runner/pi/rpc/client.js +4 -13
- package/dist/runner/pi/rpc/translator.js +61 -60
- package/dist/session/claude/sessions.js +113 -101
- package/dist/session/codex/rollout-reader.js +179 -180
- package/dist/session/dsh/sessions.js +281 -231
- package/dist/session/kimi/sessions.d.ts +0 -7
- package/dist/session/kimi/sessions.js +129 -109
- package/dist/session/opencode/sessions.d.ts +0 -11
- package/dist/session/opencode/sessions.js +161 -137
- package/dist/session/session-store.d.ts +8 -0
- package/dist/session/session-store.js +98 -98
- package/package.json +1 -1
|
@@ -2,177 +2,202 @@ import { cardButton } from '../../card/card-shared.js';
|
|
|
2
2
|
import { paginationBar } from '../../card/card-helpers.js';
|
|
3
3
|
import { pageSlice } from '../paging.js';
|
|
4
4
|
export const ORDER_PAGE_SIZE = 8;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
{ tag: 'column', width: 'weighted', weight: 1, elements: leftColumn },
|
|
5
|
+
const ORDER_USAGE_TEXT = '用法: /order [list|save <text>|edit <orderId|序号> <新文本>|alias add <orderId|序号> <别名名>|alias rm <orderId|序号>]';
|
|
6
|
+
const ORDER_ALIAS_USAGE_TEXT = '用法: /order alias [add <orderId|序号> <别名名> | rm <orderId|序号> | list]';
|
|
7
|
+
// ── 模块级命名原语(crapper 把函数内部闭包/三元的决策点也算进外层)──────────
|
|
8
|
+
/** 单行指令的 3 个元素(div + column_set + 行间 hr)。 */
|
|
9
|
+
function orderRowElements(order, safeOffset, isLast) {
|
|
10
|
+
const displayText = order.text.length > 100 ? order.text.slice(0, 97) + '...' : order.text;
|
|
11
|
+
const leftColumn = order.alias
|
|
12
|
+
? [
|
|
13
|
+
cardButton(`$${order.alias}`, { cmd: 'order.aliasEdit', orderId: order.id, offset: safeOffset }, { type: 'default', size: 'small' }),
|
|
14
|
+
cardButton('✕', {
|
|
15
|
+
cmd: 'order.aliasRemove',
|
|
16
|
+
orderId: order.id,
|
|
17
|
+
aliasName: order.alias,
|
|
18
|
+
offset: safeOffset,
|
|
19
|
+
}, { type: 'default', size: 'small' }),
|
|
20
|
+
]
|
|
21
|
+
: [
|
|
22
|
+
cardButton('+别名', { cmd: 'order.aliasEdit', orderId: order.id, offset: safeOffset }, { type: 'default', size: 'small' }),
|
|
23
|
+
];
|
|
24
|
+
const row = [
|
|
25
|
+
{
|
|
26
|
+
tag: 'div',
|
|
27
|
+
text: {
|
|
28
|
+
tag: 'lark_md',
|
|
29
|
+
content: order.alias ? `\`$${order.alias}\` ${displayText}` : displayText,
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
tag: 'column_set',
|
|
34
|
+
columns: [
|
|
35
|
+
{ tag: 'column', width: 'weighted', weight: 1, elements: leftColumn },
|
|
36
|
+
{
|
|
37
|
+
tag: 'column',
|
|
38
|
+
width: 'weighted',
|
|
39
|
+
weight: 1,
|
|
40
|
+
vertical_align: 'center',
|
|
41
|
+
elements: [
|
|
43
42
|
{
|
|
44
|
-
tag: '
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
43
|
+
tag: 'column_set',
|
|
44
|
+
columns: [
|
|
45
|
+
{
|
|
46
|
+
tag: 'column',
|
|
47
|
+
width: 'auto',
|
|
48
|
+
elements: [
|
|
49
|
+
cardButton('▶ 执行', { cmd: 'order.exec', orderId: order.id }, { type: 'primary', size: 'small' }),
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
tag: 'column',
|
|
54
|
+
width: 'auto',
|
|
55
|
+
elements: [
|
|
56
|
+
cardButton('编辑', { cmd: 'order.textEdit', orderId: order.id, offset: safeOffset }, { type: 'default', size: 'small' }),
|
|
57
|
+
],
|
|
58
|
+
},
|
|
49
59
|
{
|
|
50
|
-
tag: '
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
width: 'auto',
|
|
55
|
-
elements: [
|
|
56
|
-
cardButton('▶ 执行', { cmd: 'order.exec', orderId: order.id }, { type: 'primary', size: 'small' }),
|
|
57
|
-
],
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
tag: 'column',
|
|
61
|
-
width: 'auto',
|
|
62
|
-
elements: [
|
|
63
|
-
cardButton('编辑', { cmd: 'order.textEdit', orderId: order.id, offset: safeOffset }, { type: 'default', size: 'small' }),
|
|
64
|
-
],
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
tag: 'column',
|
|
68
|
-
width: 'auto',
|
|
69
|
-
elements: [
|
|
70
|
-
cardButton('删除', { cmd: 'order.delete', orderId: order.id, offset: safeOffset }, { type: 'danger', size: 'small' }),
|
|
71
|
-
],
|
|
72
|
-
},
|
|
60
|
+
tag: 'column',
|
|
61
|
+
width: 'auto',
|
|
62
|
+
elements: [
|
|
63
|
+
cardButton('删除', { cmd: 'order.delete', orderId: order.id, offset: safeOffset }, { type: 'danger', size: 'small' }),
|
|
73
64
|
],
|
|
74
65
|
},
|
|
75
66
|
],
|
|
76
67
|
},
|
|
77
68
|
],
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
const target = args[2];
|
|
105
|
-
const name = args[3];
|
|
106
|
-
if (!target || !name) {
|
|
107
|
-
return { text: '用法: /order alias add <orderId|序号> <别名名>' };
|
|
108
|
-
}
|
|
109
|
-
const order = deps.resolveTarget(target);
|
|
110
|
-
if (!order)
|
|
111
|
-
return { text: `指令不存在: ${target}` };
|
|
112
|
-
try {
|
|
113
|
-
deps.setAlias(order.id, name);
|
|
114
|
-
return { text: `✅ 已给指令绑定别名 $${name}` };
|
|
115
|
-
}
|
|
116
|
-
catch (err) {
|
|
117
|
-
return { text: `保存失败: ${err.message}` };
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
if (op === 'rm') {
|
|
121
|
-
const target = args[2];
|
|
122
|
-
if (!target)
|
|
123
|
-
return { text: '用法: /order alias rm <orderId|序号>' };
|
|
124
|
-
const order = deps.resolveTarget(target);
|
|
125
|
-
if (!order)
|
|
126
|
-
return { text: `指令不存在: ${target}` };
|
|
127
|
-
if (!order.alias)
|
|
128
|
-
return { text: '该指令没有别名' };
|
|
129
|
-
const aliasName = order.alias;
|
|
130
|
-
try {
|
|
131
|
-
deps.setAlias(order.id, undefined);
|
|
132
|
-
return { text: `✅ 已移除别名 $${aliasName}` };
|
|
133
|
-
}
|
|
134
|
-
catch (err) {
|
|
135
|
-
return { text: `保存失败: ${err.message}` };
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
if (!op || op === 'list')
|
|
139
|
-
return buildOrderCommand([], ctx, offset, deps);
|
|
140
|
-
return {
|
|
141
|
-
text: '用法: /order alias [add <orderId|序号> <别名名> | rm <orderId|序号> | list]',
|
|
142
|
-
};
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
];
|
|
73
|
+
if (!isLast)
|
|
74
|
+
row.push({ tag: 'hr' });
|
|
75
|
+
return row;
|
|
76
|
+
}
|
|
77
|
+
function orderPagination(totalCount, totalPages, safeOffset, currentPage) {
|
|
78
|
+
return [
|
|
79
|
+
{ tag: 'hr' },
|
|
80
|
+
...paginationBar({
|
|
81
|
+
cmd: 'order.page',
|
|
82
|
+
offset: safeOffset,
|
|
83
|
+
pageSize: ORDER_PAGE_SIZE,
|
|
84
|
+
total: totalCount,
|
|
85
|
+
label: `**第 ${currentPage}/${totalPages} 页**(共 ${totalCount} 条)`,
|
|
86
|
+
}),
|
|
87
|
+
];
|
|
88
|
+
}
|
|
89
|
+
function orderList(_args, _ctx, offset, deps) {
|
|
90
|
+
deps.reload();
|
|
91
|
+
const allOrders = deps.list();
|
|
92
|
+
const elements = [];
|
|
93
|
+
if (allOrders.length === 0) {
|
|
94
|
+
elements.push({ tag: 'div', text: { tag: 'lark_md', content: '暂无指令' } });
|
|
143
95
|
}
|
|
144
|
-
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
try {
|
|
149
|
-
deps.save(text);
|
|
150
|
-
return { text: `✅ 已保存指令: ${text.slice(0, 50)}${text.length > 50 ? '...' : ''}` };
|
|
96
|
+
else {
|
|
97
|
+
const { totalCount, totalPages, safeOffset, currentPage, pageItems: pageOrders, hasPagination, } = pageSlice(allOrders, offset, ORDER_PAGE_SIZE);
|
|
98
|
+
for (let i = 0; i < pageOrders.length; i++) {
|
|
99
|
+
elements.push(...orderRowElements(pageOrders[i], safeOffset, i === pageOrders.length - 1));
|
|
151
100
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
if (sub === 'edit') {
|
|
157
|
-
const target = args[1];
|
|
158
|
-
const newText = args.slice(2).join(' ').trim();
|
|
159
|
-
if (!target || !newText) {
|
|
160
|
-
return { text: '用法: /order edit <orderId|序号> <新文本>' };
|
|
161
|
-
}
|
|
162
|
-
const order = deps.resolveTarget(target);
|
|
163
|
-
if (!order)
|
|
164
|
-
return { text: `指令不存在: ${target}` };
|
|
165
|
-
try {
|
|
166
|
-
deps.updateText(order.id, newText);
|
|
167
|
-
const preview = newText.length > 50 ? newText.slice(0, 50) + '...' : newText;
|
|
168
|
-
return { text: `✅ 已更新指令: ${preview}` };
|
|
169
|
-
}
|
|
170
|
-
catch (err) {
|
|
171
|
-
return { text: `保存失败: ${err.message}` };
|
|
101
|
+
if (hasPagination) {
|
|
102
|
+
elements.push(...orderPagination(totalCount, totalPages, safeOffset, currentPage));
|
|
172
103
|
}
|
|
173
104
|
}
|
|
174
105
|
return {
|
|
175
|
-
|
|
106
|
+
card: {
|
|
107
|
+
schema: '2.0',
|
|
108
|
+
config: { wide_screen_mode: true, update_multi: true },
|
|
109
|
+
header: { title: { tag: 'plain_text', content: '📋 指令' }, template: 'turquoise' },
|
|
110
|
+
body: { elements },
|
|
111
|
+
},
|
|
176
112
|
};
|
|
177
113
|
}
|
|
114
|
+
function orderAliasAdd(args, _ctx, _offset, deps) {
|
|
115
|
+
const target = args[2];
|
|
116
|
+
const name = args[3];
|
|
117
|
+
if (!target || !name) {
|
|
118
|
+
return { text: '用法: /order alias add <orderId|序号> <别名名>' };
|
|
119
|
+
}
|
|
120
|
+
const order = deps.resolveTarget(target);
|
|
121
|
+
if (!order)
|
|
122
|
+
return { text: `指令不存在: ${target}` };
|
|
123
|
+
try {
|
|
124
|
+
deps.setAlias(order.id, name);
|
|
125
|
+
return { text: `✅ 已给指令绑定别名 $${name}` };
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
return { text: `保存失败: ${err.message}` };
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function orderAliasRemove(args, _ctx, _offset, deps) {
|
|
132
|
+
const target = args[2];
|
|
133
|
+
if (!target)
|
|
134
|
+
return { text: '用法: /order alias rm <orderId|序号>' };
|
|
135
|
+
const order = deps.resolveTarget(target);
|
|
136
|
+
if (!order)
|
|
137
|
+
return { text: `指令不存在: ${target}` };
|
|
138
|
+
if (!order.alias)
|
|
139
|
+
return { text: '该指令没有别名' };
|
|
140
|
+
const aliasName = order.alias;
|
|
141
|
+
try {
|
|
142
|
+
deps.setAlias(order.id, undefined);
|
|
143
|
+
return { text: `✅ 已移除别名 $${aliasName}` };
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
return { text: `保存失败: ${err.message}` };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/** alias 子操作 → handler。用 Map 而非对象字面量:`constructor` 这类键会命中 Object.prototype。 */
|
|
150
|
+
const ORDER_ALIAS_HANDLERS = new Map([
|
|
151
|
+
['add', orderAliasAdd],
|
|
152
|
+
['rm', orderAliasRemove],
|
|
153
|
+
]);
|
|
154
|
+
function orderAlias(args, ctx, offset, deps) {
|
|
155
|
+
const op = args[1];
|
|
156
|
+
if (!op || op === 'list')
|
|
157
|
+
return buildOrderCommand([], ctx, offset, deps);
|
|
158
|
+
const handler = ORDER_ALIAS_HANDLERS.get(op);
|
|
159
|
+
return handler ? handler(args, ctx, offset, deps) : { text: ORDER_ALIAS_USAGE_TEXT };
|
|
160
|
+
}
|
|
161
|
+
function orderSave(args, _ctx, _offset, deps) {
|
|
162
|
+
const text = args.slice(1).join(' ');
|
|
163
|
+
if (!text)
|
|
164
|
+
return { text: '用法: /order save <指令文本>' };
|
|
165
|
+
try {
|
|
166
|
+
deps.save(text);
|
|
167
|
+
return { text: `✅ 已保存指令: ${text.slice(0, 50)}${text.length > 50 ? '...' : ''}` };
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
return { text: `保存失败: ${err.message}` };
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function orderEdit(args, _ctx, _offset, deps) {
|
|
174
|
+
const target = args[1];
|
|
175
|
+
const newText = args.slice(2).join(' ').trim();
|
|
176
|
+
if (!target || !newText) {
|
|
177
|
+
return { text: '用法: /order edit <orderId|序号> <新文本>' };
|
|
178
|
+
}
|
|
179
|
+
const order = deps.resolveTarget(target);
|
|
180
|
+
if (!order)
|
|
181
|
+
return { text: `指令不存在: ${target}` };
|
|
182
|
+
try {
|
|
183
|
+
deps.updateText(order.id, newText);
|
|
184
|
+
const preview = newText.length > 50 ? newText.slice(0, 50) + '...' : newText;
|
|
185
|
+
return { text: `✅ 已更新指令: ${preview}` };
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
return { text: `保存失败: ${err.message}` };
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/** 子命令 → handler。未知 sub 回退到长用法文案(与拆分前一致)。 */
|
|
192
|
+
const ORDER_SUB_HANDLERS = new Map([
|
|
193
|
+
['list', orderList],
|
|
194
|
+
['alias', orderAlias],
|
|
195
|
+
['save', orderSave],
|
|
196
|
+
['edit', orderEdit],
|
|
197
|
+
]);
|
|
198
|
+
export function buildOrderCommand(args, ctx, offset, deps) {
|
|
199
|
+
const sub = args[0]?.toLowerCase();
|
|
200
|
+
const handler = sub === undefined ? orderList : ORDER_SUB_HANDLERS.get(sub);
|
|
201
|
+
return handler ? handler(args, ctx, offset, deps) : { text: ORDER_USAGE_TEXT };
|
|
202
|
+
}
|
|
178
203
|
//# sourceMappingURL=order.js.map
|