@zoulabo/line-hive 0.1.19 → 0.1.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.
@@ -3,9 +3,44 @@
3
3
  * Eliminates duplicated validation, response formatting, and agent name checks.
4
4
  */
5
5
  import { randomUUID } from "crypto";
6
- import { MAX_LINE_TEXT_LENGTH, MIN_TIMEOUT_MS, MAX_TIMEOUT_MS } from "../constants.js";
6
+ import { MAX_LINE_TEXT_LENGTH, MIN_TIMEOUT_MS, MAX_TIMEOUT_MS, DEFAULT_FILE_TTL_MS, MAX_FILE_TTL_MS } from "../constants.js";
7
7
  import fs from "fs";
8
8
  import path from "path";
9
+ // ─── Path Security ──────────────────────────────────────────────────────────
10
+ /**
11
+ * Ensure a resolved path is within the workspace directory.
12
+ * Prevents path traversal attacks (e.g. `../../etc/passwd`).
13
+ */
14
+ export function assertWithinWorkspace(resolvedPath, label) {
15
+ const workspace = path.resolve(process.env.WORKSPACE_PATH || process.cwd());
16
+ if (!resolvedPath.startsWith(workspace + path.sep) && resolvedPath !== workspace) {
17
+ return `${label} must be within the workspace (${workspace}).`;
18
+ }
19
+ return null;
20
+ }
21
+ /**
22
+ * Read media content as a Buffer, supporting both disk-based and legacy base64 storage.
23
+ * Exported so readFile.ts can reuse the same logic.
24
+ */
25
+ export function readMediaBuffer(media) {
26
+ if (media.diskPath) {
27
+ const fullPath = path.resolve(media.diskPath);
28
+ try {
29
+ return fs.readFileSync(fullPath);
30
+ }
31
+ catch (err) {
32
+ // Disk file missing or unreadable — fall through to base64 fallback
33
+ if (process.env.LOG_LEVEL === "debug") {
34
+ console.error(`[readMediaBuffer] Failed to read ${fullPath}:`, err);
35
+ }
36
+ return null;
37
+ }
38
+ }
39
+ if (media.base64) {
40
+ return Buffer.from(media.base64, "base64");
41
+ }
42
+ return null;
43
+ }
9
44
  /** MIME types considered text-based (content decoded as UTF-8 for the agent) */
10
45
  const TEXT_MIME_PREFIXES = ["text/"];
11
46
  const TEXT_MIME_EXACT = new Set([
@@ -44,15 +79,24 @@ const INLINE_TEXT_THRESHOLD = 10 * 1024;
44
79
  export function mediaToContentBlocks(mediaJson, messageId) {
45
80
  try {
46
81
  const media = JSON.parse(mediaJson);
47
- if (!media.base64 || !media.mimeType)
82
+ if ((!media.base64 && !media.diskPath) || !media.mimeType)
48
83
  return [];
49
84
  // Images: return as ImageContent (LINE previews are small, acceptable inline)
50
85
  if (media.mimeType.startsWith("image/")) {
86
+ // For disk-based, read and base64-encode for MCP ImageContent
87
+ if (media.diskPath) {
88
+ const buffer = readMediaBuffer(media);
89
+ if (!buffer)
90
+ return [];
91
+ return [{ type: "image", data: buffer.toString("base64"), mimeType: media.mimeType }];
92
+ }
51
93
  return [{ type: "image", data: media.base64, mimeType: media.mimeType }];
52
94
  }
53
95
  // Text-based files: decode and return inline if small enough
54
96
  if (isTextMimeType(media.mimeType)) {
55
- const decoded = Buffer.from(media.base64, "base64");
97
+ const decoded = readMediaBuffer(media);
98
+ if (!decoded)
99
+ return [];
56
100
  if (decoded.length <= INLINE_TEXT_THRESHOLD) {
57
101
  const text = decoded.toString("utf-8");
58
102
  const header = media.fileName
@@ -95,11 +139,10 @@ export function mediaToContentBlocks(mediaJson, messageId) {
95
139
  info.fileSize = media.fileSize;
96
140
  return [{ type: "text", text: JSON.stringify(info) }];
97
141
  }
98
- // No messageId fallback: return metadata + base64 (legacy behavior)
142
+ // No messageId fallback: return metadata (legacy behavior)
99
143
  const info = {
100
144
  type: "file",
101
145
  mimeType: media.mimeType,
102
- base64: media.base64,
103
146
  };
104
147
  if (media.fileName)
105
148
  info.fileName = media.fileName;
@@ -165,6 +208,27 @@ export function clampTimeout(rawMs, fallbackMs) {
165
208
  const raw = typeof rawMs === "number" ? rawMs : fallbackMs;
166
209
  return Math.max(MIN_TIMEOUT_MS, Math.min(MAX_TIMEOUT_MS, raw));
167
210
  }
211
+ // ─── TTL Helpers ────────────────────────────────────────────────────────────
212
+ /** Clamp TTL in minutes to the valid range, returning ms. 0/undefined = default. */
213
+ export function clampTtlMs(ttlMinutes) {
214
+ if (typeof ttlMinutes !== "number" || ttlMinutes <= 0)
215
+ return DEFAULT_FILE_TTL_MS;
216
+ const ms = Math.round(ttlMinutes) * 60 * 1000;
217
+ return Math.min(ms, MAX_FILE_TTL_MS);
218
+ }
219
+ /** Format TTL ms as human-readable string (e.g. "5m", "1h", "1h 30m") */
220
+ export function formatTtl(ms) {
221
+ const totalMinutes = Math.round(ms / 60000);
222
+ if (totalMinutes < 1)
223
+ return "<1m";
224
+ const hours = Math.floor(totalMinutes / 60);
225
+ const minutes = totalMinutes % 60;
226
+ if (hours === 0)
227
+ return `${minutes}m`;
228
+ if (minutes === 0)
229
+ return `${hours}h`;
230
+ return `${hours}h ${minutes}m`;
231
+ }
168
232
  // ─── Image Sending ──────────────────────────────────────────────────────────
169
233
  /** Maximum image size: 10 MB (LINE's limit for originalContentUrl) */
170
234
  const MAX_IMAGE_SIZE = 10 * 1024 * 1024;
@@ -210,14 +274,16 @@ function mimeFromExtension(filePath) {
210
274
  return map[ext] || "application/octet-stream";
211
275
  }
212
276
  /**
213
- * Store an image (from base64 or file path) and return its HTTPS URL.
277
+ * Store an image (from base64 or file path) on disk and return its HTTPS URL.
214
278
  * Returns null with error message if ngrok is not configured or image is invalid.
215
279
  *
216
280
  * Supported input modes (mutually exclusive, imageFilePath preferred):
217
281
  * - `imageFilePath`: absolute path — server reads file directly, no base64 in context
218
282
  * - `imageBase64`: raw base64 string (legacy, causes context bloat)
283
+ *
284
+ * Images are written to `.line-hive-tmp/` and tracked with a TTL for automatic cleanup.
219
285
  */
220
- export function storeAndBuildImageUrl(args, config, messageStore) {
286
+ export function storeAndBuildImageUrl(args, config, messageStore, ttlMs = DEFAULT_FILE_TTL_MS) {
221
287
  const imageFilePath = args.imageFilePath;
222
288
  const imageBase64 = args.imageBase64;
223
289
  if (!imageFilePath && !imageBase64)
@@ -229,6 +295,9 @@ export function storeAndBuildImageUrl(args, config, messageStore) {
229
295
  if (imageFilePath) {
230
296
  // Read image from file path
231
297
  const resolved = path.resolve(imageFilePath);
298
+ const pathErr = assertWithinWorkspace(resolved, "imageFilePath");
299
+ if (pathErr)
300
+ return { error: pathErr };
232
301
  if (!fs.existsSync(resolved)) {
233
302
  return { error: "image_file_not_found" };
234
303
  }
@@ -252,7 +321,7 @@ export function storeAndBuildImageUrl(args, config, messageStore) {
252
321
  let mimeType = args.imageMimeType ||
253
322
  (imageFilePath ? mimeFromExtension(imageFilePath) : "image/png");
254
323
  // Sanitize MIME type — only allow image/* types to prevent serving
255
- // arbitrary content (e.g. text/html → XSS) from /images/:id route
324
+ // arbitrary content (e.g. text/html → XSS) from /files/ route
256
325
  if (!mimeType.startsWith("image/")) {
257
326
  return { error: "invalid_mime_type" };
258
327
  }
@@ -262,32 +331,181 @@ export function storeAndBuildImageUrl(args, config, messageStore) {
262
331
  if (imageBuffer.length > MAX_IMAGE_SIZE) {
263
332
  return { error: "image_too_large" };
264
333
  }
265
- const imageId = randomUUID();
266
- messageStore.storeOutgoingImage(imageId, imageBuffer, mimeType);
267
334
  // Include extension from mime type for browser compatibility
268
335
  const ext = mimeType === "image/jpeg" ? ".jpg"
269
336
  : mimeType === "image/png" ? ".png"
270
337
  : mimeType === "image/gif" ? ".gif"
271
338
  : mimeType === "image/webp" ? ".webp"
272
339
  : ".png";
273
- const url = `https://${config.ngrokDomain}/files/${imageId}${ext}`;
274
- return { url };
340
+ const imageId = randomUUID();
341
+ const filename = `${imageId}${ext}`;
342
+ // Write to disk instead of SQLite
343
+ const serveDir = path.resolve(".line-hive-tmp");
344
+ fs.mkdirSync(serveDir, { recursive: true });
345
+ fs.writeFileSync(path.join(serveDir, filename), imageBuffer);
346
+ messageStore.trackServedFile(filename, ttlMs);
347
+ const url = `https://${config.ngrokDomain}/files/${filename}`;
348
+ return { url, expiresIn: formatTtl(ttlMs) };
275
349
  }
276
350
  // ─── File Sending ───────────────────────────────────────────────────────────
277
351
  /** Maximum file size for outgoing files: 10 MB */
278
352
  const MAX_FILE_SIZE = 10 * 1024 * 1024;
353
+ /** UTF-8 BOM for Excel compatibility (Excel requires BOM to detect UTF-8) */
354
+ const UTF8_BOM = Buffer.from([0xef, 0xbb, 0xbf]);
279
355
  /**
280
- * Store a file from disk and return its HTTPS download URL.
281
- * Unlike storeAndBuildImageUrl, accepts ANY file type.
356
+ * Parse a CSV string into rows of cells.
357
+ * Handles quoted fields (with embedded commas, newlines, and escaped quotes).
358
+ */
359
+ export function parseCsv(text) {
360
+ const rows = [];
361
+ let row = [];
362
+ let cell = "";
363
+ let inQuotes = false;
364
+ let i = 0;
365
+ while (i < text.length) {
366
+ const ch = text[i];
367
+ if (inQuotes) {
368
+ if (ch === '"') {
369
+ if (i + 1 < text.length && text[i + 1] === '"') {
370
+ // Escaped quote
371
+ cell += '"';
372
+ i += 2;
373
+ }
374
+ else {
375
+ // End of quoted field
376
+ inQuotes = false;
377
+ i++;
378
+ }
379
+ }
380
+ else {
381
+ cell += ch;
382
+ i++;
383
+ }
384
+ }
385
+ else {
386
+ if (ch === '"' && cell.length === 0) {
387
+ // Start of quoted field
388
+ inQuotes = true;
389
+ i++;
390
+ }
391
+ else if (ch === ',') {
392
+ row.push(cell);
393
+ cell = "";
394
+ i++;
395
+ }
396
+ else if (ch === '\r') {
397
+ // Handle \r\n and bare \r
398
+ row.push(cell);
399
+ cell = "";
400
+ rows.push(row);
401
+ row = [];
402
+ i++;
403
+ if (i < text.length && text[i] === '\n')
404
+ i++;
405
+ }
406
+ else if (ch === '\n') {
407
+ row.push(cell);
408
+ cell = "";
409
+ rows.push(row);
410
+ row = [];
411
+ i++;
412
+ }
413
+ else {
414
+ cell += ch;
415
+ i++;
416
+ }
417
+ }
418
+ }
419
+ // Last cell/row
420
+ if (cell.length > 0 || row.length > 0) {
421
+ row.push(cell);
422
+ rows.push(row);
423
+ }
424
+ return rows;
425
+ }
426
+ /** Escape HTML entities in a string */
427
+ function escapeHtml(s) {
428
+ return s
429
+ .replace(/&/g, "&amp;")
430
+ .replace(/</g, "&lt;")
431
+ .replace(/>/g, "&gt;")
432
+ .replace(/"/g, "&quot;");
433
+ }
434
+ /**
435
+ * Render CSV data as a styled HTML page with a download link to the original CSV.
436
+ * The HTML is responsive and mobile-friendly for LINE's in-app browser.
437
+ */
438
+ export function csvToHtml(rows, title, downloadUrl, downloadName) {
439
+ if (rows.length === 0)
440
+ return "<html><body><p>Empty CSV</p></body></html>";
441
+ const [headerRow, ...dataRows] = rows;
442
+ const nonEmptyRows = dataRows.filter(row => row.some(c => c.trim() !== ""));
443
+ const headerCells = headerRow.map(c => `<th>${escapeHtml(c)}</th>`).join("");
444
+ const bodyRows = nonEmptyRows
445
+ .map(row => {
446
+ const cells = row.map(c => `<td>${escapeHtml(c)}</td>`).join("");
447
+ return ` <tr>${cells}</tr>`;
448
+ })
449
+ .join("\n");
450
+ return `<!DOCTYPE html>
451
+ <html lang="ja">
452
+ <head>
453
+ <meta charset="utf-8">
454
+ <meta name="viewport" content="width=device-width, initial-scale=1">
455
+ <title>${escapeHtml(title)}</title>
456
+ <style>
457
+ * { box-sizing: border-box; margin: 0; padding: 0; }
458
+ body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; padding: 16px; background: #f5f5f5; color: #333; }
459
+ .header { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 8px; margin-bottom: 16px; }
460
+ h1 { font-size: 1.2em; }
461
+ .meta { color: #888; font-size: 0.85em; }
462
+ .download { display: inline-block; padding: 8px 16px; background: #06c755; color: #fff; border-radius: 8px; text-decoration: none; font-size: 0.9em; white-space: nowrap; }
463
+ .download:active { background: #05a648; }
464
+ .table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; background: #fff; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
465
+ table { border-collapse: collapse; width: 100%; min-width: 300px; }
466
+ th { background: #f0f0f0; position: sticky; top: 0; text-align: left; padding: 10px 12px; border-bottom: 2px solid #ddd; font-size: 0.85em; white-space: nowrap; }
467
+ td { padding: 8px 12px; border-bottom: 1px solid #eee; font-size: 0.85em; }
468
+ tr:hover td { background: #f9f9f9; }
469
+ tr:nth-child(even) td { background: #fafafa; }
470
+ tr:nth-child(even):hover td { background: #f5f5f5; }
471
+ </style>
472
+ </head>
473
+ <body>
474
+ <div class="header">
475
+ <div>
476
+ <h1>${escapeHtml(title)}</h1>
477
+ <div class="meta">${nonEmptyRows.length} rows · ${headerRow.length} columns</div>
478
+ </div>
479
+ <a class="download" href="${escapeHtml(downloadUrl)}" download="${escapeHtml(downloadName)}">⬇ Download CSV</a>
480
+ </div>
481
+ <div class="table-wrap">
482
+ <table>
483
+ <thead><tr>${headerCells}</tr></thead>
484
+ <tbody>
485
+ ${bodyRows}
486
+ </tbody>
487
+ </table>
488
+ </div>
489
+ </body>
490
+ </html>`;
491
+ }
492
+ /**
493
+ * Store a file from disk in the serve directory and return its HTTPS download URL.
494
+ * Unlike SQLite-based storage, writes directly to `.line-hive-tmp/` for zero-copy serving.
282
495
  * Images are detected and returned as { url, isImage: true } so the caller
283
496
  * can send them as LINE ImageMessage for inline display.
284
497
  * Non-image files get a download link the caller sends as text.
498
+ *
499
+ * Files are tracked with a TTL for automatic cleanup.
285
500
  */
286
- export function storeAndBuildFileUrl(filePath, config, messageStore) {
501
+ export function storeAndBuildFileUrl(filePath, config, messageStore, ttlMs = DEFAULT_FILE_TTL_MS) {
287
502
  if (!config.ngrokDomain) {
288
503
  return { error: "file_send_requires_tunnel" };
289
504
  }
290
505
  const resolved = path.resolve(filePath);
506
+ const pathErr = assertWithinWorkspace(resolved, "filePath");
507
+ if (pathErr)
508
+ return { error: pathErr };
291
509
  if (!fs.existsSync(resolved)) {
292
510
  return { error: "file_not_found" };
293
511
  }
@@ -308,8 +526,39 @@ export function storeAndBuildFileUrl(filePath, config, messageStore) {
308
526
  const fileName = path.basename(filePath);
309
527
  const fileId = randomUUID();
310
528
  const ext = path.extname(filePath) || "";
311
- messageStore.storeOutgoingImage(fileId, fileBuffer, mimeType);
312
- const url = `https://${config.ngrokDomain}/files/${fileId}${ext}`;
313
- return { url, mimeType, isImage: mimeType.startsWith("image/"), fileName };
529
+ const filename = `${fileId}${ext}`;
530
+ // Write to disk instead of SQLite
531
+ const serveDir = path.resolve(".line-hive-tmp");
532
+ fs.mkdirSync(serveDir, { recursive: true });
533
+ // For CSV files: add UTF-8 BOM for Excel compatibility
534
+ const isCsv = ext.toLowerCase() === ".csv";
535
+ const outputBuffer = isCsv && !fileBuffer.subarray(0, 3).equals(UTF8_BOM)
536
+ ? Buffer.concat([UTF8_BOM, fileBuffer])
537
+ : fileBuffer;
538
+ fs.writeFileSync(path.join(serveDir, filename), outputBuffer);
539
+ messageStore.trackServedFile(filename, ttlMs);
540
+ const url = `https://${config.ngrokDomain}/files/${filename}`;
541
+ const result = {
542
+ url, mimeType, isImage: mimeType.startsWith("image/"), fileName, expiresIn: formatTtl(ttlMs),
543
+ };
544
+ // For CSV files: generate an HTML table preview with download link
545
+ if (isCsv) {
546
+ try {
547
+ const csvText = fileBuffer.toString("utf-8");
548
+ const rows = parseCsv(csvText);
549
+ if (rows.length > 0) {
550
+ const title = fileName.replace(/\.csv$/i, "");
551
+ const html = csvToHtml(rows, title, url, fileName);
552
+ const htmlFilename = `${fileId}.html`;
553
+ fs.writeFileSync(path.join(serveDir, htmlFilename), html, "utf-8");
554
+ messageStore.trackServedFile(htmlFilename, ttlMs);
555
+ result.previewUrl = `https://${config.ngrokDomain}/files/${htmlFilename}`;
556
+ }
557
+ }
558
+ catch {
559
+ // CSV parsing failed — fall through to raw file link
560
+ }
561
+ }
562
+ return result;
314
563
  }
315
564
  //# sourceMappingURL=toolHelpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"toolHelpers.js","sourceRoot":"","sources":["../../src/util/toolHelpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"toolHelpers.js","sourceRoot":"","sources":["../../src/util/toolHelpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAIpC,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAsB,MAAM,iBAAiB,CAAC;AACjJ,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,YAAoB,EAAE,KAAa;IACvE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5E,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QACjF,OAAO,GAAG,KAAK,kCAAkC,SAAS,IAAI,CAAC;IACjE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAmBD;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAkB;IAChD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,oEAAoE;YACpE,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;gBACtC,OAAO,CAAC,KAAK,CAAC,oCAAoC,QAAQ,GAAG,EAAE,GAAG,CAAC,CAAC;YACtE,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gFAAgF;AAChF,MAAM,kBAAkB,GAAG,CAAC,OAAO,CAAC,CAAC;AACrC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,kBAAkB;IAClB,iBAAiB;IACjB,wBAAwB;IACxB,wBAAwB;IACxB,oBAAoB;IACpB,kBAAkB;IAClB,iBAAiB;IACjB,qBAAqB;IACrB,qBAAqB;IACrB,uBAAuB;CACxB,CAAC,CAAC;AAEH,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAClE,OAAO,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,uDAAuD;AACvD,MAAM,qBAAqB,GAAG,EAAE,GAAG,IAAI,CAAC;AAExC;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE,SAAkB;IACxE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAgB,CAAC;QACnD,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QAErE,8EAA8E;QAC9E,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,8DAA8D;YAC9D,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;gBACtC,IAAI,CAAC,MAAM;oBAAE,OAAO,EAAE,CAAC;gBACvB,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YACxF,CAAC;YACD,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,MAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,6DAA6D;QAC7D,IAAI,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAC;YACxB,IAAI,OAAO,CAAC,MAAM,IAAI,qBAAqB,EAAE,CAAC;gBAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACvC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ;oBAC3B,CAAC,CAAC,YAAY,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI;oBACvE,CAAC,CAAC,EAAE,CAAC;gBACP,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;YACjD,CAAC;YACD,4DAA4D;YAC5D,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,MAAM,IAAI,GAA4B;oBACpC,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,SAAS;oBACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,IAAI,EAAE,sCAAsC;iBAC7C,CAAC;gBACF,IAAI,KAAK,CAAC,QAAQ;oBAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;gBACnD,IAAI,KAAK,CAAC,QAAQ;oBAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;gBACnD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxD,CAAC;YACD,+CAA+C;YAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;YACvE,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ;gBAC3B,CAAC,CAAC,YAAY,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,kBAAkB,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI;gBACnF,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,mEAAmE;QACnE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,IAAI,GAA4B;gBACpC,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,IAAI,EAAE,sCAAsC;aAC7C,CAAC;YACF,IAAI,KAAK,CAAC,QAAQ;gBAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YACnD,IAAI,KAAK,CAAC,QAAQ;gBAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YACnD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,2DAA2D;QAC3D,MAAM,IAAI,GAA4B;YACpC,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC;QACF,IAAI,KAAK,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QACnD,IAAI,KAAK,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QACnD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,UAAU,CAAC,IAA6B;IACtD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AACrE,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,SAAS,CACvB,KAAa,EACb,KAA+B;IAE/B,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;QACtF,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAWD;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAA6B,EAC7B,MAAqB,EACrB,YAA0B,EAC1B,WAAyB;IAEzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAA0B,CAAC;IAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,SAAS,CAAC,cAAc,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,GAAG,oBAAoB,EAAE,CAAC;QACvC,OAAO,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,gBAAgB,EAAE,CAAC;IAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7E,MAAM,OAAO,GAAG,WAAW,EAAE,mBAAmB,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;IAEpE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAC9C,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,iBAAiB,CAAC,MAAoC;IACpE,OAAO,SAAS,IAAI,MAAM,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,WAAwB,EACxB,SAAwB;IAExB,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,aAAa,GAAG,WAAW,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,SAAS,CAAC,kBAAkB,EAAE;QACnC,OAAO,EAAE,eAAe,SAAS,qEAAqE;KACvG,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAE/E,+EAA+E;AAC/E,MAAM,UAAU,YAAY,CAAC,KAAc,EAAE,UAAkB;IAC7D,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;IAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,+EAA+E;AAE/E,oFAAoF;AACpF,MAAM,UAAU,UAAU,CAAC,UAAmB;IAC5C,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,IAAI,CAAC;QAAE,OAAO,mBAAmB,CAAC;IAClF,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;AACvC,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,SAAS,CAAC,EAAU;IAClC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;IAC5C,IAAI,YAAY,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;IAClC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,GAAG,OAAO,GAAG,CAAC;IACtC,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IACtC,OAAO,GAAG,KAAK,KAAK,OAAO,GAAG,CAAC;AACjC,CAAC;AAED,+EAA+E;AAE/E,sEAAsE;AACtE,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAExC,gDAAgD;AAChD,SAAS,iBAAiB,CAAC,QAAgB;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,MAAM,GAAG,GAA2B;QAClC,SAAS;QACT,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,YAAY;QACrB,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,YAAY;QACrB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,YAAY;QACrB,MAAM,EAAE,YAAY;QACpB,YAAY;QACZ,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,oBAAoB;QAC5B,OAAO,EAAE,yEAAyE;QAClF,MAAM,EAAE,0BAA0B;QAClC,OAAO,EAAE,mEAAmE;QAC5E,MAAM,EAAE,+BAA+B;QACvC,OAAO,EAAE,2EAA2E;QACpF,OAAO;QACP,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,kBAAkB;QAC3B,MAAM,EAAE,iBAAiB;QACzB,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,eAAe;QACtB,OAAO,EAAE,oBAAoB;QAC7B,MAAM,EAAE,oBAAoB;QAC5B,MAAM,EAAE,YAAY;QACpB,KAAK,EAAE,kBAAkB;QACzB,MAAM,EAAE,iBAAiB;QACzB,WAAW;QACX,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,mBAAmB;QAC3B,KAAK,EAAE,kBAAkB;KAC1B,CAAC;IACF,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;AAChD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAA6B,EAC7B,MAAqB,EACrB,YAA0B,EAC1B,QAAgB,mBAAmB;IAEnC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAmC,CAAC;IAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,WAAiC,CAAC;IAE3D,IAAI,CAAC,aAAa,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAEjE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;IACjD,CAAC;IAED,IAAI,WAAmB,CAAC;IAExB,IAAI,aAAa,EAAE,CAAC;QAClB,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,qBAAqB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QACjE,IAAI,OAAO;YAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC;YACH,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,6BAA6B;QAC7B,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,WAAY,EAAE,QAAQ,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,IAAI,QAAQ,GAAI,IAAI,CAAC,aAAwB;QAC3C,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAEnE,mEAAmE;IACnE,8DAA8D;IAC9D,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;IACxC,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IAClC,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;QACxC,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IACtC,CAAC;IAED,6DAA6D;IAC7D,MAAM,GAAG,GAAG,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM;QAC5C,CAAC,CAAC,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM;YACnC,CAAC,CAAC,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM;gBACnC,CAAC,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,OAAO;oBACrC,CAAC,CAAC,MAAM,CAAC;IAEX,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,GAAG,OAAO,GAAG,GAAG,EAAE,CAAC;IAEpC,kCAAkC;IAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAChD,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAC;IAC7D,YAAY,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAE9C,MAAM,GAAG,GAAG,WAAW,MAAM,CAAC,WAAW,UAAU,QAAQ,EAAE,CAAC;IAC9D,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED,+EAA+E;AAE/E,kDAAkD;AAClD,MAAM,aAAa,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvC,6EAA6E;AAC7E,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAEjD;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,IAAI,GAAG,GAAa,EAAE,CAAC;IACvB,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEnB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBACf,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBAC/C,gBAAgB;oBAChB,IAAI,IAAI,GAAG,CAAC;oBACZ,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;qBAAM,CAAC;oBACN,sBAAsB;oBACtB,QAAQ,GAAG,KAAK,CAAC;oBACjB,CAAC,EAAE,CAAC;gBACN,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAI,EAAE,CAAC;gBACX,CAAC,EAAE,CAAC;YACN,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpC,wBAAwB;gBACxB,QAAQ,GAAG,IAAI,CAAC;gBAChB,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBACtB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACf,IAAI,GAAG,EAAE,CAAC;gBACV,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBACvB,0BAA0B;gBAC1B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACf,IAAI,GAAG,EAAE,CAAC;gBACV,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACf,GAAG,GAAG,EAAE,CAAC;gBACT,CAAC,EAAE,CAAC;gBACJ,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;oBAAE,CAAC,EAAE,CAAC;YAC/C,CAAC;iBAAM,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBACvB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACf,IAAI,GAAG,EAAE,CAAC;gBACV,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACf,GAAG,GAAG,EAAE,CAAC;gBACT,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAI,EAAE,CAAC;gBACX,CAAC,EAAE,CAAC;YACN,CAAC;QACH,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uCAAuC;AACvC,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAgB,EAAE,KAAa,EAAE,WAAmB,EAAE,YAAoB;IAClG,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,4CAA4C,CAAC;IAE3E,MAAM,CAAC,SAAS,EAAE,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC;IAEtC,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAE5E,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,YAAY;SAC1B,GAAG,CAAC,GAAG,CAAC,EAAE;QACT,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjE,OAAO,aAAa,KAAK,OAAO,CAAC;IACnC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;;;;SAKA,UAAU,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;YAqBd,UAAU,CAAC,KAAK,CAAC;0BACH,YAAY,CAAC,MAAM,WAAW,SAAS,CAAC,MAAM;;gCAExC,UAAU,CAAC,WAAW,CAAC,eAAe,UAAU,CAAC,YAAY,CAAC;;;;mBAI3E,WAAW;;EAE5B,QAAQ;;;;;QAKF,CAAC;AACT,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,MAAqB,EACrB,YAA0B,EAC1B,QAAgB,mBAAmB;IAEnC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,qBAAqB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC5D,IAAI,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IACrC,CAAC;IAED,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IACtC,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IACjC,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;QACtC,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,GAAG,MAAM,GAAG,GAAG,EAAE,CAAC;IAEnC,kCAAkC;IAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAChD,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,uDAAuD;IACvD,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;IAC3C,MAAM,YAAY,GAAG,KAAK,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QACvE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACvC,CAAC,CAAC,UAAU,CAAC;IACf,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC;IAC9D,YAAY,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAE9C,MAAM,GAAG,GAAG,WAAW,MAAM,CAAC,WAAW,UAAU,QAAQ,EAAE,CAAC;IAC9D,MAAM,MAAM,GAAkH;QAC5H,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC;KAC7F,CAAC;IAEF,mEAAmE;IACnE,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBAC9C,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;gBACnD,MAAM,YAAY,GAAG,GAAG,MAAM,OAAO,CAAC;gBACtC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;gBACnE,YAAY,CAAC,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;gBAClD,MAAM,CAAC,UAAU,GAAG,WAAW,MAAM,CAAC,WAAW,UAAU,YAAY,EAAE,CAAC;YAC5E,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qDAAqD;QACvD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zoulabo/line-hive",
3
- "version": "0.1.19",
3
+ "version": "0.1.21",
4
4
  "description": "MCP server connecting AI coding agents to LINE Messaging API. Monitor agent progress, provide input, and get notifications from your phone.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -39,7 +39,7 @@
39
39
  "README.md"
40
40
  ],
41
41
  "scripts": {
42
- "build": "tsc -p tsconfig.json 2>&1 | (grep -v pdfjs-dist || true); test -f dist/index.js",
42
+ "build": "tsc -p tsconfig.json",
43
43
  "watch": "tsc --watch -p tsconfig.json",
44
44
  "start": "node dist/index.js",
45
45
  "test": "vitest run",
@@ -42,18 +42,44 @@ When a LINE session is activated by the user, run a pre-flight approval sequence
42
42
 
43
43
  **CRITICAL:** "done", "ok", "thanks", "got it" are conversational replies, NOT deactivation signals. Always call `line_ask` again after processing any reply.
44
44
 
45
- ### Mermaid Diagrams
45
+ ### Active Session Rules
46
46
 
47
- Send files/images via `filePath`/`imageFilePath` params on `line_ask`. Use `.line-hive-tmp/` for temp files.
47
+ 1. **Use `line_ask` for all communication.** Always pass `agentName`. After receiving a reply, always call `line_ask` again — keep the loop going until timeout or deactivation.
48
+ 2. **Use `line_set_status` for progress updates** between `line_ask` calls. Include percent complete (e.g. "30%"), update every ~10% progress. Every call may return a `pendingReply` — always check and act on it.
49
+ 3. **Keep messages short** — 1-3 sentences. No filler ("Processing...", "Still here...").
50
+ 4. **On timeout**, stop the loop. The user's next message creates a `pendingReply` on your next `line_set_status`, re-activating the session.
48
51
 
52
+ ### Rich Content via HTML
53
+
54
+ Use `line_render_markdown` for all rich content — diagrams, reports, diffs, code, math. It auto-injects CDN libraries for Mermaid diagrams, syntax highlighting (highlight.js), and math (KaTeX). Files are served with TTL (default 2h, max 24h).
55
+
56
+ **Diagrams** — write mermaid in markdown, render to HTML (no `mmdc` needed). Use `flowchart LR` with `direction TB` inside subgraphs (or vice versa) — never make everything the same direction. Separate logical sections into individual diagrams rather than one giant chart:
57
+ ```bash
58
+ create_file(".line-hive-tmp/diagram.md", "# Architecture\n\n```mermaid\nflowchart LR\n subgraph Flow[\"Flow\"]\n direction TB\n A-->B-->C\n end\n```")
59
+ line_render_markdown({ inputPath: ".line-hive-tmp/diagram.md", outputPath: ".line-hive-tmp/diagram.html", title: "Architecture", ttl: 30 })
60
+ line_ask({ text: "Architecture diagram:", filePath: ".line-hive-tmp/diagram.html", agentName: "<name>" })
61
+ ```
62
+
63
+ **Long reports / docs** — when content exceeds LINE's ~2000 char limit:
64
+ ```bash
65
+ line_render_markdown({ inputPath: "path/to/report.md", outputPath: ".line-hive-tmp/report.html", title: "Report" })
66
+ line_ask({ text: "Here's the full report:", filePath: ".line-hive-tmp/report.html", agentName: "<name>" })
67
+ ```
68
+
69
+ **Diffs** — format as markdown code blocks with `diff` language:
70
+ ```bash
71
+ create_file(".line-hive-tmp/changes.md", "# Changes\n\n```diff\n- old line\n+ new line\n```")
72
+ line_render_markdown({ inputPath: ".line-hive-tmp/changes.md", outputPath: ".line-hive-tmp/changes.html", title: "Diff" })
73
+ line_ask({ text: "Here are the changes:", filePath: ".line-hive-tmp/changes.html", agentName: "<name>" })
74
+ ```
75
+
76
+ **Existing .md files** — skills, READMEs, docs:
49
77
  ```bash
50
- # Write, render, send
51
- create_file(".line-hive-tmp/diagram.mmd", "<mermaid source>")
52
- mmdc -i .line-hive-tmp/diagram.mmd -o .line-hive-tmp/diagram.png -b white -s 4
53
- line_ask({ text: "Description", imageFilePath: ".line-hive-tmp/diagram.png", agentName: "<name>" })
78
+ line_render_markdown({ inputPath: "path/to/file.md", outputPath: ".line-hive-tmp/doc.html", title: "Title" })
79
+ line_ask({ text: "Here's the doc:", filePath: ".line-hive-tmp/doc.html", agentName: "<name>" })
54
80
  ```
55
81
 
56
- Use the globally installed `mmdc` directly `npx` may trigger interactive prompts that block the terminal.
82
+ Send raw images via `imageFilePath` param on `line_ask` when visual content is needed (screenshots, generated images).
57
83
 
58
84
  ## Interactive Mode (ON DEMAND)
59
85
 
@@ -68,9 +94,10 @@ Off by default. Activate only when user explicitly requests confirmations (e.g.,
68
94
  - **Pass LINE tools to subagents** — only the top-level agent calls `line_*` tools
69
95
  - **Install packages during a session** — user can't approve prompts while away. Install during pre-flight instead.
70
96
  - **Fetch external URLs during a session** — may trigger permission prompts. Only fetch when user confirms no permission issue.
97
+ - **Write temp files outside the project** — use `.line-hive-tmp/` (gitignored) for all temp files. Paths outside the workspace may trigger permission prompts.
71
98
 
72
- ### macOS Screen Lock Warning
99
+ ### Screen Lock Warning
73
100
 
74
- Screen lock re-locks the keychain, causing **SSH passphrase prompts** that block any terminal using SSH (`git push/pull`). Mitigate:
101
+ Screen lock may re-lock the keychain or credential store, causing **SSH passphrase prompts** that block any terminal using SSH (`git push/pull`). Mitigate:
75
102
  - Run git remote operations **before** the user leaves (during pre-flight)
76
103
  - If a terminal hangs, it's likely a passphrase prompt — don't spawn more terminals