@yu_robotics/remote-cli-router 1.6.49 → 1.6.66

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/README.md CHANGED
@@ -9,17 +9,19 @@ The router server acts as a bridge between Feishu messaging and developer machin
9
9
  - **User-device binding** via Feishu bot commands
10
10
  - **Message routing** between Feishu and connected CLI clients
11
11
  - **Code-change rendering** with collapsible, line-aware diff previews inside streaming cards
12
- - **Image message forwarding** for standalone images and mixed text-image posts to supported local backends, plus generated Codex images back to Feishu Card 2.0
12
+ - **Image message forwarding** for Feishu images to supported backends, plus Codex native image output and local image files returned by any backend
13
13
  - **Client service management** is handled by the local CLI; the Router remains a separate long-running server process
14
14
  - **Queued task cards** appear at execution time for capable clients, with the thread, workspace, task preview, and remaining queue count; older clients retain waiting cards
15
15
  - **WebSocket connections** from local clients
16
16
  - **Feishu long connection** for receiving and sending messages
17
+ - **Task recovery** with compatible clients: resume output on a usable surviving card or create a new one, with an independent gap notice and plain-text handling of resumed fragments; failed card creation is not acknowledged as successful recovery
18
+ - **Table-aware card splitting** and a single text fallback retry for a card rejected by Feishu's table limit
17
19
 
18
20
  ## Prerequisites
19
21
 
20
- - A cloud server with at least **1 CPU core** and **1GB RAM**
22
+ - A server reachable by your local CLI clients, with outbound access to Feishu
21
23
  - **Node.js** >= 18.0.0
22
- - A **domain name** with SSL certificate (HTTPS required for Feishu)
24
+ - For public deployments, a **domain name** and TLS reverse proxy for client connections; internal deployments can use HTTP on a trusted network
23
25
  - A **Feishu bot** with messaging permissions
24
26
 
25
27
  ## Installation
@@ -43,6 +45,8 @@ You will be prompted for:
43
45
  - Feishu Verification Token (optional)
44
46
  - Server Port (default: 3000)
45
47
 
48
+ Configure the bot's **Long Connection** event mode with `im.message.receive_v1` and `card.action.trigger`. The Router opens the connection to Feishu; no inbound Feishu webhook URL is required. Encrypt Key and Verification Token are retained in the configuration wizard but are not used by the current long-connection handler.
49
+
46
50
  ### 2. Start the Server
47
51
 
48
52
  ```bash
@@ -69,6 +73,8 @@ docker compose up -d
69
73
 
70
74
  The `./router-data` bind mount stores Router data under the container's `/router-data` home directory (`/router-data/.remote-cli-router/`). On Linux, set `ROUTER_UID` and `ROUTER_GID` in `.env` to the output of `id -u` and `id -g`; they must match the directory owner. Set `ROUTER_PORT` before setup if port `3000` is unavailable; it must match the server port entered in the setup wizard. Use `docker compose logs -f router` to inspect logs and `docker compose down` to stop the service. Run local clients directly on their host machines rather than in Docker so they can access project files and local AI CLI binaries.
71
75
 
76
+ Clients automatically install a newer Router's exact published npm version when their tasks and queues are idle. Manual clients continue running the old version until their next start; clients launched with `--non-interactive` exit for their supervisor to restart. A rejected CLI protocol requires a restart after installation. Publish the matching CLI package when upgrading the Router.
77
+
72
78
  ## Commands
73
79
 
74
80
  | Command | Description |
@@ -85,7 +91,7 @@ The Feishu command reference includes the cross-backend `/status`, `/context`, a
85
91
  ## Architecture
86
92
 
87
93
  ```
88
- Mobile Phone -> Feishu -> Router Server -> WebSocket -> Local CLI -> Claude Code
94
+ Mobile Phone -> Feishu -> Router Server -> WebSocket -> Local CLI -> AI Backend
89
95
  |
90
96
  Mobile Phone <- Feishu <- Router Server <- WebSocket <- Local CLI <- Results
91
97
  ```
@@ -149,7 +155,7 @@ Back up `./router-data` before upgrades and do not use `docker compose down -v`
149
155
 
150
156
  ## Documentation
151
157
 
152
- For full documentation, see the [project README](https://github.com/xiaoyu/remote-cli#readme).
158
+ For full documentation, see the [project README](https://github.com/Yu-Robotics/remote-cli#readme).
153
159
 
154
160
  ## License
155
161
 
@@ -158,3 +164,9 @@ MIT
158
164
  ## Changelog
159
165
 
160
166
  See the project [CHANGELOG.md](../../CHANGELOG.md) for release notes and user-visible changes.
167
+
168
+ ## Approval Cards
169
+
170
+ When supported by the connected CLI, Codex permission requests appear as standalone cards with Allow, Deny, and (for explicit directory grants) Allow and remember directory buttons. Each button targets the original user, device, thread, and request. The card shows success only after the CLI confirms the decision. Completed requests cannot be approved again, and pending approvals receive fresh cards after reconnecting. After a Router crash, buttons on old cards may remain visible but are rejected as expired. Both CLI and Router must be upgraded to use this feature; unsupported peers and failed card delivery retain text approvals.
171
+
172
+ Restricted Claude Code threads use the same approval card flow, titled Permission request, for outside writes, protected files, read-only-mode edits, and commands outside their native sandbox. Ordinary workspace and explicitly authorized directory edits in workspace-write mode do not create approval cards, unless a native ask rule requires one. If card creation fails, Claude accepts text replies without starting a new model turn; completed or expired requests cannot be approved later. The CLI enforces file boundaries before native allow rules; native deny and ask rules still apply. Sandboxed command networking is enabled by default, subject to native domain denials and administrator-managed restrictions; `/sandbox network off` disables it without changing the approval card flow. Missing sandbox dependencies stop execution on the CLI; the Router cannot override that startup failure. See [Claude sandbox configuration](../../README.md#optional-claude-code-sandbox).
@@ -0,0 +1,27 @@
1
+ import type { ApprovalAction, ApprovalRequestMessage, ApprovalResolvedMessage } from '../types';
2
+ interface ApprovalCardTransport {
3
+ ownsDevice(openId: string, deviceId: string): Promise<boolean>;
4
+ sendToDevice(deviceId: string, message: object): Promise<boolean>;
5
+ create(openId: string, elements: any[]): Promise<string | null>;
6
+ update(cardId: string, elements: any[]): Promise<void>;
7
+ registerReplyRoute(cardId: string, threadId: string, deviceId: string): void;
8
+ }
9
+ /** A button answers one original request, independent of the user's active thread/device. */
10
+ export declare class ApprovalCards {
11
+ private readonly transport;
12
+ private readonly pending;
13
+ private readonly finished;
14
+ constructor(transport: ApprovalCardTransport);
15
+ receive(request: ApprovalRequestMessage, deviceId: string, current: () => boolean): Promise<void>;
16
+ resolve(message: ApprovalResolvedMessage, deviceId: string): Promise<void>;
17
+ click(openId: string, requestId: string, cardId: string, action: ApprovalAction): Promise<string>;
18
+ disconnect(deviceId: string): void;
19
+ destroy(): void;
20
+ private unavailable;
21
+ private refresh;
22
+ private elements;
23
+ private validRequest;
24
+ private prune;
25
+ }
26
+ export {};
27
+ //# sourceMappingURL=ApprovalCards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApprovalCards.d.ts","sourceRoot":"","sources":["../../src/feishu/ApprovalCards.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,uBAAuB,EAAkB,MAAM,UAAU,CAAC;AAchH,UAAU,qBAAqB;IAC7B,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAChE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9E;AAED,6FAA6F;AAC7F,qBAAa,aAAa;IAIZ,OAAO,CAAC,QAAQ,CAAC,SAAS;IAHtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;gBAEzB,SAAS,EAAE,qBAAqB;IAEvD,OAAO,CAAC,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BjG,OAAO,CAAC,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B1E,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IAmCvG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAUlC,OAAO,IAAI,IAAI;YAKD,WAAW;YAIX,OAAO;IAUrB,OAAO,CAAC,QAAQ;IA2BhB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,KAAK;CAKd"}
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ApprovalCards = void 0;
4
+ /** A button answers one original request, independent of the user's active thread/device. */
5
+ class ApprovalCards {
6
+ transport;
7
+ pending = new Map();
8
+ finished = new Map();
9
+ constructor(transport) {
10
+ this.transport = transport;
11
+ }
12
+ async receive(request, deviceId, current) {
13
+ if (!request || typeof request.messageId !== 'string' || typeof request.openId !== 'string'
14
+ || !(await this.transport.ownsDevice(request.openId, deviceId)) || !current())
15
+ return;
16
+ if (!this.validRequest(request)) {
17
+ await this.unavailable(deviceId, request.messageId);
18
+ return;
19
+ }
20
+ this.prune();
21
+ const key = `${deviceId}:${request.messageId}`;
22
+ if (this.finished.has(key) || this.pending.has(key))
23
+ return;
24
+ if (this.pending.size >= 500) {
25
+ await this.unavailable(deviceId, request.messageId);
26
+ return;
27
+ }
28
+ const entry = { request, deviceId, status: 'pending' };
29
+ this.pending.set(key, entry);
30
+ entry.ready = (async () => {
31
+ try {
32
+ entry.cardId = await this.transport.create(request.openId, this.elements(entry)) ?? undefined;
33
+ if (entry.cardId)
34
+ this.transport.registerReplyRoute(entry.cardId, request.threadId, deviceId);
35
+ }
36
+ catch { /* Fall back to the existing text approval flow. */ }
37
+ if (!entry.cardId) {
38
+ if (this.pending.get(key) === entry)
39
+ this.pending.delete(key);
40
+ if (entry.status === 'pending' && current())
41
+ await this.unavailable(deviceId, request.messageId);
42
+ }
43
+ })();
44
+ await entry.ready;
45
+ if (entry.status !== 'pending')
46
+ await this.refresh(entry);
47
+ }
48
+ async resolve(message, deviceId) {
49
+ if (typeof message.messageId !== 'string' || message.messageId.length > 4096
50
+ || !['pending', 'approved', 'denied', 'remembered', 'expired'].includes(message.status))
51
+ return;
52
+ const key = `${deviceId}:${message.messageId}`;
53
+ const entry = this.pending.get(key);
54
+ if (!entry) {
55
+ // A completion can overtake asynchronous binding lookup/card creation.
56
+ // Keep bounded tombstones so a late request cannot recreate an active card.
57
+ if (message.status !== 'pending') {
58
+ this.finished.set(key, Date.now());
59
+ this.prune();
60
+ }
61
+ return;
62
+ }
63
+ if (entry.request.openId !== message.openId || entry.request.threadId !== message.threadId)
64
+ return;
65
+ entry.status = message.status;
66
+ entry.error = typeof message.error === 'string' ? message.error.slice(0, 500) : undefined;
67
+ entry.submitting = false;
68
+ clearTimeout(entry.timer);
69
+ if (message.status !== 'pending') {
70
+ this.pending.delete(key);
71
+ this.finished.set(key, Date.now());
72
+ this.prune();
73
+ }
74
+ await this.refresh(entry);
75
+ }
76
+ async click(openId, requestId, cardId, action) {
77
+ const entry = [...this.pending.values()].find(state => state.request.messageId === requestId && state.cardId === cardId);
78
+ if (!entry || entry.request.openId !== openId)
79
+ throw new Error('This approval is expired or does not belong to you.');
80
+ if (!['approve', 'deny', 'remember'].includes(action) || (action === 'remember' && !entry.request.approval.canRemember)) {
81
+ throw new Error('This approval does not support that action.');
82
+ }
83
+ const key = `${entry.deviceId}:${requestId}`;
84
+ if (!(await this.transport.ownsDevice(openId, entry.deviceId)) || this.pending.get(key) !== entry) {
85
+ throw new Error('This approval is no longer available.');
86
+ }
87
+ if (entry.submitting)
88
+ return 'Approval already sent. Waiting for CLI confirmation.';
89
+ entry.submitting = true;
90
+ entry.error = undefined;
91
+ // An acknowledgement is authoritative. A send or a button click alone is not approval.
92
+ entry.timer = setTimeout(() => {
93
+ if (this.pending.get(key) !== entry)
94
+ return;
95
+ entry.submitting = false;
96
+ entry.error = 'No CLI confirmation received. Retry or check the device connection.';
97
+ void this.refresh(entry);
98
+ }, 30000);
99
+ entry.timer.unref?.();
100
+ let sent = false;
101
+ try {
102
+ sent = await this.transport.sendToDevice(entry.deviceId, { type: 'approval_response', messageId: requestId,
103
+ taskMessageId: entry.request.taskMessageId, openId, threadId: entry.request.threadId, action, timestamp: Date.now() });
104
+ }
105
+ catch { /* Retain the request so the user can retry. */ }
106
+ if (!sent) {
107
+ clearTimeout(entry.timer);
108
+ entry.submitting = false;
109
+ throw new Error('The original CLI device is offline. Reconnect it before approving.');
110
+ }
111
+ void this.refresh(entry);
112
+ return 'Approval sent. Waiting for CLI confirmation.';
113
+ }
114
+ disconnect(deviceId) {
115
+ for (const [key, entry] of this.pending) {
116
+ if (entry.deviceId !== deviceId)
117
+ continue;
118
+ this.pending.delete(key);
119
+ clearTimeout(entry.timer);
120
+ entry.status = 'disconnected';
121
+ void this.refresh(entry);
122
+ }
123
+ }
124
+ destroy() {
125
+ for (const deviceId of new Set([...this.pending.values()].map(entry => entry.deviceId)))
126
+ this.disconnect(deviceId);
127
+ this.finished.clear();
128
+ }
129
+ async unavailable(deviceId, messageId) {
130
+ await this.transport.sendToDevice(deviceId, { type: 'approval_unavailable', messageId, timestamp: Date.now() });
131
+ }
132
+ async refresh(entry) {
133
+ const previous = entry.updating;
134
+ entry.updating = (async () => {
135
+ await entry.ready;
136
+ await previous;
137
+ if (entry.cardId)
138
+ await this.transport.update(entry.cardId, this.elements(entry));
139
+ })().catch(error => console.error('[ApprovalCards] Failed to update approval card:', error instanceof Error ? error.message : error));
140
+ await entry.updating;
141
+ }
142
+ elements(entry) {
143
+ const { request, status } = entry;
144
+ const escape = (value) => value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/[\\`*_{}\[\]()!|#]/g, '\\$&');
145
+ const label = status === 'pending' ? (entry.submitting ? 'Waiting for CLI confirmation' : 'Permission request')
146
+ : { approved: 'Approved', denied: 'Denied', remembered: 'Approved and directory access remembered',
147
+ expired: 'Approval expired', disconnected: 'Device disconnected. A pending request will get a new card after reconnecting.' }[status];
148
+ const elements = [
149
+ { tag: 'markdown', content: `**${label}**` },
150
+ { tag: 'markdown', content: `Reply from: ${escape(request.threadName)}\nWorkspace: ${escape(request.cwd)}` },
151
+ { tag: 'markdown', content: escape(request.approval.description) },
152
+ ];
153
+ if (request.approval.canRemember)
154
+ elements.push({ tag: 'markdown', content: `Remember grants write access to these directories and their children for this thread:\n${request.approval.writableRoots.map(root => `- ${escape(root)}`).join('\n')}` });
155
+ if (request.approval.kind === 'permissions')
156
+ elements.push({ tag: 'markdown', content: 'Allow grants the displayed permissions for the current turn.' });
157
+ if (request.approval.kind !== 'permissions')
158
+ elements.push({ tag: 'markdown', content: 'Approving this action may allow execution outside the sandbox.' });
159
+ if (entry.error)
160
+ elements.push({ tag: 'markdown', content: escape(entry.error) });
161
+ if (status === 'pending' && !entry.submitting) {
162
+ const actions = [['approve', 'Allow', 'primary'], ['deny', 'Deny', 'default']];
163
+ if (request.approval.canRemember)
164
+ actions.push(['remember', 'Allow and remember directory', 'default']);
165
+ for (const [action, label, type] of actions)
166
+ elements.push({ tag: 'button', type,
167
+ text: { tag: 'plain_text', content: label },
168
+ behaviors: [{ type: 'callback', value: { action: 'approval_reply', requestId: request.messageId, decision: action } }],
169
+ });
170
+ }
171
+ return elements;
172
+ }
173
+ validRequest(request) {
174
+ const approval = request?.approval;
175
+ return !!request && [request.messageId, request.taskMessageId, request.openId, request.threadId, request.threadName, request.cwd]
176
+ .every(value => typeof value === 'string' && value.length > 0 && value.length <= 4096)
177
+ && !!approval && approval.requestId === request.messageId && ['command', 'file', 'permissions'].includes(approval.kind)
178
+ && typeof approval.description === 'string' && approval.description.length <= 16000
179
+ && typeof approval.canRemember === 'boolean' && (!approval.canRemember || (Array.isArray(approval.writableRoots)
180
+ && approval.writableRoots.length > 0 && approval.writableRoots.length <= 50
181
+ && approval.writableRoots.every(root => typeof root === 'string' && root.length > 0 && root.length <= 4096)));
182
+ }
183
+ prune() {
184
+ for (const [key, time] of this.finished) {
185
+ if (time < Date.now() - 60 * 60 * 1000 || this.finished.size > 1000)
186
+ this.finished.delete(key);
187
+ }
188
+ }
189
+ }
190
+ exports.ApprovalCards = ApprovalCards;
191
+ //# sourceMappingURL=ApprovalCards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApprovalCards.js","sourceRoot":"","sources":["../../src/feishu/ApprovalCards.ts"],"names":[],"mappings":"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"}
@@ -31,6 +31,7 @@ export declare class FeishuLongConnHandler {
31
31
  private readonly THREAD_SWITCH_STATE_TTL_MS;
32
32
  private threadSwitchStateCleanupTimer;
33
33
  private cardContentHashes;
34
+ private plainTextCards;
34
35
  private messageLocks;
35
36
  private queueCardDecisions;
36
37
  private queueActionStates;
@@ -74,6 +75,7 @@ export declare class FeishuLongConnHandler {
74
75
  */
75
76
  onCardNewThread?: (openId: string) => Promise<void>;
76
77
  /** Callback invoked when a user confirms or cancels a queued command. */
78
+ onApprovalAction?: (openId: string, requestId: string, cardId: string, decision: string) => Promise<string>;
77
79
  onQueueAction?: (openId: string, action: 'confirm' | 'cancel', queueId: string, threadId: string, cardMessageId?: string) => Promise<'sent' | 'already_processed'>;
78
80
  /**
79
81
  * Callback invoked after a user switches to a different device.
@@ -206,11 +208,12 @@ export declare class FeishuLongConnHandler {
206
208
  /**
207
209
  * Split Card 2.0 elements into chunks based on Feishu limits
208
210
  *
209
- * Feishu Card 2.0 has two main limits:
211
+ * Card packing budgets:
210
212
  * 1. Element count: Max 200 tagged nodes per card (we use 150 for safety)
211
213
  * 2. Data size: Max 3,000,000 characters in the data field (JSON.stringify result)
214
+ * 3. Tables: A conservative budget including tables embedded in Markdown
212
215
  *
213
- * This function splits elements array into chunks that satisfy both limits,
216
+ * This function splits elements into chunks that satisfy these limits,
214
217
  * and adds continuation indicators between chunks for better UX.
215
218
  *
216
219
  * Note: Element counting uses recursive tag counting - all nodes with 'tag' property
@@ -245,6 +248,8 @@ export declare class FeishuLongConnHandler {
245
248
  * @returns The new message ID, or null on error
246
249
  */
247
250
  private createContinuationCard;
251
+ /** Retry only a confirmed table-limit rejection, once, with readable text. */
252
+ private sendCardRequest;
248
253
  /**
249
254
  * Send a standalone (non-streaming) card for a background task notification.
250
255
  *
@@ -254,6 +259,7 @@ export declare class FeishuLongConnHandler {
254
259
  * card in cardThreadMap for reply-to-continue-thread routing.
255
260
  */
256
261
  sendTaskNotificationCard(openId: string, elements: any[]): Promise<string | null>;
262
+ updateApprovalCard(cardId: string, elements: any[]): Promise<void>;
257
263
  /**
258
264
  * Upload a generated image for use in a Feishu card.
259
265
  */
@@ -1 +1 @@
1
- {"version":3,"file":"FeishuLongConnHandler.d.ts","sourceRoot":"","sources":["../../src/feishu/FeishuLongConnHandler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FeishuLongConnHandler.d.ts","sourceRoot":"","sources":["../../src/feishu/FeishuLongConnHandler.ts"],"names":[],"mappings":"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"}