@abuswami1996/agent-md 0.1.4 → 0.1.6

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 (95) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/agent-md-preview.vsix +0 -0
  3. package/dist/index.js +111 -3
  4. package/package.json +1 -1
  5. package/viewer-dist/assets/index-B7MTTuRJ.css +1 -0
  6. package/viewer-dist/assets/index-w_fCrfuz.js +3407 -0
  7. package/viewer-dist/index.html +2 -20
  8. package/viewer-dist/assets/arc-BGWRvh4A.js +0 -1
  9. package/viewer-dist/assets/architecture-7EHR7CIX-tMtXFVEB.js +0 -1
  10. package/viewer-dist/assets/architectureDiagram-3BPJPVTR-BpnMGpeV.js +0 -36
  11. package/viewer-dist/assets/array-CLXCPui0.js +0 -1
  12. package/viewer-dist/assets/blockDiagram-GPEHLZMM-BHk4-xwc.js +0 -132
  13. package/viewer-dist/assets/c4Diagram-AAUBKEIU-BShCidQJ.js +0 -10
  14. package/viewer-dist/assets/channel-BeF3oGSA.js +0 -1
  15. package/viewer-dist/assets/chunk-2J33WTMH-D_hBYQSk.js +0 -1
  16. package/viewer-dist/assets/chunk-3OPIFGDE-yFgTZecx.js +0 -62
  17. package/viewer-dist/assets/chunk-4BX2VUAB-BrcCtoyJ.js +0 -1
  18. package/viewer-dist/assets/chunk-4EGX6M5U-sKH2Isf8.js +0 -1
  19. package/viewer-dist/assets/chunk-55IACEB6-DbDA7kYA.js +0 -1
  20. package/viewer-dist/assets/chunk-5DO6E6H7-DVriMWxp.js +0 -1
  21. package/viewer-dist/assets/chunk-5ZQYHXKU-DQ5fX41l.js +0 -2
  22. package/viewer-dist/assets/chunk-727SXJPM-SK34XSEC.js +0 -206
  23. package/viewer-dist/assets/chunk-AQP2D5EJ-DXK-1dYB.js +0 -231
  24. package/viewer-dist/assets/chunk-BR22UD5L-BCm2xrxa.js +0 -1
  25. package/viewer-dist/assets/chunk-BSJP7CBP-B3Tyh4s5.js +0 -1
  26. package/viewer-dist/assets/chunk-CSCIHK7Q-BmRiMG-E.js +0 -123
  27. package/viewer-dist/assets/chunk-FHYWG6QK-B_z4diOF.js +0 -1
  28. package/viewer-dist/assets/chunk-FMBD7UC4-Dxft-q4P.js +0 -15
  29. package/viewer-dist/assets/chunk-KSCS5N6A-eA-nZKPR.js +0 -10
  30. package/viewer-dist/assets/chunk-L5ZTLDWV-CJt5R1DD.js +0 -1
  31. package/viewer-dist/assets/chunk-MPE355IW-BrU23f3r.js +0 -1
  32. package/viewer-dist/assets/chunk-MZUSXYTE-BGj-wpbJ.js +0 -1
  33. package/viewer-dist/assets/chunk-N66VUXT2-Bx9F_D4P.js +0 -1
  34. package/viewer-dist/assets/chunk-ND2GUHAM-DhxorC-R.js +0 -1
  35. package/viewer-dist/assets/chunk-NNHCCRGN-DSaPFNsL.js +0 -159
  36. package/viewer-dist/assets/chunk-NZK2D7GU-DaLfDAf-.js +0 -1
  37. package/viewer-dist/assets/chunk-O5CBEL6O-D0rppU0M.js +0 -70
  38. package/viewer-dist/assets/chunk-PUPMXCY4-C2l0dHY4.js +0 -1
  39. package/viewer-dist/assets/chunk-QZHKN3VN-CqO4Iw07.js +0 -1
  40. package/viewer-dist/assets/chunk-UIBZB4QT-DXVjm6Jo.js +0 -1
  41. package/viewer-dist/assets/chunk-WCWK7LTN-zc10zcLo.js +0 -1
  42. package/viewer-dist/assets/classDiagram-4FO5ZUOK-tR_J6scJ.js +0 -1
  43. package/viewer-dist/assets/classDiagram-v2-Q7XG4LA2-DStV2Q4p.js +0 -1
  44. package/viewer-dist/assets/cose-bilkent-S5V4N54A-SSDlF1_a.js +0 -1
  45. package/viewer-dist/assets/cytoscape.esm-mg8EQp5B.js +0 -321
  46. package/viewer-dist/assets/dagre-BM42HDAG-CbZJzBab.js +0 -4
  47. package/viewer-dist/assets/dagre-CdwzCXQr.js +0 -1
  48. package/viewer-dist/assets/defaultLocale-Dda4OpKy.js +0 -1
  49. package/viewer-dist/assets/diagram-2AECGRRQ-BB3K5hE5.js +0 -43
  50. package/viewer-dist/assets/diagram-5GNKFQAL-DWmbyuQH.js +0 -10
  51. package/viewer-dist/assets/diagram-KO2AKTUF-CYSKyVh3.js +0 -3
  52. package/viewer-dist/assets/diagram-LMA3HP47-CyTMJfPw.js +0 -24
  53. package/viewer-dist/assets/diagram-OG6HWLK6-72YuHoex.js +0 -24
  54. package/viewer-dist/assets/dist-Cz_gOj_F.js +0 -1
  55. package/viewer-dist/assets/erDiagram-TEJ5UH35-B7Z-qey-.js +0 -85
  56. package/viewer-dist/assets/eventmodeling-FCH6USID-Cmphiy0Z.js +0 -1
  57. package/viewer-dist/assets/flowDiagram-I6XJVG4X-Bd8YQF0F.js +0 -162
  58. package/viewer-dist/assets/ganttDiagram-6RSMTGT7-B0R6fBcN.js +0 -292
  59. package/viewer-dist/assets/gitGraph-WXDBUCRP-CABAU2x_.js +0 -1
  60. package/viewer-dist/assets/gitGraphDiagram-PVQCEYII-DgTF7l00.js +0 -106
  61. package/viewer-dist/assets/graphlib-B0DVs0bw.js +0 -1
  62. package/viewer-dist/assets/index-BiU7pYUM.css +0 -1
  63. package/viewer-dist/assets/index-C_Rab63U.js +0 -99
  64. package/viewer-dist/assets/info-J43DQDTF-CtHtznhp.js +0 -1
  65. package/viewer-dist/assets/infoDiagram-5YYISTIA-D3ae-MRJ.js +0 -2
  66. package/viewer-dist/assets/init-Ct4VudL3.js +0 -1
  67. package/viewer-dist/assets/ishikawaDiagram-YF4QCWOH-BpRQFD12.js +0 -70
  68. package/viewer-dist/assets/journeyDiagram-JHISSGLW-DTbccBmQ.js +0 -139
  69. package/viewer-dist/assets/kanban-definition-UN3LZRKU-DBpDPAaX.js +0 -89
  70. package/viewer-dist/assets/katex-pVJiI_rc.js +0 -257
  71. package/viewer-dist/assets/line-CSkXZgM5.js +0 -1
  72. package/viewer-dist/assets/linear-C69MUSpN.js +0 -1
  73. package/viewer-dist/assets/mermaid-parser.core-BxtmlK9F.js +0 -4
  74. package/viewer-dist/assets/mindmap-definition-RKZ34NQL-CJfLUd4u.js +0 -96
  75. package/viewer-dist/assets/ordinal-bHkc4Rpt.js +0 -1
  76. package/viewer-dist/assets/packet-YPE3B663-DmtvbI4l.js +0 -1
  77. package/viewer-dist/assets/path-ZGOlHDxT.js +0 -1
  78. package/viewer-dist/assets/pie-LRSECV5Y-Y82O9nng.js +0 -1
  79. package/viewer-dist/assets/pieDiagram-4H26LBE5-BsHXB8IC.js +0 -30
  80. package/viewer-dist/assets/quadrantDiagram-W4KKPZXB-B3RaddW4.js +0 -7
  81. package/viewer-dist/assets/radar-GUYGQ44K-BHcHsGeF.js +0 -1
  82. package/viewer-dist/assets/requirementDiagram-4Y6WPE33-CanuKYuP.js +0 -84
  83. package/viewer-dist/assets/rough.esm-C6nrIGLg.js +0 -1
  84. package/viewer-dist/assets/sankeyDiagram-5OEKKPKP-B92qVA_9.js +0 -40
  85. package/viewer-dist/assets/sequenceDiagram-3UESZ5HK-IBhScJkH.js +0 -162
  86. package/viewer-dist/assets/src--c83fjKW.js +0 -1
  87. package/viewer-dist/assets/stateDiagram-AJRCARHV-D9ORfcYk.js +0 -1
  88. package/viewer-dist/assets/stateDiagram-v2-BHNVJYJU-CCmjUx_g.js +0 -1
  89. package/viewer-dist/assets/timeline-definition-PNZ67QCA-D4afYQ3m.js +0 -120
  90. package/viewer-dist/assets/treeView-BLDUP644-Cmu4mPLp.js +0 -1
  91. package/viewer-dist/assets/treemap-LRROVOQU-_N62KlUg.js +0 -1
  92. package/viewer-dist/assets/vennDiagram-CIIHVFJN-DjSaUOWp.js +0 -34
  93. package/viewer-dist/assets/wardley-L42UT6IY-DWSXD3L4.js +0 -1
  94. package/viewer-dist/assets/wardleyDiagram-YWT4CUSO-CBn2PjeZ.js +0 -78
  95. package/viewer-dist/assets/xychartDiagram-2RQKCTM6-CAAAsGIb.js +0 -7
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.6
4
+
5
+ - Added `agent-md convert --file_name <file.agent.md> --html` for writing static HTML files.
6
+ - Embedded resolved Agent Markdown documents and self-contained viewer assets in generated HTML.
7
+ - Added CLI integration coverage and README guidance for static HTML conversion.
8
+
9
+ ## 0.1.5
10
+
11
+ - Added controlled local artifact preview support to the bundled browser viewer.
12
+ - Added content types for text, JSON, CSV, images, PDFs, and videos served through the local artifact endpoint.
13
+ - Bundled the updated Agent Markdown Preview extension for richer embed cards and theme-visible chart colors.
14
+
3
15
  ## 0.1.4
4
16
 
5
17
  - Added release workflow support for npm trusted publishing with provenance.
Binary file
package/dist/index.js CHANGED
@@ -329,6 +329,7 @@ Rules:
329
329
  - Prefer named data blocks or local files.
330
330
  - Add frontmatter with format: agent-md and version: 0.1.
331
331
  - Run agent-md validate before considering a document complete.
332
+ - When the user wants a shareable rendered artifact, run agent-md convert --file_name <file.agent.md> --html after validation.
332
333
 
333
334
  Supporting files in this skill directory:
334
335
  - agent-md.config.json: default runtime configuration.
@@ -343,6 +344,11 @@ Supported MVP primitives:
343
344
  - ::callout for notes, warnings, decisions, risks, and tips.
344
345
  - ::tabs for grouped alternative views.
345
346
  - ::diagram, ::timeline, ::query, ::embed, ::form, ::map, and ::component are supported with conservative validation and graceful fallbacks.
347
+
348
+ Useful commands:
349
+ - agent-md validate --file <file.agent.md>
350
+ - agent-md convert --file_name <file.agent.md> --html
351
+ - agent-md convert --file_name <file.agent.md> --html --output <output.html>
346
352
  `;
347
353
  var exampleAgentMarkdown = `---
348
354
  format: agent-md
@@ -627,7 +633,7 @@ function columnType(source, column) {
627
633
  // src/index.ts
628
634
  var program = new Command();
629
635
  var cliDir = path2.dirname(fileURLToPath(import.meta.url));
630
- var cliVersion = "0.1.2";
636
+ var cliVersion = "0.1.6";
631
637
  var extensionId = "AbhinavSwaminathan.agent-md-preview";
632
638
  var viewerDistCandidates = [
633
639
  path2.resolve(cliDir, "../viewer-dist"),
@@ -703,6 +709,24 @@ program.command("export").argument("file").option("--format <format>", "html | j
703
709
  else if (options.format === "markdown-fallback") console.log(renderFallback(document));
704
710
  else console.log(renderStaticHtml(document));
705
711
  });
712
+ program.command("convert").description("Convert an Agent Markdown document to another format").option("--file_name <file>", "Agent Markdown file to convert").option("--file-name <file>", "Agent Markdown file to convert").option("--html", "write a static HTML file").option("--output <file>", "output file path").option("--root <root>", "project root", ".").option("--config <config>", "config path", "agent-md.config.json").action(async (options, command) => {
713
+ const root = path2.resolve(options.root);
714
+ const file = options.file_name ?? options.fileName;
715
+ if (!file) command.error("error: required option '--file_name <file>' not specified");
716
+ if (!options.html) command.error("error: convert currently requires '--html'");
717
+ if (path2.extname(file) !== ".md" || !file.endsWith(".agent.md")) command.error("error: --file_name must point to a .agent.md file");
718
+ const config = await loadConfig(root, options.config);
719
+ const inputFile = path2.resolve(root, file);
720
+ const document = await parseAndResolve(inputFile, root, config);
721
+ const source = await fs2.readFile(document.sourcePath, "utf8");
722
+ const outputFile = path2.resolve(root, options.output ?? defaultHtmlOutputPath(file));
723
+ const html = await buildStaticHtml(document, source);
724
+ await fs2.mkdir(path2.dirname(outputFile), { recursive: true });
725
+ await fs2.writeFile(outputFile, html);
726
+ console.log(pc.green(`Wrote ${path2.relative(root, outputFile)}`));
727
+ printDiagnostics([document]);
728
+ process.exitCode = document.diagnostics.some((diagnostic) => diagnostic.severity === "error") ? 1 : 0;
729
+ });
706
730
  program.command("vscode-extension").description("Print or run local VSCode/Cursor extension install instructions").option("--editor <editor>", "editor CLI to use: cursor or code", "cursor").option("--install", "install the bundled VSIX with the editor CLI").option("--force", "force reinstall when using --install", true).action(async (options) => {
707
731
  const vsix = await findVsix();
708
732
  if (!vsix) {
@@ -932,6 +956,65 @@ async function findViewerDistDir() {
932
956
  }
933
957
  return void 0;
934
958
  }
959
+ function defaultHtmlOutputPath(file) {
960
+ if (file.endsWith(".agent.md")) return `${file.slice(0, -".agent.md".length)}.html`;
961
+ return `${file.slice(0, -path2.extname(file).length)}.html`;
962
+ }
963
+ async function buildStaticHtml(document, source) {
964
+ const viewerDistDir = await findViewerDistDir();
965
+ const payload = { document, source };
966
+ if (!viewerDistDir) return renderStaticHtml(document, source);
967
+ const indexPath = path2.join(viewerDistDir, "index.html");
968
+ let html = await fs2.readFile(indexPath, "utf8");
969
+ html = stripModulePreloadLinks(html);
970
+ html = await inlineCssAssets(html, viewerDistDir);
971
+ html = await inlineScriptAssets(html, viewerDistDir);
972
+ return html.replace("</head>", `${staticPayloadScript(payload)}</head>`);
973
+ }
974
+ function stripModulePreloadLinks(html) {
975
+ return html.replace(/<link\b[^>]*\brel="modulepreload"[^>]*>/g, "");
976
+ }
977
+ async function inlineCssAssets(html, viewerDistDir) {
978
+ const cssLinkPattern = /<link\b([^>]*?)href="([^"]+\.css)"([^>]*)>/g;
979
+ return replaceAsync(html, cssLinkPattern, async (_match, before, href, after) => {
980
+ const css = await readViewerAsset(viewerDistDir, href);
981
+ return `<style data-agent-md-asset="${escapeHtmlAttribute(href)}"${before.includes("media=") || after.includes("media=") ? `${before}${after}`.match(/\smedia="[^"]+"/)?.[0] ?? "" : ""}>
982
+ ${css}
983
+ </style>`;
984
+ });
985
+ }
986
+ async function inlineScriptAssets(html, viewerDistDir) {
987
+ const scriptPattern = /<script\b([^>]*?)src="([^"]+\.js)"([^>]*)><\/script>/g;
988
+ return replaceAsync(html, scriptPattern, async (_match, before, src, after) => {
989
+ const js = await readViewerAsset(viewerDistDir, src);
990
+ const isModule = `${before}${after}`.includes('type="module"');
991
+ const dataUrl = `data:text/javascript;base64,${Buffer.from(js).toString("base64")}`;
992
+ return `<script${isModule ? ' type="module"' : ""} data-agent-md-asset="${escapeHtmlAttribute(src)}" src="${dataUrl}"></script>`;
993
+ });
994
+ }
995
+ async function readViewerAsset(viewerDistDir, assetPath) {
996
+ const relative = decodeURIComponent(assetPath.replace(/^\/+/, ""));
997
+ const absolute = path2.resolve(viewerDistDir, relative);
998
+ const insideViewer = !path2.relative(viewerDistDir, absolute).startsWith("..") && !path2.isAbsolute(path2.relative(viewerDistDir, absolute));
999
+ if (!insideViewer) throw new Error(`Viewer asset escapes dist directory: ${assetPath}`);
1000
+ return fs2.readFile(absolute, "utf8");
1001
+ }
1002
+ async function replaceAsync(source, pattern, replacer) {
1003
+ const matches = [...source.matchAll(pattern)];
1004
+ const replacements = await Promise.all(matches.map((match) => replacer(...match.map((value) => value ?? ""))));
1005
+ let result = source;
1006
+ for (let index = matches.length - 1; index >= 0; index--) {
1007
+ const match = matches[index];
1008
+ result = `${result.slice(0, match.index)}${replacements[index]}${result.slice((match.index ?? 0) + match[0].length)}`;
1009
+ }
1010
+ return result;
1011
+ }
1012
+ function staticPayloadScript(payload) {
1013
+ return `<script>window.__AGENT_MD_STATIC__=${jsonForScript(payload)};</script>`;
1014
+ }
1015
+ function jsonForScript(value) {
1016
+ return JSON.stringify(value).replace(/[<>&\u2028\u2029]/g, (char) => `\\u${char.charCodeAt(0).toString(16).padStart(4, "0")}`);
1017
+ }
935
1018
  function contentType(file) {
936
1019
  const ext = path2.extname(file);
937
1020
  if (ext === ".html") return "text/html; charset=utf8";
@@ -939,17 +1022,42 @@ function contentType(file) {
939
1022
  if (ext === ".css") return "text/css; charset=utf8";
940
1023
  if (ext === ".svg") return "image/svg+xml";
941
1024
  if (ext === ".json") return "application/json";
1025
+ if (ext === ".md" || ext === ".mmd" || ext === ".mermaid" || ext === ".txt") return "text/plain; charset=utf8";
1026
+ if (ext === ".csv") return "text/csv; charset=utf8";
1027
+ if (ext === ".tsv") return "text/tab-separated-values; charset=utf8";
1028
+ if (ext === ".png") return "image/png";
1029
+ if (ext === ".jpg" || ext === ".jpeg") return "image/jpeg";
1030
+ if (ext === ".gif") return "image/gif";
1031
+ if (ext === ".pdf") return "application/pdf";
1032
+ if (ext === ".mp4") return "video/mp4";
1033
+ if (ext === ".webm") return "video/webm";
942
1034
  return "application/octet-stream";
943
1035
  }
944
1036
  function renderFallback(document) {
945
1037
  return document.nodes.map((node) => node.type === "markdown" ? node.value : `[${node.type}]`).join("\n\n");
946
1038
  }
947
- function renderStaticHtml(document) {
948
- return `<!doctype html><meta charset="utf8"><title>Agent Markdown</title><pre>${escapeHtml(JSON.stringify(document, null, 2))}</pre>`;
1039
+ function renderStaticHtml(document, source) {
1040
+ return `<!doctype html>
1041
+ <html><head><meta charset="utf8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Agent Markdown</title>
1042
+ ${staticPayloadScript({ document, source: source ?? "" })}
1043
+ <style>:root{font-family:Inter,ui-sans-serif,system-ui,sans-serif;color:#0f172a;background:#f8fafc}body{margin:0;padding:24px}.agent-md-card{border:1px solid #e2e8f0;border-radius:10px;background:white;padding:16px;margin:12px 0}pre{white-space:pre-wrap;background:#0f172a;color:#e2e8f0;padding:16px;border-radius:10px;overflow:auto}table{border-collapse:collapse;width:100%}th,td{border:1px solid #e2e8f0;padding:8px;text-align:left}th{background:#f1f5f9}</style></head>
1044
+ <body><main><h1>Agent Markdown</h1>${document.nodes.map(renderStaticNode).join("\n")}</main></body></html>`;
949
1045
  }
950
1046
  function escapeHtml(value) {
951
1047
  return value.replace(/[&<>"]/g, (char) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;" })[char]);
952
1048
  }
1049
+ function escapeHtmlAttribute(value) {
1050
+ return escapeHtml(value);
1051
+ }
1052
+ function renderStaticNode(node) {
1053
+ if (node.type === "markdown") return `<section>${escapeHtml(node.value).replace(/\n/g, "<br>")}</section>`;
1054
+ if (node.type === "metric") return `<section class="agent-md-card"><strong>${escapeHtml(node.label)}</strong><h2>${escapeHtml(String(node.value ?? ""))}</h2></section>`;
1055
+ if (node.type === "table" || node.type === "query") return `<section class="agent-md-card"><strong>${escapeHtml(node.type)}</strong><pre>${escapeHtml(JSON.stringify(node, null, 2))}</pre></section>`;
1056
+ if (node.type === "callout") return `<section class="agent-md-card"><strong>${escapeHtml(node.title ?? node.calloutType)}</strong><p>${escapeHtml(node.body ?? "")}</p></section>`;
1057
+ if (node.type === "tabs") return `<section class="agent-md-card"><strong>Tabs</strong>${node.tabs.map((tab) => `<h3>${escapeHtml(tab.label)}</h3>${tab.children.map(renderStaticNode).join("")}`).join("")}</section>`;
1058
+ if (node.type === "error") return `<section class="agent-md-card"><strong>${escapeHtml(node.message)}</strong></section>`;
1059
+ return `<section class="agent-md-card"><strong>${escapeHtml(node.type)}</strong><pre>${escapeHtml(JSON.stringify(node, null, 2))}</pre></section>`;
1060
+ }
953
1061
  async function openBrowser(url) {
954
1062
  await import("child_process").then(({ execFile }) => execFile(process.platform === "darwin" ? "open" : "xdg-open", [url]));
955
1063
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abuswami1996/agent-md",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "Local-first Agent Markdown runtime, validator, browser viewer, and agent skill installer.",
5
5
  "license": "MIT",
6
6
  "author": "Abhinav Swaminathan",
@@ -0,0 +1 @@
1
+ :root{--background:#f8fafc;--card:#fff;--muted:#f1f5f9;--muted-foreground:#64748b;--foreground:#0f172a;--border:#e2e8f0;--primary:#2563eb;--danger:#dc2626;--warning:#d97706;--agent-md-chart-1:#2563eb;--agent-md-chart-2:#16a34a;--agent-md-chart-3:#f59e0b;color:var(--foreground);background:var(--background);font-family:Inter,ui-sans-serif,system-ui,sans-serif}body{margin:0}.app-frame{background:var(--background);min-height:100vh;padding:16px}.browser-shell{border:1px solid var(--border);background:var(--card);border-radius:10px;min-height:min(75vh,680px);display:flex;overflow:hidden}.browser-shell.static-shell{min-height:auto}.file-sidebar{border-bottom:1px solid color-mix(in srgb,var(--border) 60%,transparent);background:var(--card);width:100%}.sidebar-strip{background:color-mix(in srgb,var(--muted) 40%,transparent);border-bottom:1px solid color-mix(in srgb,var(--border) 60%,transparent);color:var(--muted-foreground);padding:9px 12px;font-size:12px;font-weight:500}.file-tree{overscroll-behavior:contain;max-height:min(40vh,320px);overflow:auto}.folder-group{border-bottom:1px solid color-mix(in srgb,var(--border) 60%,transparent)}.folder-group:last-child{border-bottom:0}.folder-row{background:color-mix(in srgb,var(--muted) 25%,transparent);align-items:flex-start;gap:8px;padding:8px 12px;display:flex}.folder-name{letter-spacing:.06em;text-transform:uppercase;color:var(--muted-foreground);font-size:11px;font-weight:700}.folder-count{color:color-mix(in srgb,var(--muted-foreground) 80%,transparent);font-size:10px}ul{margin:0;padding:4px 0;list-style:none}.file-row{text-align:left;width:100%;color:var(--muted-foreground);cursor:pointer;background:0 0;border:0;align-items:flex-start;gap:8px;padding:7px 12px;font-size:12px;line-height:1.25;transition:background-color .12s,color .12s;display:flex}.file-row span:nth-child(2){overflow-wrap:anywhere;min-width:0}.file-row:hover{background:color-mix(in srgb,var(--muted) 80%,transparent);color:var(--foreground)}.file-row.active{background:color-mix(in srgb,var(--primary) 10%,transparent);color:var(--foreground);font-weight:500}.tree-icon{flex:none;width:14px;height:14px}.folder-icon{color:var(--muted-foreground)}.file-icon{opacity:.7;margin-top:2px}.status{border-radius:999px;flex:none;width:7px;height:7px;margin-top:4px;margin-left:auto}.ok-dot{background:#16a34a}.warning-dot{background:var(--warning)}.error-dot{background:var(--danger)}.preview-pane{flex-direction:column;flex:1;min-width:0;display:flex;overflow:auto}.preview-header{border-bottom:1px solid color-mix(in srgb,var(--border) 60%,transparent);background:var(--card);justify-content:space-between;align-items:flex-start;gap:16px;padding:14px 16px;display:flex}.preview-header h3{overflow-wrap:anywhere;margin:0;font-size:13px;font-weight:600;line-height:1.35}.preview-header p{color:var(--muted-foreground);margin:3px 0 0;font-size:11px}.mode-button{border:1px solid var(--border);background:var(--card);color:var(--muted-foreground);cursor:pointer;border-radius:6px;padding:5px 8px;font-size:11px}.mode-button:hover{background:var(--muted);color:var(--foreground)}.preview-body{min-width:0;padding:16px;overflow:auto}.diagnostics-panel{border-top:1px solid color-mix(in srgb,var(--border) 60%,transparent);background:color-mix(in srgb,var(--muted) 30%,transparent);padding:8px 12px}.diagnostics-panel p{color:var(--muted-foreground);margin:4px 0;font-size:11px}.empty-state{color:var(--muted-foreground);font-size:13px}.agent-md-document{font-size:13px;line-height:1.55}.agent-md-document h1{margin:0 0 14px;font-size:24px}.agent-md-document h2{margin:18px 0 10px;font-size:18px}.agent-md-document h3{margin:0 0 10px;font-size:13px}.agent-md-card{border:1px solid color-mix(in srgb,var(--border) 75%,transparent);background:var(--card);box-shadow:none;border-radius:8px;margin:10px 0;padding:12px}.agent-md-embed-header{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.agent-md-embed-header h3{margin-bottom:2px}.agent-md-embed-header small,.agent-md-embed-caption,.agent-md-embed-loading{color:var(--muted-foreground);font-size:11px}.agent-md-embed-header a{color:var(--primary);font-size:12px;text-decoration:none}.agent-md-embed-header a:hover{text-decoration:underline}.agent-md-embed-image,.agent-md-embed-media{border:1px solid var(--border);border-radius:8px;max-width:100%;display:block}.agent-md-embed-markdown{border-top:1px solid var(--border);margin-top:10px;padding-top:10px}.agent-md-embed-text{max-height:360px}.agent-md-metric strong{margin-top:6px;font-size:22px;display:block}.agent-md-error,.error{border-color:color-mix(in srgb,var(--danger) 35%,var(--border));background:color-mix(in srgb,var(--danger) 6%,var(--card))}.warning{border-color:color-mix(in srgb,var(--warning) 35%,var(--border));background:color-mix(in srgb,var(--warning) 6%,var(--card))}.agent-md-tabs>div:first-child{border-bottom:1px solid var(--border);gap:4px;margin-bottom:10px;display:flex}.agent-md-tabs button{color:var(--muted-foreground);cursor:pointer;background:0 0;border:0;padding:6px 8px;font-size:12px}.agent-md-tabs button:hover{background:var(--muted);color:var(--foreground)}table{border-collapse:collapse;width:100%;font-size:12px}th,td{border:1px solid color-mix(in srgb,var(--border) 70%,transparent);text-align:left;padding:6px 8px}th{background:color-mix(in srgb,var(--muted) 45%,transparent);cursor:pointer;color:var(--muted-foreground);font-size:11px}input{border:1px solid var(--border);border-radius:6px;padding:6px 8px;font-size:12px}pre{color:#e2e8f0;background:#0f172a;border-radius:8px;padding:12px;font-size:12px;overflow:auto}@media (width>=1024px){.browser-shell{flex-direction:row}.file-sidebar{border-bottom:0;border-right:1px solid color-mix(in srgb,var(--border) 60%,transparent);width:min(100%,280px)}.file-tree{max-height:min(75vh,720px)}.preview-body{padding:18px 22px}}@media (width>=1280px){.file-sidebar{width:320px}}