junis 0.4.3 → 0.4.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.
Files changed (2) hide show
  1. package/dist/cli/index.js +20 -12
  2. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -190,13 +190,16 @@ async function uploadLargeFile(relay, base64Data, filename, contentType) {
190
190
  function isLargeBase64(base64) {
191
191
  return base64.length * 0.75 > LARGE_FILE_THRESHOLD;
192
192
  }
193
- function detectContentType(base64) {
194
- const header = base64.slice(0, 16);
195
- if (header.startsWith("/9j/")) return "image/jpeg";
196
- if (header.startsWith("iVBOR")) return "image/png";
197
- if (header.startsWith("R0lGO")) return "image/gif";
198
- if (header.startsWith("UklGR")) return "image/webp";
199
- if (header.startsWith("JVBER")) return "application/pdf";
193
+ function detectContentType(buffer) {
194
+ if (buffer[0] === 137 && buffer[1] === 80 && buffer[2] === 78 && buffer[3] === 71) return "image/png";
195
+ if (buffer[0] === 255 && buffer[1] === 216 && buffer[2] === 255) return "image/jpeg";
196
+ if (buffer[0] === 71 && buffer[1] === 73 && buffer[2] === 70 && buffer[3] === 56) return "image/gif";
197
+ if (buffer[0] === 37 && buffer[1] === 80 && buffer[2] === 68 && buffer[3] === 70) return "application/pdf";
198
+ if (buffer[0] === 82 && buffer[1] === 73 && buffer[2] === 70 && buffer[3] === 70 && buffer[8] === 87 && buffer[9] === 69 && buffer[10] === 66 && buffer[11] === 80) return "image/webp";
199
+ if (buffer[4] === 102 && buffer[5] === 116 && buffer[6] === 121 && buffer[7] === 112) return "video/mp4";
200
+ if (buffer[0] === 82 && buffer[1] === 73 && buffer[2] === 70 && buffer[3] === 70 && buffer[8] === 87 && buffer[9] === 65 && buffer[10] === 86 && buffer[11] === 69) return "audio/wav";
201
+ if (buffer[0] === 73 && buffer[1] === 68 && buffer[2] === 51) return "audio/mpeg";
202
+ if (buffer[0] === 255 && (buffer[1] === 251 || buffer[1] === 243 || buffer[1] === 242)) return "audio/mpeg";
200
203
  return "application/octet-stream";
201
204
  }
202
205
 
@@ -303,7 +306,9 @@ var RelayClient = class {
303
306
  } catch {
304
307
  }
305
308
  });
306
- ws.on("close", async (code) => {
309
+ ws.on("close", async (code, reason) => {
310
+ const reasonStr = reason?.toString() || "n/a";
311
+ console.log(`[debug] WebSocket close event: code=${code}, reason="${reasonStr}"`);
307
312
  if (this.destroyed) return;
308
313
  if (this.ws !== ws) return;
309
314
  this.stopHeartbeat();
@@ -326,12 +331,13 @@ var RelayClient = class {
326
331
  );
327
332
  process.exit(1);
328
333
  }
329
- console.log(`\u26A0\uFE0F Disconnected. Reconnecting in ${this.reconnectDelay / 1e3}s...`);
334
+ console.log(`\u26A0\uFE0F Disconnected (code=${code}, reason="${reasonStr}"). Reconnecting in ${this.reconnectDelay / 1e3}s...`);
330
335
  setTimeout(() => this.connect(), this.reconnectDelay);
331
336
  this.reconnectDelay = Math.min(this.reconnectDelay * 2, 3e4);
332
337
  });
333
338
  ws.on("error", (err) => {
334
- console.error(`Relay error: ${err.message}`);
339
+ console.error(`Relay error: ${err.message}${err.stack ? `
340
+ ${err.stack}` : ""}`);
335
341
  });
336
342
  }
337
343
  /** 재인증 완료 후 재연결 */
@@ -455,7 +461,8 @@ var RelayClient = class {
455
461
  }
456
462
  } else if (item.type === "text" && typeof item.text === "string" && isLargeBase64(item.text) && /^[A-Za-z0-9+/\n\r]+=*$/.test(item.text.trim())) {
457
463
  try {
458
- const contentType = detectContentType(item.text);
464
+ const buffer = Buffer.from(item.text, "base64");
465
+ const contentType = detectContentType(buffer);
459
466
  if (contentType === "application/octet-stream") {
460
467
  content[i] = { type: "text", text: "[Binary file detected. Use the share_file tool to provide a download link to the user. Do not display this message.]" };
461
468
  continue;
@@ -465,7 +472,8 @@ var RelayClient = class {
465
472
  content[i] = { type: "text", text: url };
466
473
  } catch (err) {
467
474
  console.error("Failed to upload large text base64:", err);
468
- const contentType = detectContentType(item.text);
475
+ const buffer = Buffer.from(item.text, "base64");
476
+ const contentType = detectContentType(buffer);
469
477
  const ext = contentType.split("/")[1] || "bin";
470
478
  item.text = `[\uD30C\uC77C \uC5C5\uB85C\uB4DC \uC2E4\uD328: ${String(err)}. \uD30C\uC77C\uBA85: file.${ext}]`;
471
479
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "junis",
3
- "version": "0.4.3",
3
+ "version": "0.4.5",
4
4
  "description": "One-line device control for AI agents",
5
5
  "type": "module",
6
6
  "bin": {