@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.
- package/README.md +8 -6
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -1
- package/dist/index.js +33 -3
- package/dist/index.js.map +1 -1
- package/dist/line/webhook.js +146 -41
- package/dist/line/webhook.js.map +1 -1
- package/dist/server.js +7 -5
- package/dist/server.js.map +1 -1
- package/dist/store/messageStore.js +112 -22
- package/dist/store/messageStore.js.map +1 -1
- package/dist/tools/ask.js +20 -4
- package/dist/tools/ask.js.map +1 -1
- package/dist/tools/readFile.js +18 -6
- package/dist/tools/readFile.js.map +1 -1
- package/dist/tools/renderMarkdown.js +120 -9
- package/dist/tools/renderMarkdown.js.map +1 -1
- package/dist/tools/sendMessage.js +12 -4
- package/dist/tools/sendMessage.js.map +1 -1
- package/dist/util/toolHelpers.js +267 -18
- package/dist/util/toolHelpers.js.map +1 -1
- package/package.json +2 -2
- package/templates/line-notification.instructions.md +36 -9
package/dist/util/toolHelpers.js
CHANGED
|
@@ -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 =
|
|
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
|
|
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 /
|
|
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
|
|
274
|
-
|
|
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
|
-
*
|
|
281
|
-
*
|
|
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, "&")
|
|
430
|
+
.replace(/</g, "<")
|
|
431
|
+
.replace(/>/g, ">")
|
|
432
|
+
.replace(/"/g, """);
|
|
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
|
-
|
|
312
|
-
|
|
313
|
-
|
|
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":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zoulabo/line-hive",
|
|
3
|
-
"version": "0.1.
|
|
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
|
|
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
|
-
###
|
|
45
|
+
### Active Session Rules
|
|
46
46
|
|
|
47
|
-
|
|
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
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
99
|
+
### Screen Lock Warning
|
|
73
100
|
|
|
74
|
-
Screen lock re-
|
|
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
|