@zoulabo/line-hive 0.1.21 → 0.1.23

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 (45) hide show
  1. package/README.md +51 -7
  2. package/dist/cli/config-writer.js +1 -1
  3. package/dist/cli/config-writer.js.map +1 -1
  4. package/dist/config.js +4 -1
  5. package/dist/config.js.map +1 -1
  6. package/dist/constants.js +2 -0
  7. package/dist/constants.js.map +1 -1
  8. package/dist/i18n.js +3 -1
  9. package/dist/i18n.js.map +1 -1
  10. package/dist/index.js +29 -3
  11. package/dist/index.js.map +1 -1
  12. package/dist/line/messages.js +141 -2
  13. package/dist/line/messages.js.map +1 -1
  14. package/dist/line/webhook.js +163 -28
  15. package/dist/line/webhook.js.map +1 -1
  16. package/dist/server.js +40 -15
  17. package/dist/server.js.map +1 -1
  18. package/dist/store/messageStore.js +16 -36
  19. package/dist/store/messageStore.js.map +1 -1
  20. package/dist/tools/ask.js +85 -55
  21. package/dist/tools/ask.js.map +1 -1
  22. package/dist/tools/createDocx.js +459 -0
  23. package/dist/tools/createDocx.js.map +1 -0
  24. package/dist/tools/createPptx.js +554 -0
  25. package/dist/tools/createPptx.js.map +1 -0
  26. package/dist/tools/createXlsx.js +360 -0
  27. package/dist/tools/createXlsx.js.map +1 -0
  28. package/dist/tools/gitReview-template.js +208 -0
  29. package/dist/tools/gitReview-template.js.map +1 -0
  30. package/dist/tools/gitReview.js +232 -0
  31. package/dist/tools/gitReview.js.map +1 -0
  32. package/dist/tools/readFile.js +6 -25
  33. package/dist/tools/readFile.js.map +1 -1
  34. package/dist/tools/renderMarkdown.js +159 -31
  35. package/dist/tools/renderMarkdown.js.map +1 -1
  36. package/dist/tools/sendMessage.js +9 -3
  37. package/dist/tools/sendMessage.js.map +1 -1
  38. package/dist/tools/setStatus.js +4 -2
  39. package/dist/tools/setStatus.js.map +1 -1
  40. package/dist/tunnel.js +1 -17
  41. package/dist/tunnel.js.map +1 -1
  42. package/dist/util/toolHelpers.js +232 -38
  43. package/dist/util/toolHelpers.js.map +1 -1
  44. package/package.json +7 -1
  45. package/templates/line-notification.instructions.md +114 -14
@@ -0,0 +1,232 @@
1
+ /**
2
+ * line_git_review — Run git status/diff and generate review HTML.
3
+ *
4
+ * Two modes:
5
+ * scan — run git commands, return structured JSON data
6
+ * report — generate full HTML with slot content, serve via ngrok
7
+ *
8
+ * This eliminates the need for terminal access during LINE sessions.
9
+ * The agent calls scan → analyzes data → calls report with slot HTML → sends URL.
10
+ */
11
+ import { execFileSync } from "child_process";
12
+ import fs from "fs";
13
+ import path from "path";
14
+ import { randomUUID } from "crypto";
15
+ import { toolResult, toolError, getServeDir } from "../util/toolHelpers.js";
16
+ import { clampTtlMs, formatTtl } from "../util/toolHelpers.js";
17
+ import { buildReviewPage } from "./gitReview-template.js";
18
+ // ─── Git helpers ─────────────────────────────────────────────────────────────
19
+ /** Run a git command safely and return stdout, or empty string on error */
20
+ function git(args, cwd) {
21
+ try {
22
+ return execFileSync("git", args, {
23
+ cwd: cwd || process.cwd(),
24
+ encoding: "utf-8",
25
+ timeout: 15000,
26
+ maxBuffer: 10 * 1024 * 1024,
27
+ }).trimEnd();
28
+ }
29
+ catch {
30
+ return "";
31
+ }
32
+ }
33
+ /** Parse `git status --porcelain` output into file info */
34
+ function parseStatus() {
35
+ const output = git(["status", "--porcelain"]);
36
+ if (!output)
37
+ return [];
38
+ const files = [];
39
+ for (const line of output.split("\n")) {
40
+ if (!line || line.length < 4)
41
+ continue;
42
+ const statusCode = line.substring(0, 2);
43
+ const filePath = line.substring(3);
44
+ let status;
45
+ switch (statusCode.trim()) {
46
+ case "??":
47
+ status = "untracked";
48
+ break;
49
+ case "A":
50
+ status = "added";
51
+ break;
52
+ case "D":
53
+ status = "deleted";
54
+ break;
55
+ case "M":
56
+ case "MM":
57
+ status = "staged";
58
+ break;
59
+ default:
60
+ if (statusCode[1] === "M")
61
+ status = "modified";
62
+ else if (statusCode[1] === "D")
63
+ status = "deleted";
64
+ else if (statusCode[0] === "M")
65
+ status = "staged";
66
+ else if (statusCode[0] === "A")
67
+ status = "added";
68
+ else if (statusCode[0] === "D")
69
+ status = "deleted";
70
+ else
71
+ status = "modified";
72
+ }
73
+ // Get per-file stats
74
+ let additions = 0, deletions = 0;
75
+ if (status !== "untracked") {
76
+ const numstat = git(["diff", "--numstat", "--", filePath]);
77
+ if (numstat) {
78
+ const parts = numstat.split("\t");
79
+ additions = parts[0] === "-" ? 0 : parseInt(parts[0], 10) || 0;
80
+ deletions = parts[1] === "-" ? 0 : parseInt(parts[1], 10) || 0;
81
+ }
82
+ }
83
+ files.push({
84
+ path: filePath,
85
+ status,
86
+ dir: path.dirname(filePath),
87
+ additions,
88
+ deletions,
89
+ });
90
+ }
91
+ return files;
92
+ }
93
+ /** Get diff output for a single file */
94
+ function getFileDiff(filePath, staged) {
95
+ const args = staged
96
+ ? ["diff", "--cached", "--", filePath]
97
+ : ["diff", "--", filePath];
98
+ return git(args);
99
+ }
100
+ /** Collect all diffs */
101
+ function collectDiffs() {
102
+ const diffs = [];
103
+ // Unstaged diffs
104
+ const unstagedFiles = git(["diff", "--name-only"]);
105
+ if (unstagedFiles) {
106
+ for (const f of unstagedFiles.split("\n")) {
107
+ if (!f)
108
+ continue;
109
+ const diff = getFileDiff(f, false);
110
+ if (diff)
111
+ diffs.push({ path: f, diff, staged: false });
112
+ }
113
+ }
114
+ // Staged diffs
115
+ const stagedFiles = git(["diff", "--cached", "--name-only"]);
116
+ if (stagedFiles) {
117
+ for (const f of stagedFiles.split("\n")) {
118
+ if (!f)
119
+ continue;
120
+ const diff = getFileDiff(f, true);
121
+ if (diff)
122
+ diffs.push({ path: f, diff, staged: true });
123
+ }
124
+ }
125
+ return diffs;
126
+ }
127
+ // ─── Scan mode ───────────────────────────────────────────────────────────────
128
+ function handleScan() {
129
+ const branch = git(["branch", "--show-current"]) || "detached";
130
+ const commitHash = git(["log", "--format=%h", "-1"]) || "none";
131
+ const files = parseStatus();
132
+ const modified = files.filter(f => f.status === "modified" || f.status === "staged").length;
133
+ const staged = files.filter(f => f.status === "staged" || f.status === "added").length;
134
+ const untracked = files.filter(f => f.status === "untracked").length;
135
+ const additions = files.reduce((sum, f) => sum + f.additions, 0);
136
+ const deletions = files.reduce((sum, f) => sum + f.deletions, 0);
137
+ // Build compact JSON for agent consumption
138
+ const data = {
139
+ branch,
140
+ commit: commitHash,
141
+ totals: { mod: modified, staged, untracked, add: additions, del: deletions },
142
+ files: files.map(f => ({
143
+ p: f.path,
144
+ s: f.status,
145
+ d: f.dir,
146
+ "+": f.additions,
147
+ "-": f.deletions,
148
+ })),
149
+ };
150
+ return toolResult({
151
+ mode: "scan",
152
+ summary: `${branch}@${commitHash} | ${files.length} files +${additions} -${deletions}`,
153
+ data,
154
+ });
155
+ }
156
+ // ─── Report mode ─────────────────────────────────────────────────────────────
157
+ function handleReport(config, messageStore, args) {
158
+ const decisions = typeof args.decisions === "string" ? args.decisions : undefined;
159
+ const commits = typeof args.commits === "string" ? args.commits : undefined;
160
+ const groups = typeof args.groups === "string" ? args.groups : undefined;
161
+ const ttlMs = clampTtlMs(args.ttl);
162
+ // Gather git data
163
+ const branch = git(["branch", "--show-current"]) || "detached";
164
+ const commitHash = git(["log", "--format=%h", "-1"]) || "none";
165
+ const files = parseStatus();
166
+ const diffs = collectDiffs();
167
+ const modified = files.filter(f => f.status === "modified" || f.status === "staged").length;
168
+ const staged = files.filter(f => f.status === "staged" || f.status === "added").length;
169
+ const untracked = files.filter(f => f.status === "untracked").length;
170
+ const additions = files.reduce((sum, f) => sum + f.additions, 0);
171
+ const deletions = files.reduce((sum, f) => sum + f.deletions, 0);
172
+ const summary = {
173
+ branch,
174
+ commit: commitHash,
175
+ modified,
176
+ staged,
177
+ untracked,
178
+ additions,
179
+ deletions,
180
+ total: files.length,
181
+ };
182
+ const html = buildReviewPage(summary, files, diffs, { decisions, commits, groups });
183
+ // Serve via ngrok if available
184
+ if (config.ngrokDomain) {
185
+ const fileId = randomUUID();
186
+ const filename = `${fileId}.html`;
187
+ const serveDir = getServeDir(config);
188
+ fs.mkdirSync(serveDir, { recursive: true, mode: 0o700 });
189
+ fs.writeFileSync(path.join(serveDir, filename), html, { mode: 0o600 });
190
+ messageStore.trackServedFile(filename, ttlMs);
191
+ const url = `https://${config.ngrokDomain}/files/${filename}`;
192
+ return toolResult({
193
+ mode: "report",
194
+ url,
195
+ expiresIn: formatTtl(ttlMs),
196
+ summary: `${branch}@${commitHash} | ${files.length} files +${additions} -${deletions}`,
197
+ });
198
+ }
199
+ // No ngrok — write to local file
200
+ const outputPath = ".line-hive-tmp/git-review.html";
201
+ fs.mkdirSync(path.dirname(outputPath), { recursive: true });
202
+ fs.writeFileSync(outputPath, html, "utf-8");
203
+ return toolResult({
204
+ mode: "report",
205
+ filePath: outputPath,
206
+ summary: `${branch}@${commitHash} | ${files.length} files +${additions} -${deletions}`,
207
+ note: "No ngrok tunnel — file written locally. Send via file: prefix in line_ask.",
208
+ });
209
+ }
210
+ // ─── Handler ─────────────────────────────────────────────────────────────────
211
+ export async function handleGitReview({ config, messageStore, args }) {
212
+ // Check git is available
213
+ const gitVersion = git(["--version"]);
214
+ if (!gitVersion) {
215
+ return toolError("git_not_available", { message: "git command not found or not in PATH." });
216
+ }
217
+ // Check we're in a git repository
218
+ const gitRoot = git(["rev-parse", "--show-toplevel"]);
219
+ if (!gitRoot) {
220
+ return toolError("not_a_git_repo", { message: "Current directory is not a git repository." });
221
+ }
222
+ const mode = typeof args.mode === "string" ? args.mode : "scan";
223
+ switch (mode) {
224
+ case "scan":
225
+ return handleScan();
226
+ case "report":
227
+ return handleReport(config, messageStore, args);
228
+ default:
229
+ return toolError("invalid_mode", { message: `Mode must be "scan" or "report". Got "${mode}".` });
230
+ }
231
+ }
232
+ //# sourceMappingURL=gitReview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitReview.js","sourceRoot":"","sources":["../../src/tools/gitReview.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { toolResult, toolError, readMediaBuffer } from "../util/toolHelpers.js";
1
+ import { toolResult, toolError, readMediaBuffer, assertWithinWorkspace, isTextMimeType } from "../util/toolHelpers.js";
2
2
  import { logger as defaultLogger } from "../logger.js";
3
3
  import fs from "fs";
4
4
  import path from "path";
@@ -25,25 +25,6 @@ const MAX_TEXT_CHARS = 200000;
25
25
  const MAX_IMAGE_PX = 4096;
26
26
  /** Minimum image dimension (pixels). */
27
27
  const MIN_IMAGE_PX = 64;
28
- /** MIME types treated as text (decoded as UTF-8) */
29
- const TEXT_MIME_PREFIXES = ["text/"];
30
- const TEXT_MIME_EXACT = new Set([
31
- "application/json",
32
- "application/xml",
33
- "application/javascript",
34
- "application/typescript",
35
- "application/x-yaml",
36
- "application/x-sh",
37
- "application/sql",
38
- "application/graphql",
39
- "application/ld+json",
40
- "application/xhtml+xml",
41
- ]);
42
- function isTextMime(mime) {
43
- if (TEXT_MIME_PREFIXES.some(p => mime.startsWith(p)))
44
- return true;
45
- return TEXT_MIME_EXACT.has(mime);
46
- }
47
28
  /**
48
29
  * Extract text from a PDF using pdfjs-dist.
49
30
  * Returns per-page text or a single page if `page` is specified.
@@ -202,7 +183,7 @@ export async function handleReadFile({ messageStore, logger = defaultLogger, arg
202
183
  let media;
203
184
  try {
204
185
  media = JSON.parse(row.mediaJson);
205
- if ((!media.base64 && !media.diskPath) || !media.mimeType) {
186
+ if (!media.diskPath || !media.mimeType) {
206
187
  return toolError("invalid_media");
207
188
  }
208
189
  }
@@ -216,11 +197,11 @@ export async function handleReadFile({ messageStore, logger = defaultLogger, arg
216
197
  const rawOutputPath = typeof args.outputPath === "string" ? args.outputPath : undefined;
217
198
  let outputPath;
218
199
  if (rawOutputPath) {
219
- const workspace = process.env.WORKSPACE_PATH || process.cwd();
220
200
  const resolved = path.resolve(rawOutputPath);
221
- if (!resolved.startsWith(path.resolve(workspace) + path.sep) && resolved !== path.resolve(workspace)) {
201
+ const wsError = assertWithinWorkspace(resolved, "outputPath");
202
+ if (wsError) {
222
203
  return toolError("outputPath_outside_workspace", {
223
- message: `outputPath must be within the workspace (${workspace}).`,
204
+ message: wsError,
224
205
  });
225
206
  }
226
207
  outputPath = rawOutputPath;
@@ -406,7 +387,7 @@ export async function handleReadFile({ messageStore, logger = defaultLogger, arg
406
387
  return { content };
407
388
  }
408
389
  // ─── Text file ────────────────────────────────────────────────
409
- if (isTextMime(media.mimeType)) {
390
+ if (isTextMimeType(media.mimeType)) {
410
391
  const rawBuffer = readMediaBuffer(media);
411
392
  if (!rawBuffer)
412
393
  return toolError("file_read_failed", { message: "Could not read media from storage" });
@@ -1 +1 @@
1
- {"version":3,"file":"readFile.js","sourceRoot":"","sources":["../../src/tools/readFile.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"readFile.js","sourceRoot":"","sources":["../../src/tools/readFile.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,7 @@ import fs from "fs";
8
8
  import path from "path";
9
9
  import { randomUUID } from "crypto";
10
10
  import { marked } from "marked";
11
- import { toolResult, toolError, assertWithinWorkspace } from "../util/toolHelpers.js";
11
+ import { toolResult, toolError, assertWithinWorkspace, getServeDir } from "../util/toolHelpers.js";
12
12
  import { clampTtlMs, formatTtl } from "../util/toolHelpers.js";
13
13
  export async function handleRenderMarkdown({ config, messageStore, args }) {
14
14
  const markdown = args.markdown;
@@ -38,6 +38,34 @@ export async function handleRenderMarkdown({ config, messageStore, args }) {
38
38
  else {
39
39
  md = markdown;
40
40
  }
41
+ // Input size limit to prevent memory exhaustion (2MB for markdown rendering)
42
+ if (md.length > 2000000) {
43
+ return toolError("input_too_large", {
44
+ message: `Markdown input is ${(md.length / 1024).toFixed(0)}KB (limit: 2MB).`,
45
+ });
46
+ }
47
+ // ── Chart.js: extract ```chart blocks BEFORE markdown parsing ──
48
+ // Replace each ```chart block with a placeholder <div> that survives sanitization.
49
+ // Chart scripts are injected post-sanitization to avoid being stripped.
50
+ let chartCounter = 0;
51
+ const chartConfigs = [];
52
+ md = md.replace(/```chart\s*\n([\s\S]*?)```/g, (_match, jsonBlock) => {
53
+ chartCounter++;
54
+ const id = `chart-${chartCounter}`;
55
+ try {
56
+ // Validate JSON — if invalid, store error
57
+ JSON.parse(jsonBlock.trim());
58
+ chartConfigs.push({ id, json: jsonBlock.trim() });
59
+ // Placeholder div that marked will pass through and sanitizer won't strip
60
+ return `<div class="chart-container" data-chart-id="${id}"><canvas id="${id}"></canvas></div>`;
61
+ }
62
+ catch (err) {
63
+ const errMsg = err instanceof Error ? err.message : String(err);
64
+ chartConfigs.push({ id, json: "", error: errMsg });
65
+ return `<div class="chart-error">⚠️ Invalid chart config: ${escapeHtml(errMsg)}</div>`;
66
+ }
67
+ });
68
+ const hasChart = chartConfigs.some(c => !c.error);
41
69
  // Convert markdown to HTML
42
70
  const rawBodyHtml = await marked.parse(md);
43
71
  // Sanitize user-generated HTML: strip inline scripts and event handlers.
@@ -89,19 +117,41 @@ export async function handleRenderMarkdown({ config, messageStore, args }) {
89
117
  <script src="https://cdn.jsdelivr.net/npm/katex@0.16/dist/contrib/auto-render.min.js"></script>
90
118
  <script>renderMathInElement(document.body, {delimiters:[{left:'$$',right:'$$',display:true},{left:'$',right:'$',display:false}]});</script>`);
91
119
  }
120
+ // Chart.js — interactive charts from ```chart code blocks
121
+ if (hasChart) {
122
+ cdnScripts.push(`<script src="https://cdn.jsdelivr.net/npm/chart.js@4"></script>`);
123
+ // Initialize each valid chart
124
+ for (const chart of chartConfigs) {
125
+ if (chart.error)
126
+ continue;
127
+ cdnScripts.push(`<script>new Chart(document.getElementById('${chart.id}'), ${chart.json.replace(/<\//g, '<\\/')});</script>`);
128
+ }
129
+ }
92
130
  const bodyScripts = cdnScripts.length > 0 ? `\n${cdnScripts.join("\n")}` : "";
93
- // --- Diff-specific CSS (green/red line coloring for highlight.js diff output) ---
131
+ // --- Diff-specific CSS ---
94
132
  const diffCss = hasCode
95
133
  ? `
96
134
  .hljs-addition { background-color: #e6ffec; color: #24292f; }
97
135
  .hljs-deletion { background-color: #ffebe9; color: #24292f; }`
98
136
  : "";
137
+ // --- Chart container CSS ---
138
+ const hasChartError = chartConfigs.some(c => c.error);
139
+ const chartCss = hasChart || hasChartError
140
+ ? `
141
+ .chart-container { max-width: 100%; margin: 1em 0; }
142
+ .chart-error { color: red; border: 1px solid red; padding: 12px; border-radius: 6px; margin: 1em 0; }`
143
+ : "";
144
+ // --- Content Security Policy ---
145
+ const cspSources = ["'self'", "cdn.jsdelivr.net"];
146
+ const cspMeta = `<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src ${cspSources.join(" ")} 'unsafe-inline'; style-src ${cspSources.join(" ")} 'unsafe-inline'; img-src * data:; font-src ${cspSources.join(" ")}; connect-src 'none';">`;
99
147
  // Wrap in a full HTML document with sensible defaults
100
148
  const html = `<!DOCTYPE html>
101
149
  <html lang="en">
102
150
  <head>
103
151
  <meta charset="utf-8">
104
152
  <meta name="viewport" content="width=device-width, initial-scale=1">
153
+ <meta name="referrer" content="no-referrer">
154
+ ${cspMeta}
105
155
  <title>${escapeHtml(title)}</title>
106
156
  <style>
107
157
  body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; max-width: 800px; margin: 0 auto; padding: 20px; color: #333; }
@@ -116,13 +166,19 @@ export async function handleRenderMarkdown({ config, messageStore, args }) {
116
166
  img { max-width: 100%; }
117
167
  blockquote { border-left: 4px solid #ddd; margin: 0; padding: 0 1em; color: #666; }
118
168
  h1, h2, h3 { margin-top: 1.5em; }
119
- .mermaid { text-align: center; margin: 1em 0; }${diffCss}
169
+ .mermaid { text-align: center; margin: 1em 0; }${diffCss}${chartCss}
120
170
  </style>${cdnStylesHead}
121
171
  </head>
122
172
  <body>
123
173
  ${bodyHtml}${bodyScripts}
124
174
  </body>
125
175
  </html>`;
176
+ // Output size limit (5MB) — HTML can amplify significantly via CDN injection + chart scripts
177
+ if (html.length > 5000000) {
178
+ return toolError("output_too_large", {
179
+ message: `Rendered HTML is ${(html.length / 1024).toFixed(0)}KB (limit: 5MB). Reduce markdown input size.`,
180
+ });
181
+ }
126
182
  // Write to file if outputPath specified
127
183
  if (outputPath) {
128
184
  const resolvedOut = path.resolve(outputPath);
@@ -143,22 +199,12 @@ ${bodyHtml}${bodyScripts}
143
199
  // premature cleanup. UUID guarantees uniqueness.
144
200
  const fileId = randomUUID();
145
201
  const servedFilename = `${fileId}.html`;
146
- const servePath = path.resolve(".line-hive-tmp", servedFilename);
202
+ const servePath = path.join(getServeDir(config), servedFilename);
147
203
  try {
148
204
  fs.mkdirSync(path.dirname(servePath), { recursive: true });
149
- // If the file is already in .line-hive-tmp, create a hard link (same inode, no extra disk)
150
- // to avoid duplicating content. Fall back to copy if hard link fails (cross-device, etc.)
151
- if (resolvedOut.startsWith(path.resolve(".line-hive-tmp") + path.sep)) {
152
- try {
153
- fs.linkSync(resolvedOut, servePath);
154
- }
155
- catch {
156
- fs.copyFileSync(resolvedOut, servePath);
157
- }
158
- }
159
- else {
160
- fs.copyFileSync(resolvedOut, servePath);
161
- }
205
+ // Always copy hard links share the same inode, so overwrites to the
206
+ // original file silently mutate every hard-linked served copy.
207
+ fs.copyFileSync(resolvedOut, servePath);
162
208
  messageStore.trackServedFile(servedFilename, ttlMs);
163
209
  const url = `https://${config.ngrokDomain}/files/${servedFilename}`;
164
210
  return toolResult({ message: `HTML written to ${outputPath}`, url, expiresIn: formatTtl(ttlMs) });
@@ -180,20 +226,102 @@ function escapeHtml(text) {
180
226
  .replace(/>/g, "&gt;")
181
227
  .replace(/"/g, "&quot;");
182
228
  }
183
- /**
184
- * Strip potentially dangerous content from markdown-rendered HTML.
185
- * Removes: <script> tags, javascript: URLs, and on* event handlers.
186
- * Does NOT strip <style> (needed for our own injected CSS).
187
- */
229
+ // ─── Allowlist-based HTML sanitizer ─────────────────────────────────────────
230
+ // Instead of a deny-list (which is easily bypassed), we use an allowlist
231
+ // of safe tags and attributes. Everything else is stripped to prevent XSS.
232
+ /** Tags that are safe to keep in user-generated HTML */
233
+ const SAFE_TAGS = new Set([
234
+ // Block content
235
+ "p", "div", "span", "br", "hr",
236
+ "h1", "h2", "h3", "h4", "h5", "h6",
237
+ "ul", "ol", "li", "dl", "dt", "dd",
238
+ "blockquote", "pre", "code",
239
+ "table", "thead", "tbody", "tfoot", "tr", "th", "td", "caption", "colgroup", "col",
240
+ // Inline formatting
241
+ "strong", "b", "em", "i", "u", "s", "del", "ins", "mark", "sub", "sup", "small",
242
+ "a", "img",
243
+ // Details/Summary
244
+ "details", "summary",
245
+ // Definition lists, ruby, etc.
246
+ "abbr", "kbd", "var", "samp",
247
+ // Our chart containers (injected pre-sanitize)
248
+ "canvas",
249
+ ]);
250
+ /** Attributes allowed per tag. `"*"` key = allowed on all tags */
251
+ const SAFE_ATTRS = {
252
+ "*": new Set(["id", "class", "title", "lang", "dir", "data-chart-id"]),
253
+ a: new Set(["href", "target", "rel"]),
254
+ img: new Set(["src", "alt", "width", "height", "loading"]),
255
+ td: new Set(["colspan", "rowspan", "align"]),
256
+ th: new Set(["colspan", "rowspan", "align", "scope"]),
257
+ col: new Set(["span"]),
258
+ colgroup: new Set(["span"]),
259
+ ol: new Set(["start", "type"]),
260
+ code: new Set(["class"]), // language-* classes from marked
261
+ details: new Set(["open"]),
262
+ };
263
+ /** Protocols allowed in href/src attributes */
264
+ const SAFE_PROTOCOLS = new Set(["http:", "https:", "mailto:"]);
188
265
  function sanitizeHtml(html) {
189
- return html
190
- // Remove <script>...</script> blocks (incl. multiline)
191
- .replace(/<script\b[^>]*>[\s\S]*?<\/script>/gi, "")
192
- // Remove standalone <script ...> tags (self-closing or unclosed)
193
- .replace(/<script\b[^>]*\/?>/gi, "")
194
- // Remove on* event handlers from any tag (onclick, onerror, onload, etc.)
195
- .replace(/\s+on\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/gi, "")
196
- // Remove javascript: URLs in href/src attributes
197
- .replace(/(href|src)\s*=\s*(?:"javascript:[^"]*"|'javascript:[^']*')/gi, "$1=\"\"");
266
+ // Process tags: keep allowed, strip all others
267
+ return html.replace(/<\/?([a-zA-Z][a-zA-Z0-9]*)\b([^>]*)?\/?>/gi, (fullMatch, tagName, attrsStr) => {
268
+ const tag = tagName.toLowerCase();
269
+ // Closing tag
270
+ if (fullMatch.startsWith("</")) {
271
+ return SAFE_TAGS.has(tag) ? `</${tag}>` : "";
272
+ }
273
+ // Not in allowlist strip entirely
274
+ if (!SAFE_TAGS.has(tag))
275
+ return "";
276
+ // Parse and filter attributes
277
+ const safeAttrStr = sanitizeAttributes(tag, attrsStr || "");
278
+ const selfClosing = fullMatch.trimEnd().endsWith("/>");
279
+ return `<${tag}${safeAttrStr}${selfClosing ? " /" : ""}>`;
280
+ });
281
+ }
282
+ function sanitizeAttributes(tag, attrsStr) {
283
+ const globalAllowed = SAFE_ATTRS["*"] || new Set();
284
+ const tagAllowed = SAFE_ATTRS[tag] || new Set();
285
+ const parts = [];
286
+ // Match attribute="value", attribute='value', attribute=value, or boolean attributes
287
+ const attrRegex = /([a-zA-Z][\w-]*)\s*(?:=\s*(?:"([^"]*)"|'([^']*)'|(\S+)))?/g;
288
+ let m;
289
+ while ((m = attrRegex.exec(attrsStr)) !== null) {
290
+ const attrName = m[1].toLowerCase();
291
+ const value = m[2] ?? m[3] ?? m[4] ?? "";
292
+ // Must be in allowlist (global or tag-specific)
293
+ if (!globalAllowed.has(attrName) && !tagAllowed.has(attrName))
294
+ continue;
295
+ // Reject on* event handlers regardless of allowlist
296
+ if (attrName.startsWith("on"))
297
+ continue;
298
+ // Validate URL attributes against safe protocols
299
+ if (attrName === "href" || attrName === "src") {
300
+ if (!isUrlSafe(value))
301
+ continue;
302
+ }
303
+ parts.push(`${attrName}="${escapeHtml(value)}"`);
304
+ }
305
+ return parts.length > 0 ? " " + parts.join(" ") : "";
306
+ }
307
+ function isUrlSafe(url) {
308
+ const trimmed = url.trim().toLowerCase();
309
+ // Reject javascript:, data:, vbscript:, etc.
310
+ if (trimmed.startsWith("javascript:") || trimmed.startsWith("data:") || trimmed.startsWith("vbscript:")) {
311
+ return false;
312
+ }
313
+ // Allow relative URLs, anchors, and protocol-relative URLs
314
+ if (trimmed.startsWith("/") || trimmed.startsWith("#") || trimmed.startsWith("//") || trimmed.startsWith("?")) {
315
+ return true;
316
+ }
317
+ // For absolute URLs, check protocol
318
+ try {
319
+ const parsed = new URL(url);
320
+ return SAFE_PROTOCOLS.has(parsed.protocol);
321
+ }
322
+ catch {
323
+ // Not a valid absolute URL — allow (relative path)
324
+ return true;
325
+ }
198
326
  }
199
327
  //# sourceMappingURL=renderMarkdown.js.map