cli-remote-agent 1.0.3 → 1.0.5

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/dist/cli.js CHANGED
@@ -119,7 +119,18 @@ function decodeToken(token) {
119
119
  function ask(rl, question) {
120
120
  return new Promise((resolve) => rl.question(question, (answer) => resolve(answer)));
121
121
  }
122
+ function normalizeServerUrl(url) {
123
+ const fixed = url.trim().replace(/^(wss?|https?)\/\//i, (_m, proto) => `${proto.toLowerCase()}://`);
124
+ try {
125
+ const u = new URL(fixed);
126
+ if (!/^(wss?:|https?:)$/.test(u.protocol)) throw new Error("unsupported protocol");
127
+ } catch {
128
+ throw new Error(`Invalid server URL: "${url}" (expected e.g. wss://crc.example.com)`);
129
+ }
130
+ return fixed;
131
+ }
122
132
  function writeConfig(cfg) {
133
+ cfg.serverUrl = normalizeServerUrl(cfg.serverUrl);
123
134
  import_fs2.default.mkdirSync(CONFIG_DIR, { recursive: true });
124
135
  import_fs2.default.writeFileSync(CONFIG_FILE, JSON.stringify(cfg, null, 2));
125
136
  console.log(`Saved. Start the agent with: crc-agent`);
@@ -204,7 +215,7 @@ var init_types = __esm({
204
215
  });
205
216
 
206
217
  // ../shared/src/protocol.ts
207
- var AGENT_HEARTBEAT, TERMINAL_OUTPUT, TERMINAL_EXIT, TERMINAL_OPEN, TERMINAL_INPUT, TERMINAL_RESIZE, TERMINAL_CLOSE, SESSION_ATTACH, SESSION_DETACH, SESSION_BUFFER, SESSION_SYNC, SESSION_SYNC_RESULT, VPN_LIST, VPN_CONNECT, VPN_DISCONNECT, VPN_UPDATE, FILES_LIST, FILES_DOWNLOAD, FILES_LIST_RESULT, FILES_DOWNLOAD_READY, FILES_DOWNLOAD_ERROR, AGENT_EXEC, AGENT_EXEC_RESULT, CLAUDE_CONV_READ, CLAUDE_CONV_DATA, CLAUDE_SESSIONS_LIST, CLAUDE_SESSIONS_RESULT, CLAUDE_HOOK, TMUX_LIST, TMUX_LIST_RESULT;
218
+ var AGENT_HEARTBEAT, TERMINAL_OUTPUT, TERMINAL_EXIT, TERMINAL_OPEN, TERMINAL_INPUT, TERMINAL_RESIZE, TERMINAL_CLOSE, SESSION_ATTACH, SESSION_DETACH, SESSION_BUFFER, SESSION_SYNC, SESSION_SYNC_RESULT, VPN_LIST, VPN_CONNECT, VPN_DISCONNECT, VPN_UPDATE, FILES_LIST, FILES_DOWNLOAD, FILES_LIST_RESULT, FILES_DOWNLOAD_READY, FILES_DOWNLOAD_ERROR, AGENT_EXEC, AGENT_EXEC_RESULT, CLAUDE_CONV_READ, CLAUDE_CONV_DATA, CLAUDE_SESSIONS_LIST, CLAUDE_SESSIONS_RESULT, CLAUDE_HOOK, TMUX_LIST, TMUX_LIST_RESULT, TMUX_KILL, TMUX_KILL_RESULT;
208
219
  var init_protocol = __esm({
209
220
  "../shared/src/protocol.ts"() {
210
221
  "use strict";
@@ -238,6 +249,8 @@ var init_protocol = __esm({
238
249
  CLAUDE_HOOK = "claude:hook";
239
250
  TMUX_LIST = "tmux:list";
240
251
  TMUX_LIST_RESULT = "tmux:list:result";
252
+ TMUX_KILL = "tmux:kill";
253
+ TMUX_KILL_RESULT = "tmux:kill:result";
241
254
  }
242
255
  });
243
256
 
@@ -506,6 +519,16 @@ async function listTmuxSessions() {
506
519
  return [];
507
520
  }
508
521
  }
522
+ async function killTmuxSession(name) {
523
+ const { file, args } = tmuxCmd(["kill-session", "-t", `=${name}`]);
524
+ try {
525
+ await execFileAsync2(file, args, { timeout: 6e3 });
526
+ return { ok: true };
527
+ } catch (err) {
528
+ const msg = (err?.stderr || err?.message || "tmux kill failed").toString().trim();
529
+ return { ok: false, error: msg };
530
+ }
531
+ }
509
532
  async function enrichWithPanesAndClaude(sessions2) {
510
533
  if (IS_WIN || sessions2.length === 0) return;
511
534
  try {
@@ -1768,6 +1791,13 @@ var init_index = __esm({
1768
1791
  socket.emit(TMUX_LIST_RESULT, { requestId, sessions: [], error: err?.message || "tmux list failed" });
1769
1792
  }
1770
1793
  });
1794
+ socket.on(TMUX_KILL, async (payload) => {
1795
+ const { requestId, name } = payload;
1796
+ if (!requestId || !name) return;
1797
+ const result = await killTmuxSession(name);
1798
+ logger.info({ name, ok: result.ok, error: result.error }, "tmux kill requested");
1799
+ socket.emit(TMUX_KILL_RESULT, { requestId, name, ok: result.ok, error: result.error });
1800
+ });
1771
1801
  socket.on(TERMINAL_INPUT, (payload) => {
1772
1802
  writeToSession(payload.sessionId, payload.data);
1773
1803
  });