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.
Files changed (55) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/bridge/inbound-media.js +71 -45
  3. package/dist/bridge/index.d.ts +9 -0
  4. package/dist/bridge/index.js +230 -203
  5. package/dist/card/approval-render.js +32 -33
  6. package/dist/card/card-budget.js +123 -98
  7. package/dist/card/run-renderer.js +82 -68
  8. package/dist/card/run-state.d.ts +0 -14
  9. package/dist/card/run-state.js +335 -207
  10. package/dist/card/tool-render.js +20 -16
  11. package/dist/card/usage-format.d.ts +12 -9
  12. package/dist/card/usage-format.js +111 -97
  13. package/dist/common/text-width.js +36 -24
  14. package/dist/common/tool-summary.js +132 -90
  15. package/dist/index.js +226 -190
  16. package/dist/message-handlers.js +253 -236
  17. package/dist/router/commands/ls.d.ts +3 -0
  18. package/dist/router/commands/ls.js +256 -175
  19. package/dist/router/commands/order.js +184 -159
  20. package/dist/router/commands/resume.js +189 -133
  21. package/dist/router/commands/ws.js +219 -174
  22. package/dist/router/index.js +192 -201
  23. package/dist/runner/bash/runner.js +2 -4
  24. package/dist/runner/codex/app-server/translator.d.ts +2 -0
  25. package/dist/runner/codex/app-server/translator.js +287 -221
  26. package/dist/runner/common/acp/base-translator.js +19 -17
  27. package/dist/runner/common/jsonl-stream.js +154 -187
  28. package/dist/runner/common/jsonrpc/client.d.ts +29 -0
  29. package/dist/runner/common/jsonrpc/client.js +43 -12
  30. package/dist/runner/common/spawning-runner.d.ts +5 -0
  31. package/dist/runner/common/spawning-runner.js +8 -3
  32. package/dist/runner/common/turn-started.d.ts +8 -0
  33. package/dist/runner/common/turn-started.js +11 -0
  34. package/dist/runner/dsh/approval.js +84 -51
  35. package/dist/runner/dsh/client.d.ts +7 -9
  36. package/dist/runner/dsh/client.js +356 -287
  37. package/dist/runner/dsh/mux-stream.js +28 -8
  38. package/dist/runner/dsh/runner.d.ts +4 -3
  39. package/dist/runner/dsh/runner.js +88 -64
  40. package/dist/runner/dsh/translator.d.ts +1 -31
  41. package/dist/runner/dsh/translator.js +180 -178
  42. package/dist/runner/kimi/acp/runner.js +81 -44
  43. package/dist/runner/opencode/acp/error-monitor.js +5 -5
  44. package/dist/runner/pi/rpc/client.js +4 -13
  45. package/dist/runner/pi/rpc/translator.js +61 -60
  46. package/dist/session/claude/sessions.js +113 -101
  47. package/dist/session/codex/rollout-reader.js +179 -180
  48. package/dist/session/dsh/sessions.js +281 -231
  49. package/dist/session/kimi/sessions.d.ts +0 -7
  50. package/dist/session/kimi/sessions.js +129 -109
  51. package/dist/session/opencode/sessions.d.ts +0 -11
  52. package/dist/session/opencode/sessions.js +161 -137
  53. package/dist/session/session-store.d.ts +8 -0
  54. package/dist/session/session-store.js +98 -98
  55. 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
- export function buildOrderCommand(args, ctx, offset, deps) {
6
- const sub = args[0]?.toLowerCase();
7
- if (!sub || sub === 'list') {
8
- deps.reload();
9
- const allOrders = deps.list();
10
- const elements = [];
11
- if (allOrders.length === 0) {
12
- elements.push({ tag: 'div', text: { tag: 'lark_md', content: '暂无指令' } });
13
- }
14
- else {
15
- const { totalCount, totalPages, safeOffset, currentPage, pageItems: pageOrders, hasPagination, } = pageSlice(allOrders, offset, ORDER_PAGE_SIZE);
16
- for (let i = 0; i < pageOrders.length; i++) {
17
- const order = pageOrders[i];
18
- const displayText = order.text.length > 100 ? order.text.slice(0, 97) + '...' : order.text;
19
- elements.push({
20
- tag: 'div',
21
- text: {
22
- tag: 'lark_md',
23
- content: order.alias ? `\`$${order.alias}\` ${displayText}` : displayText,
24
- },
25
- });
26
- const leftColumn = order.alias
27
- ? [
28
- cardButton(`$${order.alias}`, { cmd: 'order.aliasEdit', orderId: order.id, offset: safeOffset }, { type: 'default', size: 'small' }),
29
- cardButton('✕', {
30
- cmd: 'order.aliasRemove',
31
- orderId: order.id,
32
- aliasName: order.alias,
33
- offset: safeOffset,
34
- }, { type: 'default', size: 'small' }),
35
- ]
36
- : [
37
- cardButton('+别名', { cmd: 'order.aliasEdit', orderId: order.id, offset: safeOffset }, { type: 'default', size: 'small' }),
38
- ];
39
- elements.push({
40
- tag: 'column_set',
41
- columns: [
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: 'column',
45
- width: 'weighted',
46
- weight: 1,
47
- vertical_align: 'center',
48
- elements: [
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: 'column_set',
51
- columns: [
52
- {
53
- tag: 'column',
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
- if (i < pageOrders.length - 1)
80
- elements.push({ tag: 'hr' });
81
- }
82
- if (hasPagination) {
83
- elements.push({ tag: 'hr' }, ...paginationBar({
84
- cmd: 'order.page',
85
- offset: safeOffset,
86
- pageSize: ORDER_PAGE_SIZE,
87
- total: totalCount,
88
- label: `**第 ${currentPage}/${totalPages} 页**(共 ${totalCount} 条)`,
89
- }));
90
- }
91
- }
92
- return {
93
- card: {
94
- schema: '2.0',
95
- config: { wide_screen_mode: true, update_multi: true },
96
- header: { title: { tag: 'plain_text', content: '📋 指令' }, template: 'turquoise' },
97
- body: { elements },
98
- },
99
- };
100
- }
101
- if (sub === 'alias') {
102
- const op = args[1];
103
- if (op === 'add') {
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
- if (sub === 'save') {
145
- const text = args.slice(1).join(' ');
146
- if (!text)
147
- return { text: '用法: /order save <指令文本>' };
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
- catch (err) {
153
- return { text: `保存失败: ${err.message}` };
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
- text: '用法: /order [list|save <text>|edit <orderId|序号> <新文本>|alias add <orderId|序号> <别名名>|alias rm <orderId|序号>]',
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