kennel 0.2.27 → 0.2.29

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 (74) hide show
  1. package/dist/core/runtime.js +15 -15
  2. package/dist/package/preview.d.ts +1 -1
  3. package/dist/package/preview.js +103 -121
  4. package/dist/site/terminal.js +9 -10
  5. package/package.json +2 -2
  6. package/web/assets/{abnfDiagram-VRR7QNED-CIyEzNaJ.js → abnfDiagram-VRR7QNED-Bn80ZKWr.js} +1 -1
  7. package/web/assets/{arc-Dba3y3eW.js → arc-DYtldBwv.js} +1 -1
  8. package/web/assets/{architectureDiagram-ZJ3FMSHR-DjFjO3tR.js → architectureDiagram-ZJ3FMSHR-Q8wivs2p.js} +1 -1
  9. package/web/assets/{ask-tray-PMT6VVXN-ButKBzsY.js → ask-tray-PMT6VVXN-DNWm9l0M.js} +3 -3
  10. package/web/assets/{blockDiagram-677ZJIJ3-C8ZQgtnK.js → blockDiagram-677ZJIJ3-VzYV-AA6.js} +1 -1
  11. package/web/assets/{c4Diagram-LMCZKHZV-DhWn2tZm.js → c4Diagram-LMCZKHZV-BEh1NlA0.js} +1 -1
  12. package/web/assets/channel-CPeCBcEl.js +1 -0
  13. package/web/assets/{chunk-2Q5K7J3B-BEkPxYAB.js → chunk-2Q5K7J3B-VMcfJfhB.js} +1 -1
  14. package/web/assets/{chunk-32BRIVSS-BZ0ofM9m.js → chunk-32BRIVSS-CnIckQlR.js} +1 -1
  15. package/web/assets/{chunk-5VM5RSS4-CTgBiom0.js → chunk-5VM5RSS4-B7NdDHyk.js} +1 -1
  16. package/web/assets/{chunk-EX3LRPZG-B7lDJEfz.js → chunk-EX3LRPZG-CLmNzhNw.js} +1 -1
  17. package/web/assets/{chunk-JWPE2WC7-DotlQGla.js → chunk-JWPE2WC7-CB7J3YAt.js} +1 -1
  18. package/web/assets/{chunk-MOJQB5TN-BSlB5ICN.js → chunk-MOJQB5TN-NHmi6U-6.js} +1 -1
  19. package/web/assets/{chunk-RYQCIY6F-BbDvgRvj.js → chunk-RYQCIY6F-D8mdIHdH.js} +1 -1
  20. package/web/assets/{chunk-V7JOEXUC-CqC2yHBO.js → chunk-V7JOEXUC-ebyFygjO.js} +1 -1
  21. package/web/assets/{chunk-VR4S4FIN-18aLOCVw.js → chunk-VR4S4FIN-DdRcpv9A.js} +1 -1
  22. package/web/assets/{chunk-XXDRQBXY-uulB67ep.js → chunk-XXDRQBXY-CaDFu2On.js} +1 -1
  23. package/web/assets/classDiagram-OUVF2IWQ-3AGK8leR.js +1 -0
  24. package/web/assets/classDiagram-v2-EOCWNBFH-3AGK8leR.js +1 -0
  25. package/web/assets/{cose-bilkent-JH36ORCC-C8yqL7ml.js → cose-bilkent-JH36ORCC-PjfFnCxS.js} +1 -1
  26. package/web/assets/{cynefin-VYW2F7L2-D-wd85t1.js → cynefin-VYW2F7L2-DRgOkHBE.js} +1 -1
  27. package/web/assets/{cynefinDiagram-TSTJHNR4-rrV6rLov.js → cynefinDiagram-TSTJHNR4-DrY10Xz3.js} +1 -1
  28. package/web/assets/{dagre-VKFMJZFB-BxwiLhMr.js → dagre-VKFMJZFB-Bscwbkne.js} +1 -1
  29. package/web/assets/{diagram-FQU43EPY-8sr7lcj4.js → diagram-FQU43EPY-CEagDGS8.js} +1 -1
  30. package/web/assets/{diagram-G47NLZAW-BQIU_Mie.js → diagram-G47NLZAW-BZhMoJam.js} +1 -1
  31. package/web/assets/{diagram-NH7WQ7WH-Bt-xVbVq.js → diagram-NH7WQ7WH-Cj6Bu-O4.js} +1 -1
  32. package/web/assets/{diagram-OA4YK3LP-p-i-3cps.js → diagram-OA4YK3LP-Bnr8Sd0b.js} +1 -1
  33. package/web/assets/{diagram-WEI45ONY-E6t6-_mU.js → diagram-WEI45ONY-CRMqzsgH.js} +1 -1
  34. package/web/assets/{ebnfDiagram-CCIWWBDH-DCszfyU3.js → ebnfDiagram-CCIWWBDH-CAbB-8JZ.js} +1 -1
  35. package/web/assets/{entity-search-page-G6QEQNXT-D6cvoqrF.js → entity-search-page-G6QEQNXT-CRfdTtti.js} +1 -1
  36. package/web/assets/{erDiagram-Q63AITRT-C4gBewIM.js → erDiagram-Q63AITRT-C8RUnhzS.js} +1 -1
  37. package/web/assets/{flowDiagram-23GEKE2U-BEyFAV-g.js → flowDiagram-23GEKE2U-Bsr7qout.js} +1 -1
  38. package/web/assets/{ganttDiagram-NO4QXBWP-Bat5BF2x.js → ganttDiagram-NO4QXBWP-Cj4c0JYQ.js} +1 -1
  39. package/web/assets/{gitGraphDiagram-IHSO6WYX-CGZs8b5E.js → gitGraphDiagram-IHSO6WYX-Bs314gD3.js} +1 -1
  40. package/web/assets/{index-DmJQJIC1.js → index-CSVH3QUs.js} +4 -4
  41. package/web/assets/{index-tpV2etC4.css → index-vjrhIAJn.css} +1 -1
  42. package/web/assets/{infoDiagram-FWYZ7A6U-Cglwuazb.js → infoDiagram-FWYZ7A6U-DH-cmVkX.js} +1 -1
  43. package/web/assets/{ishikawaDiagram-FXEZZL3T-C95-Gz9z.js → ishikawaDiagram-FXEZZL3T-BDJNBoGn.js} +1 -1
  44. package/web/assets/{journeyDiagram-5HDEW3XC-C055Trr6.js → journeyDiagram-5HDEW3XC-BPzolpTl.js} +1 -1
  45. package/web/assets/{kanban-definition-HUTT4EX6-CznSv3_t.js → kanban-definition-HUTT4EX6-Cbwk3hWN.js} +1 -1
  46. package/web/assets/{linear-CnWGyi6E.js → linear-C_hmEwuP.js} +1 -1
  47. package/web/assets/{linked-session-header-M7WY6IGF-BFioq_q7.js → linked-session-header-M7WY6IGF-wWopBTMB.js} +1 -1
  48. package/web/assets/{mermaid.core-BIJiZKob.js → mermaid.core-C_STxONh.js} +4 -4
  49. package/web/assets/{mindmap-definition-LN4V7U3C-k97sTi1e.js → mindmap-definition-LN4V7U3C-t11NOd4O.js} +1 -1
  50. package/web/assets/{pegDiagram-2B236MQR-C-4ETzyd.js → pegDiagram-2B236MQR-DJfAH7lH.js} +1 -1
  51. package/web/assets/{pieDiagram-ENE6RG2P-CH8gYIx3.js → pieDiagram-ENE6RG2P-CWUBmV0d.js} +1 -1
  52. package/web/assets/{plugin-host-modules-BI0aGGBk.js → plugin-host-modules-DJHbqQhr.js} +1 -1
  53. package/web/assets/{project-search-dialog-HJFGW4DG-DC6mBFkm.js → project-search-dialog-HJFGW4DG-BXLg3396.js} +1 -1
  54. package/web/assets/{project-search-page-NKQEBGPF-B0OxN-l5.js → project-search-page-NKQEBGPF-vTDDUXOQ.js} +1 -1
  55. package/web/assets/{quadrantDiagram-ABIIQ3AL-BFV2fyQY.js → quadrantDiagram-ABIIQ3AL-D3VESec_.js} +1 -1
  56. package/web/assets/{railroadDiagram-RFXS5EU6-Dxj8XtW1.js → railroadDiagram-RFXS5EU6-n_5zh_mW.js} +1 -1
  57. package/web/assets/{requirementDiagram-TGXJPOKE-Drb3A2JL.js → requirementDiagram-TGXJPOKE-DOEJVC4O.js} +1 -1
  58. package/web/assets/{sankeyDiagram-HTMAVEWB-DP7Lyg91.js → sankeyDiagram-HTMAVEWB-p-X5ZPgN.js} +1 -1
  59. package/web/assets/{selection-popup-532EHNCZ-C8EBNgOw.js → selection-popup-532EHNCZ-DR8C-3fL.js} +1 -1
  60. package/web/assets/{sequenceDiagram-DBY2YBRQ-6qzKd9e_.js → sequenceDiagram-DBY2YBRQ-BAas_TGB.js} +1 -1
  61. package/web/assets/{sizeCapture-X5ZJPWSS-DhCU_-w6.js → sizeCapture-X5ZJPWSS-CgQwiack.js} +1 -1
  62. package/web/assets/{stateDiagram-2N3HPSRC-C_BN15Uj.js → stateDiagram-2N3HPSRC-DRizvoeL.js} +1 -1
  63. package/web/assets/{stateDiagram-v2-6OUMAXLB-DtNCoZjH.js → stateDiagram-v2-6OUMAXLB-BJdHb7cS.js} +1 -1
  64. package/web/assets/{swimlanes-5IMT3BWC-CW-FMmDB.js → swimlanes-5IMT3BWC-CuKRbnuf.js} +2 -2
  65. package/web/assets/swimlanesDiagram-G3AALYLV-CjKn7pGa.js +8 -0
  66. package/web/assets/{timeline-definition-FHXFAJF6-VX8Kq-Hg.js → timeline-definition-FHXFAJF6-BKzroj6g.js} +1 -1
  67. package/web/assets/{vennDiagram-L72KCM5P-DU3qCuRJ.js → vennDiagram-L72KCM5P-DO-bKMoT.js} +1 -1
  68. package/web/assets/{wardleyDiagram-EHGQE667-CAA7wYyD.js → wardleyDiagram-EHGQE667-BQQVafvV.js} +1 -1
  69. package/web/assets/{xychartDiagram-FW5EYKEG-B-GbIjdQ.js → xychartDiagram-FW5EYKEG-TZiE1TnS.js} +1 -1
  70. package/web/index.html +2 -2
  71. package/web/assets/channel-BuqSObVl.js +0 -1
  72. package/web/assets/classDiagram-OUVF2IWQ-xfk1LZB_.js +0 -1
  73. package/web/assets/classDiagram-v2-EOCWNBFH-xfk1LZB_.js +0 -1
  74. package/web/assets/swimlanesDiagram-G3AALYLV-Cak69Ty7.js +0 -8
@@ -22005,7 +22005,7 @@ import {
22005
22005
  sep as sep7
22006
22006
  } from "node:path";
22007
22007
 
22008
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react.js
22008
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react.js
22009
22009
  var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1);
22010
22010
  var import_react6 = __toESM(require_react(), 1);
22011
22011
 
@@ -22182,7 +22182,7 @@ var defaultSchema = {
22182
22182
  "var"
22183
22183
  ]
22184
22184
  };
22185
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react.js
22185
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react.js
22186
22186
  var runtime = __toESM(require_jsx_runtime(), 1);
22187
22187
 
22188
22188
  // node_modules/.bun/gemoji@8.1.0/node_modules/gemoji/index.js
@@ -35279,7 +35279,7 @@ var gemoji = [
35279
35279
  }
35280
35280
  ];
35281
35281
 
35282
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/emoji.js
35282
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/emoji.js
35283
35283
  var shortcodeToEmoji = new Map(gemoji.flatMap((entry) => entry.names.map((name) => [
35284
35284
  name,
35285
35285
  {
@@ -35288,36 +35288,36 @@ var shortcodeToEmoji = new Map(gemoji.flatMap((entry) => entry.names.map((name)
35288
35288
  }
35289
35289
  ])));
35290
35290
 
35291
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/link.js
35291
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/link.js
35292
35292
  var import_jsx_runtime = __toESM(require_jsx_runtime(), 1);
35293
35293
 
35294
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/rehype-collapsible-headings.js
35294
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/rehype-collapsible-headings.js
35295
35295
  var HEADING_TAGS = new Set(["h1", "h2", "h3", "h4", "h5", "h6"]);
35296
35296
 
35297
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react-collapsible-sections.js
35297
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react-collapsible-sections.js
35298
35298
  var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
35299
35299
  var import_react3 = __toESM(require_react(), 1);
35300
35300
 
35301
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react-heading-copy.js
35301
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react-heading-copy.js
35302
35302
  var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
35303
35303
  var import_react = __toESM(require_react(), 1);
35304
35304
 
35305
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/use-copy-to-clipboard.js
35305
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/use-copy-to-clipboard.js
35306
35306
  var import_react2 = __toESM(require_react(), 1);
35307
35307
 
35308
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/rehype-heading-lines.js
35308
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/rehype-heading-lines.js
35309
35309
  var HEADING_TAGS2 = new Set(["h1", "h2", "h3", "h4", "h5", "h6"]);
35310
35310
 
35311
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react-mermaid.js
35311
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react-mermaid.js
35312
35312
  var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1);
35313
35313
  var import_react4 = __toESM(require_react(), 1);
35314
35314
  var renderQueue = Promise.resolve();
35315
35315
 
35316
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react-media.js
35316
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react-media.js
35317
35317
  var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1);
35318
35318
  var import_react5 = __toESM(require_react(), 1);
35319
35319
 
35320
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react.js
35320
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react.js
35321
35321
  var markdownSchema = {
35322
35322
  ...defaultSchema,
35323
35323
  tagNames: [
@@ -35505,11 +35505,11 @@ function markdownMetadata(content) {
35505
35505
  title: metadata?.title ?? leadingHeading(body)
35506
35506
  };
35507
35507
  }
35508
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/node.js
35508
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/node.js
35509
35509
  import { readdir, readFile } from "node:fs/promises";
35510
35510
  import { relative, resolve as resolve2, sep } from "node:path";
35511
35511
 
35512
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/documents.js
35512
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/documents.js
35513
35513
  var extensions = new Set([
35514
35514
  ".htm",
35515
35515
  ".html",
@@ -35529,7 +35529,7 @@ function documentKind(path) {
35529
35529
  return;
35530
35530
  }
35531
35531
 
35532
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/node.js
35532
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/node.js
35533
35533
  var skipped = new Set([".git", ".turbo", "dist", "node_modules"]);
35534
35534
  async function readFolder(root) {
35535
35535
  const folder = resolve2(root);
@@ -7,7 +7,7 @@
7
7
  * sources, while staying type-checked against that source of truth.
8
8
  */
9
9
  export declare function share(input: string[]): Promise<void>;
10
- export declare function startLanShare(target: {
10
+ export declare function startPreviewShare(target: {
11
11
  root: string;
12
12
  target?: string;
13
13
  }): Promise<import("kennel-preview/terminal").PreviewShare>;
@@ -297,7 +297,7 @@ function previewTerminal(url, target, startShare) {
297
297
  `));
298
298
  };
299
299
  const shareFolder = async () => {
300
- status = "Preparing a password-protected Wi-Fi link…";
300
+ status = "Preparing a private Tailscale link…";
301
301
  render();
302
302
  try {
303
303
  share ??= startShare();
@@ -310,18 +310,17 @@ function previewTerminal(url, target, startShare) {
310
310
  }
311
311
  if (finished)
312
312
  return;
313
- status = `Wi-Fi link: ${active.url}
313
+ status = `Tailscale link: ${active.url}
314
314
  Username: ${active.username} · Password: ${active.password}
315
- Password required. Send the password separately. Same Wi-Fi only.
316
- Self-signed HTTPS (24 hours): expect a certificate warning.
317
- Verify SHA-256 before trusting the certificate:
318
- ${active.fingerprint}
315
+ Password required. Send the password separately.
316
+ Connect Tailscale on your phone to the same tailnet.
317
+ Trusted HTTPS; no certificate installation required.
319
318
  Keep this command running. Ctrl+C stops sharing.`;
320
319
  render();
321
320
  try {
322
321
  await copyPreviewLink(active.url);
323
322
  status += `
324
- Wi-Fi link copied to clipboard (without the password).`;
323
+ Tailscale link copied to clipboard (without the password).`;
325
324
  } catch (error) {
326
325
  status += `
327
326
  Could not copy link: ${terminalText(error instanceof Error ? error.message : String(error))}`;
@@ -348,7 +347,7 @@ function previewTerminal(url, target, startShare) {
348
347
  }
349
348
  if (share) {
350
349
  share.then((active) => active.close()).catch((error) => {
351
- console.error(` Wi-Fi share stopped: ${error instanceof Error ? error.message : error}`);
350
+ console.error(` Could not stop the Tailscale share: ${error instanceof Error ? error.message : error}`);
352
351
  }).finally(() => resolveClosed());
353
352
  } else
354
353
  resolveClosed();
@@ -6342,7 +6341,7 @@ async function hotViewer(options) {
6342
6341
  const reuse = async () => {
6343
6342
  const terminal = previewTerminal(viewerUrl, options, async () => {
6344
6343
  await Promise.resolve().then(() => init_share());
6345
- return startLanShare(options);
6344
+ return startPreviewShare(options);
6346
6345
  });
6347
6346
  if (options.open)
6348
6347
  openPreview(viewerUrl);
@@ -6401,7 +6400,7 @@ async function hotViewer(options) {
6401
6400
  });
6402
6401
  const terminal = previewTerminal(viewerUrl, options, async () => {
6403
6402
  await Promise.resolve().then(() => init_share());
6404
- return startLanShare(options);
6403
+ return startPreviewShare(options);
6405
6404
  });
6406
6405
  terminal.closed.then(() => {
6407
6406
  if (child.exitCode === null && child.signalCode === null)
@@ -20831,7 +20830,7 @@ var init_gemoji = __esm(() => {
20831
20830
  ];
20832
20831
  });
20833
20832
 
20834
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/emoji.js
20833
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/emoji.js
20835
20834
  var shortcodeToEmoji;
20836
20835
  var init_emoji = __esm(() => {
20837
20836
  init_gemoji();
@@ -20844,32 +20843,32 @@ var init_emoji = __esm(() => {
20844
20843
  ])));
20845
20844
  });
20846
20845
 
20847
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/link.js
20846
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/link.js
20848
20847
  var import_jsx_runtime;
20849
20848
  var init_link = __esm(() => {
20850
20849
  import_jsx_runtime = __toESM(require_jsx_runtime(), 1);
20851
20850
  });
20852
20851
 
20853
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/rehype-collapsible-headings.js
20852
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/rehype-collapsible-headings.js
20854
20853
  var HEADING_TAGS;
20855
20854
  var init_rehype_collapsible_headings = __esm(() => {
20856
20855
  HEADING_TAGS = new Set(["h1", "h2", "h3", "h4", "h5", "h6"]);
20857
20856
  });
20858
20857
 
20859
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react-heading-copy.js
20858
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react-heading-copy.js
20860
20859
  var import_jsx_runtime2, import_react;
20861
20860
  var init_react_heading_copy = __esm(() => {
20862
20861
  import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
20863
20862
  import_react = __toESM(require_react(), 1);
20864
20863
  });
20865
20864
 
20866
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/use-copy-to-clipboard.js
20865
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/use-copy-to-clipboard.js
20867
20866
  var import_react2;
20868
20867
  var init_use_copy_to_clipboard = __esm(() => {
20869
20868
  import_react2 = __toESM(require_react(), 1);
20870
20869
  });
20871
20870
 
20872
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react-collapsible-sections.js
20871
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react-collapsible-sections.js
20873
20872
  var import_jsx_runtime3, import_react3;
20874
20873
  var init_react_collapsible_sections = __esm(() => {
20875
20874
  init_react_heading_copy();
@@ -20878,16 +20877,16 @@ var init_react_collapsible_sections = __esm(() => {
20878
20877
  import_react3 = __toESM(require_react(), 1);
20879
20878
  });
20880
20879
 
20881
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/rehype-heading-lines.js
20880
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/rehype-heading-lines.js
20882
20881
  var HEADING_TAGS2;
20883
20882
  var init_rehype_heading_lines = __esm(() => {
20884
20883
  HEADING_TAGS2 = new Set(["h1", "h2", "h3", "h4", "h5", "h6"]);
20885
20884
  });
20886
20885
 
20887
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/mermaid.js
20886
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/mermaid.js
20888
20887
  var init_mermaid = () => {};
20889
20888
 
20890
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react-mermaid.js
20889
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react-mermaid.js
20891
20890
  var import_jsx_runtime4, import_react4, renderQueue;
20892
20891
  var init_react_mermaid = __esm(() => {
20893
20892
  init_mermaid();
@@ -20896,14 +20895,14 @@ var init_react_mermaid = __esm(() => {
20896
20895
  renderQueue = Promise.resolve();
20897
20896
  });
20898
20897
 
20899
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react-media.js
20898
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react-media.js
20900
20899
  var import_jsx_runtime5, import_react5;
20901
20900
  var init_react_media = __esm(() => {
20902
20901
  import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1);
20903
20902
  import_react5 = __toESM(require_react(), 1);
20904
20903
  });
20905
20904
 
20906
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react.js
20905
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/react.js
20907
20906
  var import_jsx_runtime6, import_react6, runtime, markdownSchema;
20908
20907
  var init_react = __esm(() => {
20909
20908
  init_rehype_sanitize();
@@ -20954,7 +20953,7 @@ var init_react = __esm(() => {
20954
20953
  };
20955
20954
  });
20956
20955
 
20957
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/index.js
20956
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/index.js
20958
20957
  var init_dist2 = __esm(() => {
20959
20958
  init_react();
20960
20959
  init_link();
@@ -28070,7 +28069,7 @@ var init_markdown = __esm(() => {
28070
28069
  init_dist2();
28071
28070
  });
28072
28071
 
28073
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/documents.js
28072
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/documents.js
28074
28073
  function documentKind(path) {
28075
28074
  const extension = path.slice(path.lastIndexOf(".")).toLowerCase();
28076
28075
  if (extension === ".htm" || extension === ".html")
@@ -28093,7 +28092,7 @@ var init_documents = __esm(() => {
28093
28092
  ]);
28094
28093
  });
28095
28094
 
28096
- // node_modules/.bun/@raggle-ai+barkdown@0.7.0+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/node.js
28095
+ // node_modules/.bun/@raggle-ai+barkdown@0.7.1+22117d1132b05fb8/node_modules/@raggle-ai/barkdown/dist/node.js
28097
28096
  import { readdir, readFile as readFile2 } from "node:fs/promises";
28098
28097
  import { relative as relative2, resolve as resolve3, sep } from "node:path";
28099
28098
  async function readFolder(root) {
@@ -40703,7 +40702,7 @@ async function viewer(input) {
40703
40702
  const viewerUrl = popUrl(displayHost, options.port, options);
40704
40703
  const terminal = previewTerminal(viewerUrl, options, async () => {
40705
40704
  await Promise.resolve().then(() => init_share());
40706
- return startLanShare(options);
40705
+ return startPreviewShare(options);
40707
40706
  });
40708
40707
  if (options.open)
40709
40708
  openPreview(viewerUrl);
@@ -40734,7 +40733,7 @@ async function viewer(input) {
40734
40733
  const viewerUrl = popUrl(displayHost, options.port, options);
40735
40734
  const terminal = previewTerminal(viewerUrl, options, async () => {
40736
40735
  await Promise.resolve().then(() => init_share());
40737
- return startLanShare(options);
40736
+ return startPreviewShare(options);
40738
40737
  });
40739
40738
  if (options.open)
40740
40739
  openPreview(viewerUrl);
@@ -40763,57 +40762,15 @@ var init_viewer = __esm(() => {
40763
40762
  });
40764
40763
 
40765
40764
  // packages/preview/src/protected-share.ts
40766
- import { execFile as execFile6 } from "node:child_process";
40767
- import { createHash as createHash6, randomBytes, timingSafeEqual, X509Certificate } from "node:crypto";
40768
- import { mkdtemp, readFile as readFile11, rm as rm2 } from "node:fs/promises";
40769
- import { createServer as createServer3 } from "node:https";
40770
- import { isIP as isIP2 } from "node:net";
40771
- import { tmpdir as tmpdir2 } from "node:os";
40772
- import { join as join5 } from "node:path";
40773
- import { promisify } from "node:util";
40774
- async function previewCertificate(host) {
40775
- if (!isIP2(host))
40776
- throw new Error("The Wi-Fi share requires an IP address");
40777
- const directory = await mkdtemp(join5(tmpdir2(), "kennel-preview-tls-"));
40778
- const keyFile = join5(directory, "key.pem");
40779
- const certFile = join5(directory, "cert.pem");
40780
- try {
40781
- await run("openssl", [
40782
- "req",
40783
- "-x509",
40784
- "-newkey",
40785
- "rsa:2048",
40786
- "-nodes",
40787
- "-days",
40788
- "1",
40789
- "-keyout",
40790
- keyFile,
40791
- "-out",
40792
- certFile,
40793
- "-subj",
40794
- "/CN=Kennel Wi-Fi preview",
40795
- "-addext",
40796
- `subjectAltName=IP:${host}`
40797
- ]);
40798
- const [key, cert] = await Promise.all([readFile11(keyFile), readFile11(certFile)]);
40799
- return { key, cert, fingerprint: new X509Certificate(cert).fingerprint256 };
40800
- } catch (error) {
40801
- if (error instanceof Error && "code" in error && error.code === "ENOENT") {
40802
- throw new Error("Password-protected sharing requires OpenSSL on PATH");
40803
- }
40804
- throw error;
40805
- } finally {
40806
- await rm2(directory, { recursive: true, force: true });
40807
- }
40808
- }
40809
- async function startProtectedShare(host, handle) {
40810
- const { key, cert, fingerprint } = await previewCertificate(host);
40765
+ import { createHash as createHash6, randomBytes, timingSafeEqual } from "node:crypto";
40766
+ import { createServer as createServer3 } from "node:http";
40767
+ async function startProtectedShare(handle) {
40811
40768
  const username = "kennel";
40812
40769
  const password = randomBytes(12).toString("base64url");
40813
40770
  const authorization = `Basic ${Buffer.from(`${username}:${password}`).toString("base64")}`;
40814
40771
  const expected = createHash6("sha256").update(authorization).digest();
40815
40772
  const attempts = new Map;
40816
- const server = createServer3({ key, cert, minVersion: "TLSv1.2" }, (request, response) => {
40773
+ const server = createServer3((request, response) => {
40817
40774
  response.setHeader("Cache-Control", "no-store");
40818
40775
  response.setHeader("X-Content-Type-Options", "nosniff");
40819
40776
  const address = request.socket.remoteAddress ?? "unknown";
@@ -40849,7 +40806,7 @@ async function startProtectedShare(host, handle) {
40849
40806
  try {
40850
40807
  await new Promise((done, fail) => {
40851
40808
  server.once("error", fail);
40852
- server.listen(0, host, () => {
40809
+ server.listen(0, "127.0.0.1", () => {
40853
40810
  server.off("error", fail);
40854
40811
  done();
40855
40812
  });
@@ -40857,14 +40814,58 @@ async function startProtectedShare(host, handle) {
40857
40814
  const address = server.address();
40858
40815
  if (!address || typeof address === "string")
40859
40816
  throw new Error("No Wi-Fi server address");
40860
- return { port: address.port, username, password, authorization, cert, fingerprint, close };
40817
+ return { port: address.port, username, password, authorization, close };
40818
+ } catch (error) {
40819
+ await close();
40820
+ throw error;
40821
+ }
40822
+ }
40823
+ var init_protected_share = () => {};
40824
+
40825
+ // packages/preview/src/tailscale-share.ts
40826
+ import { execFile as execFile6 } from "node:child_process";
40827
+ import { promisify } from "node:util";
40828
+ async function serveConfig() {
40829
+ const { stdout } = await run("tailscale", ["serve", "status", "--json"]);
40830
+ return JSON.parse(stdout);
40831
+ }
40832
+ async function tailscaleHostname() {
40833
+ const { stdout } = await run("tailscale", ["status", "--json"]);
40834
+ const status = JSON.parse(stdout);
40835
+ const host = status.Self?.DNSName?.replace(/\.$/, "");
40836
+ if (status.BackendState !== "Running" || !host || !host.endsWith(".ts.net")) {
40837
+ throw new Error("Connect Tailscale on this Mac, then share again. The phone must use the same tailnet.");
40838
+ }
40839
+ return host;
40840
+ }
40841
+ async function startTailscaleProxy(host, port) {
40842
+ const authority = `${host}:${port}`;
40843
+ const target = `http://127.0.0.1:${port}`;
40844
+ const before = await serveConfig();
40845
+ if (before.TCP?.[String(port)] || before.Web?.[authority] || before.AllowFunnel?.[authority]) {
40846
+ throw new Error("This Tailscale port is already configured. Share again to select another port.");
40847
+ }
40848
+ const close = async () => {
40849
+ const current = await serveConfig();
40850
+ const handlers = current.Web?.[authority]?.Handlers;
40851
+ if (handlers?.["/"]?.Proxy === target && Object.keys(handlers).length === 1) {
40852
+ await run("tailscale", ["serve", `--https=${port}`, "off"]);
40853
+ }
40854
+ };
40855
+ try {
40856
+ await run("tailscale", ["serve", "--bg", "--yes", `--https=${port}`, target], { timeout: 30000 });
40857
+ const current = await serveConfig();
40858
+ if (current.AllowFunnel?.[authority] || current.Web?.[authority]?.Handlers?.["/"]?.Proxy !== target) {
40859
+ throw new Error("Tailscale did not create the expected private HTTPS proxy");
40860
+ }
40861
+ return { origin: `https://${authority}`, close };
40861
40862
  } catch (error) {
40862
40863
  await close();
40863
40864
  throw error;
40864
40865
  }
40865
40866
  }
40866
40867
  var run;
40867
- var init_protected_share = __esm(() => {
40868
+ var init_tailscale_share = __esm(() => {
40868
40869
  run = promisify(execFile6);
40869
40870
  });
40870
40871
 
@@ -40872,7 +40873,6 @@ var init_protected_share = __esm(() => {
40872
40873
  import { dirname as dirname12, resolve as resolve15 } from "node:path";
40873
40874
  import { existsSync as existsSync7, realpathSync as realpathSync4 } from "node:fs";
40874
40875
  import { fileURLToPath as fileURLToPath4 } from "node:url";
40875
- import { get } from "node:https";
40876
40876
  function splitShareArgs(input) {
40877
40877
  const options = {
40878
40878
  folder: undefined,
@@ -40941,84 +40941,65 @@ async function runningViewerRoot(port = plainViewerPort) {
40941
40941
  }
40942
40942
  return;
40943
40943
  }
40944
- async function startLanShare(target) {
40944
+ async function startPreviewShare(target) {
40945
40945
  const root = realpathSync4(target.root);
40946
40946
  const web = resolve15(dirname12(fileURLToPath4(import.meta.url)), "../../web");
40947
40947
  if (!existsSync7(resolve15(web, "index.html"))) {
40948
40948
  throw new Error("Kennel web app not found. Run the CLI build first.");
40949
40949
  }
40950
- const host = lanHost2();
40950
+ const host = await tailscaleHostname();
40951
40951
  await Promise.resolve().then(() => init_server4());
40952
40952
  process.env.KENNEL_VIEWER_HOSTS = [process.env.KENNEL_VIEWER_HOSTS, host].filter(Boolean).join(",");
40953
40953
  const api = createKennelApi({
40954
40954
  root,
40955
- host: "0.0.0.0",
40955
+ host: "127.0.0.1",
40956
40956
  remoteAccess: true,
40957
40957
  restrictToRoot: true,
40958
40958
  lockedFile: target.target ? realpathSync4(target.target) : undefined,
40959
40959
  webRoot: web
40960
40960
  });
40961
40961
  let shared;
40962
+ let proxy;
40962
40963
  const close = async () => {
40963
40964
  try {
40964
- await api.close();
40965
+ await proxy?.close();
40965
40966
  } finally {
40966
- await shared?.close();
40967
+ try {
40968
+ await shared?.close();
40969
+ } finally {
40970
+ await api.close();
40971
+ }
40967
40972
  }
40968
40973
  };
40969
40974
  try {
40970
- shared = await startProtectedShare(host, (request, response) => {
40975
+ shared = await startProtectedShare((request, response) => {
40971
40976
  api.handle(request, response);
40972
40977
  });
40973
- const url = new URL(popUrl(host, String(shared.port), {
40978
+ proxy = await startTailscaleProxy(host, shared.port);
40979
+ const path = new URL(popUrl(host, String(shared.port), {
40974
40980
  dryRun: false,
40975
- host: "0.0.0.0",
40981
+ host: "127.0.0.1",
40976
40982
  hot: false,
40977
- lan: true,
40983
+ lan: false,
40978
40984
  open: false,
40979
40985
  root,
40980
40986
  port: String(shared.port),
40981
40987
  tailscale: false,
40982
40988
  watch: false,
40983
40989
  target: target.target
40984
- }));
40985
- url.protocol = "https:";
40986
- const { cert, authorization } = shared;
40987
- const health = await new Promise((done, fail) => {
40988
- const request = get(new URL("/api/health", url), {
40989
- ca: cert,
40990
- agent: false,
40991
- headers: { Authorization: authorization }
40992
- }, (response) => {
40993
- let body = "";
40994
- response.setEncoding("utf8");
40995
- response.on("error", fail);
40996
- response.on("data", (chunk) => {
40997
- body += chunk;
40998
- });
40999
- response.on("end", () => {
41000
- try {
41001
- if (response.statusCode !== 200)
41002
- throw new Error("The Wi-Fi server did not respond");
41003
- done(JSON.parse(body));
41004
- } catch (error) {
41005
- fail(error);
41006
- }
41007
- });
41008
- });
41009
- request.setTimeout(5000, () => request.destroy(new Error("The Wi-Fi server did not respond")));
41010
- request.on("error", fail);
40990
+ })).pathname;
40991
+ const url = new URL(path, proxy.origin);
40992
+ const response = await fetch(new URL("/api/health", url), {
40993
+ headers: { Authorization: shared.authorization },
40994
+ signal: AbortSignal.timeout(30000)
41011
40995
  });
40996
+ if (!response.ok)
40997
+ throw new Error("The Tailscale share did not respond");
40998
+ const health = await response.json();
41012
40999
  if (health.viewer !== "kennel-core" || health.root !== root) {
41013
- throw new Error("The Wi-Fi server is not serving the selected folder");
41000
+ throw new Error("The Tailscale share is not serving the selected folder");
41014
41001
  }
41015
- return {
41016
- url: url.href,
41017
- username: shared.username,
41018
- password: shared.password,
41019
- fingerprint: shared.fingerprint,
41020
- close
41021
- };
41002
+ return { url: url.href, username: shared.username, password: shared.password, close };
41022
41003
  } catch (error) {
41023
41004
  await close();
41024
41005
  throw error;
@@ -41049,6 +41030,7 @@ var plainViewerPort = "5180";
41049
41030
  var init_share = __esm(() => {
41050
41031
  init_viewer();
41051
41032
  init_protected_share();
41033
+ init_tailscale_share();
41052
41034
  });
41053
41035
  init_share();
41054
41036
 
@@ -41057,5 +41039,5 @@ export {
41057
41039
  runningViewerRoot,
41058
41040
  share,
41059
41041
  splitShareArgs,
41060
- startLanShare
41042
+ startPreviewShare
41061
41043
  };
@@ -86,7 +86,7 @@ function previewTerminal(url, target, startShare) {
86
86
  `));
87
87
  };
88
88
  const shareFolder = async () => {
89
- status = "Preparing a password-protected Wi-Fi link…";
89
+ status = "Preparing a private Tailscale link…";
90
90
  render();
91
91
  try {
92
92
  share ??= startShare();
@@ -99,18 +99,17 @@ function previewTerminal(url, target, startShare) {
99
99
  }
100
100
  if (finished)
101
101
  return;
102
- status = `Wi-Fi link: ${active.url}
102
+ status = `Tailscale link: ${active.url}
103
103
  Username: ${active.username} · Password: ${active.password}
104
- Password required. Send the password separately. Same Wi-Fi only.
105
- Self-signed HTTPS (24 hours): expect a certificate warning.
106
- Verify SHA-256 before trusting the certificate:
107
- ${active.fingerprint}
104
+ Password required. Send the password separately.
105
+ Connect Tailscale on your phone to the same tailnet.
106
+ Trusted HTTPS; no certificate installation required.
108
107
  Keep this command running. Ctrl+C stops sharing.`;
109
108
  render();
110
109
  try {
111
110
  await copyPreviewLink(active.url);
112
111
  status += `
113
- Wi-Fi link copied to clipboard (without the password).`;
112
+ Tailscale link copied to clipboard (without the password).`;
114
113
  } catch (error) {
115
114
  status += `
116
115
  Could not copy link: ${terminalText(error instanceof Error ? error.message : String(error))}`;
@@ -137,7 +136,7 @@ function previewTerminal(url, target, startShare) {
137
136
  }
138
137
  if (share) {
139
138
  share.then((active) => active.close()).catch((error) => {
140
- console.error(` Wi-Fi share stopped: ${error instanceof Error ? error.message : error}`);
139
+ console.error(` Could not stop the Tailscale share: ${error instanceof Error ? error.message : error}`);
141
140
  }).finally(() => resolveClosed());
142
141
  } else
143
142
  resolveClosed();
@@ -209,8 +208,8 @@ function previewTerminal(url, target, startShare) {
209
208
  // packages/cli/src/site/terminal.ts
210
209
  function previewTerminal2(url, target) {
211
210
  return previewTerminal(url, target, async () => {
212
- const { startLanShare } = await import(new URL("../package/preview.js", import.meta.url).href);
213
- return startLanShare(target);
211
+ const { startPreviewShare } = await import(new URL("../package/preview.js", import.meta.url).href);
212
+ return startPreviewShare(target);
214
213
  });
215
214
  }
216
215
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kennel",
3
- "version": "0.2.27",
3
+ "version": "0.2.29",
4
4
  "description": "Open-source pop-up previews for AI output: markdown, HTML artifacts, email, images, code, tables, notes, and calendars, from the terminal or your agent session.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -67,7 +67,7 @@
67
67
  "effect": "^3.19.7",
68
68
  "esbuild": "^0.27.0",
69
69
  "kennel-mcp": "https://registry.npmjs.org/%40raggle-ai%2fkennel-mcp/-/kennel-mcp-0.1.8.tgz",
70
- "kennel-plugins": "0.1.11",
70
+ "kennel-plugins": "0.1.12",
71
71
  "koffi": "^3.3.1",
72
72
  "lucide-react": "^0.562.0",
73
73
  "radix-ui": "^1.6.7",
@@ -1 +1 @@
1
- import{g as p,r as u,d as a}from"./chunk-MOJQB5TN-BSlB5ICN.js";import{p as f}from"./chunk-JWPE2WC7-DotlQGla.js";import{_ as n,l as o}from"./mermaid.core-BIJiZKob.js";import{b as c,M as d}from"./cynefin-VYW2F7L2-D-wd85t1.js";import"./index-DmJQJIC1.js";import"./react-DELVxLrX.js";import"./markdown-BP-54rPU.js";import"./tanstack-CRaSxWtK.js";var v=c().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),m=t?parseInt(t,10):0,l=s?parseInt(s,10):1/0;return{min:m,max:l}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new d(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},C={parser:R,db:a,renderer:u,styles:p};export{C as diagram};
1
+ import{g as p,r as u,d as a}from"./chunk-MOJQB5TN-NHmi6U-6.js";import{p as f}from"./chunk-JWPE2WC7-CB7J3YAt.js";import{_ as n,l as o}from"./mermaid.core-C_STxONh.js";import{b as c,M as d}from"./cynefin-VYW2F7L2-DRgOkHBE.js";import"./index-CSVH3QUs.js";import"./react-DELVxLrX.js";import"./markdown-BP-54rPU.js";import"./tanstack-CRaSxWtK.js";var v=c().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),m=t?parseInt(t,10):0,l=s?parseInt(s,10):1/0;return{min:m,max:l}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new d(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},C={parser:R,db:a,renderer:u,styles:p};export{C as diagram};