kennel 0.2.29 → 0.2.31

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 (73) hide show
  1. package/dist/core/runtime.js +64 -73
  2. package/dist/package/preview.js +67 -75
  3. package/package.json +2 -2
  4. package/web/assets/{abnfDiagram-VRR7QNED-Bn80ZKWr.js → abnfDiagram-VRR7QNED-DPZyna8O.js} +1 -1
  5. package/web/assets/{arc-DYtldBwv.js → arc-BAcU9y_V.js} +1 -1
  6. package/web/assets/{architectureDiagram-ZJ3FMSHR-Q8wivs2p.js → architectureDiagram-ZJ3FMSHR-D5yd7Cag.js} +1 -1
  7. package/web/assets/{ask-tray-PMT6VVXN-DNWm9l0M.js → ask-tray-PMT6VVXN-C4dJH21Q.js} +3 -3
  8. package/web/assets/{blockDiagram-677ZJIJ3-VzYV-AA6.js → blockDiagram-677ZJIJ3-C7LSGyxV.js} +1 -1
  9. package/web/assets/{c4Diagram-LMCZKHZV-BEh1NlA0.js → c4Diagram-LMCZKHZV-BW2KfoQr.js} +1 -1
  10. package/web/assets/channel-um92dqpm.js +1 -0
  11. package/web/assets/{chunk-2Q5K7J3B-VMcfJfhB.js → chunk-2Q5K7J3B-4Og6VAFG.js} +1 -1
  12. package/web/assets/{chunk-32BRIVSS-CnIckQlR.js → chunk-32BRIVSS-BYOowQl5.js} +1 -1
  13. package/web/assets/{chunk-5VM5RSS4-B7NdDHyk.js → chunk-5VM5RSS4-C1m-lq64.js} +1 -1
  14. package/web/assets/{chunk-EX3LRPZG-CLmNzhNw.js → chunk-EX3LRPZG-B2hriRpJ.js} +1 -1
  15. package/web/assets/{chunk-JWPE2WC7-CB7J3YAt.js → chunk-JWPE2WC7-C6RsnzVA.js} +1 -1
  16. package/web/assets/{chunk-MOJQB5TN-NHmi6U-6.js → chunk-MOJQB5TN-yKbMmUWf.js} +1 -1
  17. package/web/assets/{chunk-RYQCIY6F-D8mdIHdH.js → chunk-RYQCIY6F-BOokm3Qc.js} +1 -1
  18. package/web/assets/{chunk-V7JOEXUC-ebyFygjO.js → chunk-V7JOEXUC-CKW-H5An.js} +1 -1
  19. package/web/assets/{chunk-VR4S4FIN-DdRcpv9A.js → chunk-VR4S4FIN-BU5pFrup.js} +1 -1
  20. package/web/assets/{chunk-XXDRQBXY-CaDFu2On.js → chunk-XXDRQBXY-DYtdSJHU.js} +1 -1
  21. package/web/assets/classDiagram-OUVF2IWQ-h7sFEJBg.js +1 -0
  22. package/web/assets/classDiagram-v2-EOCWNBFH-h7sFEJBg.js +1 -0
  23. package/web/assets/{cose-bilkent-JH36ORCC-PjfFnCxS.js → cose-bilkent-JH36ORCC-BZeXtC6E.js} +1 -1
  24. package/web/assets/{cynefin-VYW2F7L2-DRgOkHBE.js → cynefin-VYW2F7L2-BSDVyzMI.js} +1 -1
  25. package/web/assets/{cynefinDiagram-TSTJHNR4-DrY10Xz3.js → cynefinDiagram-TSTJHNR4-CReoDBYo.js} +1 -1
  26. package/web/assets/{dagre-VKFMJZFB-Bscwbkne.js → dagre-VKFMJZFB-CBLLzMxd.js} +1 -1
  27. package/web/assets/{diagram-FQU43EPY-CEagDGS8.js → diagram-FQU43EPY-BcGWiZXZ.js} +1 -1
  28. package/web/assets/{diagram-G47NLZAW-BZhMoJam.js → diagram-G47NLZAW-BXUYZA9N.js} +1 -1
  29. package/web/assets/{diagram-NH7WQ7WH-Cj6Bu-O4.js → diagram-NH7WQ7WH-BrvrZs7N.js} +1 -1
  30. package/web/assets/{diagram-OA4YK3LP-Bnr8Sd0b.js → diagram-OA4YK3LP-7lnVcjXL.js} +1 -1
  31. package/web/assets/{diagram-WEI45ONY-CRMqzsgH.js → diagram-WEI45ONY-s58_bMFf.js} +1 -1
  32. package/web/assets/{ebnfDiagram-CCIWWBDH-CAbB-8JZ.js → ebnfDiagram-CCIWWBDH-BemWecoD.js} +1 -1
  33. package/web/assets/{entity-search-page-G6QEQNXT-CRfdTtti.js → entity-search-page-G6QEQNXT--sKP5dP3.js} +1 -1
  34. package/web/assets/{erDiagram-Q63AITRT-C8RUnhzS.js → erDiagram-Q63AITRT-ClVJddch.js} +1 -1
  35. package/web/assets/{flowDiagram-23GEKE2U-Bsr7qout.js → flowDiagram-23GEKE2U-xzUJu-i_.js} +1 -1
  36. package/web/assets/{ganttDiagram-NO4QXBWP-Cj4c0JYQ.js → ganttDiagram-NO4QXBWP-CXQmtF5g.js} +1 -1
  37. package/web/assets/{gitGraphDiagram-IHSO6WYX-Bs314gD3.js → gitGraphDiagram-IHSO6WYX-DCdljcLl.js} +1 -1
  38. package/web/assets/{index-CSVH3QUs.js → index-CtTx1o2d.js} +43 -43
  39. package/web/assets/{infoDiagram-FWYZ7A6U-DH-cmVkX.js → infoDiagram-FWYZ7A6U-B11SJYSK.js} +1 -1
  40. package/web/assets/{ishikawaDiagram-FXEZZL3T-BDJNBoGn.js → ishikawaDiagram-FXEZZL3T-B2CCGlAm.js} +1 -1
  41. package/web/assets/{journeyDiagram-5HDEW3XC-BPzolpTl.js → journeyDiagram-5HDEW3XC-CBPETzOk.js} +1 -1
  42. package/web/assets/{kanban-definition-HUTT4EX6-Cbwk3hWN.js → kanban-definition-HUTT4EX6-unhQ3RPE.js} +1 -1
  43. package/web/assets/{linear-C_hmEwuP.js → linear-DuP_pG51.js} +1 -1
  44. package/web/assets/{linked-session-header-M7WY6IGF-wWopBTMB.js → linked-session-header-M7WY6IGF-DwlNCJlj.js} +1 -1
  45. package/web/assets/{mermaid.core-C_STxONh.js → mermaid.core-BlYNzkpn.js} +4 -4
  46. package/web/assets/{mindmap-definition-LN4V7U3C-t11NOd4O.js → mindmap-definition-LN4V7U3C-CtKHN6O1.js} +1 -1
  47. package/web/assets/{pegDiagram-2B236MQR-DJfAH7lH.js → pegDiagram-2B236MQR-CRyz6XWY.js} +1 -1
  48. package/web/assets/{pieDiagram-ENE6RG2P-CWUBmV0d.js → pieDiagram-ENE6RG2P-BXfkPm3Q.js} +1 -1
  49. package/web/assets/{plugin-host-modules-DJHbqQhr.js → plugin-host-modules-5NQgs5Cq.js} +1 -1
  50. package/web/assets/{project-search-dialog-HJFGW4DG-BXLg3396.js → project-search-dialog-HJFGW4DG-DPly4OiB.js} +1 -1
  51. package/web/assets/{project-search-page-NKQEBGPF-vTDDUXOQ.js → project-search-page-NKQEBGPF-Cc6HV7BN.js} +1 -1
  52. package/web/assets/{quadrantDiagram-ABIIQ3AL-D3VESec_.js → quadrantDiagram-ABIIQ3AL-Drb_qWex.js} +1 -1
  53. package/web/assets/{railroadDiagram-RFXS5EU6-n_5zh_mW.js → railroadDiagram-RFXS5EU6-DCKk2Pix.js} +1 -1
  54. package/web/assets/{requirementDiagram-TGXJPOKE-DOEJVC4O.js → requirementDiagram-TGXJPOKE-6WwZwcpD.js} +1 -1
  55. package/web/assets/{sankeyDiagram-HTMAVEWB-p-X5ZPgN.js → sankeyDiagram-HTMAVEWB-DGGk3WCE.js} +1 -1
  56. package/web/assets/{selection-popup-532EHNCZ-DR8C-3fL.js → selection-popup-532EHNCZ-yPhTrk7L.js} +1 -1
  57. package/web/assets/{sequenceDiagram-DBY2YBRQ-BAas_TGB.js → sequenceDiagram-DBY2YBRQ-a4tGi3DH.js} +1 -1
  58. package/web/assets/{sizeCapture-X5ZJPWSS-CgQwiack.js → sizeCapture-X5ZJPWSS-CHehBmy9.js} +1 -1
  59. package/web/assets/{stateDiagram-2N3HPSRC-DRizvoeL.js → stateDiagram-2N3HPSRC-Bn9GSWgV.js} +1 -1
  60. package/web/assets/{stateDiagram-v2-6OUMAXLB-BJdHb7cS.js → stateDiagram-v2-6OUMAXLB-DI7fdBd7.js} +1 -1
  61. package/web/assets/{swimlanes-5IMT3BWC-CuKRbnuf.js → swimlanes-5IMT3BWC-BX0WRzfR.js} +2 -2
  62. package/web/assets/swimlanesDiagram-G3AALYLV-OGHC9nqi.js +8 -0
  63. package/web/assets/{timeline-definition-FHXFAJF6-BKzroj6g.js → timeline-definition-FHXFAJF6-9Ni2kIzq.js} +1 -1
  64. package/web/assets/{vennDiagram-L72KCM5P-DO-bKMoT.js → vennDiagram-L72KCM5P-rfBSNh3U.js} +1 -1
  65. package/web/assets/{wardleyDiagram-EHGQE667-BQQVafvV.js → wardleyDiagram-EHGQE667-CzziImCC.js} +1 -1
  66. package/web/assets/{xychartDiagram-FW5EYKEG-TZiE1TnS.js → xychartDiagram-FW5EYKEG-DTLI4h5R.js} +1 -1
  67. package/web/index.html +1 -1
  68. package/dist/site/folder-icons.d.ts +0 -39
  69. package/dist/site/folder-icons.js +0 -68
  70. package/web/assets/channel-CPeCBcEl.js +0 -1
  71. package/web/assets/classDiagram-OUVF2IWQ-3AGK8leR.js +0 -1
  72. package/web/assets/classDiagram-v2-EOCWNBFH-3AGK8leR.js +0 -1
  73. package/web/assets/swimlanesDiagram-G3AALYLV-CjKn7pGa.js +0 -8
@@ -37086,12 +37086,26 @@ var iconExtensions = new Map([
37086
37086
  ["image/jpeg", "jpg"],
37087
37087
  ["image/png", "png"]
37088
37088
  ]);
37089
+ var maxSearchIconBytes = 512 * 1024;
37090
+ var searchIconTypes = new Map([
37091
+ [".gif", "image/gif"],
37092
+ [".ico", "image/x-icon"],
37093
+ [".jpeg", "image/jpeg"],
37094
+ [".jpg", "image/jpeg"],
37095
+ [".png", "image/png"],
37096
+ [".svg", "image/svg+xml"],
37097
+ [".webp", "image/webp"]
37098
+ ]);
37089
37099
  function assetKey(value) {
37090
37100
  return createHash4("sha256").update(value).digest("hex");
37091
37101
  }
37092
37102
  function encodeBase64Url(value) {
37093
37103
  return Buffer.from(value, "utf8").toString("base64").replaceAll("+", "-").replaceAll("/", "_").replaceAll("=", "");
37094
37104
  }
37105
+ function decodeBase64Url(value) {
37106
+ const padded = `${value}${"=".repeat((4 - value.length % 4) % 4)}`;
37107
+ return Buffer.from(padded.replaceAll("-", "+").replaceAll("_", "/"), "base64").toString("utf8");
37108
+ }
37095
37109
  function iconUrl(folder, hash, mediaType) {
37096
37110
  return `/api/folders/${encodeBase64Url(folder)}/assets/${hash}.${iconExtensions.get(mediaType)}`;
37097
37111
  }
@@ -37115,6 +37129,54 @@ async function folderIcon(folder, assets, assetFiles, fallback) {
37115
37129
  };
37116
37130
  return key;
37117
37131
  }
37132
+ async function searchIconDataUrl(icon) {
37133
+ if (!icon)
37134
+ return;
37135
+ if (icon.startsWith("data:"))
37136
+ return icon;
37137
+ const mediaType = searchIconTypes.get(extname4(icon).toLowerCase());
37138
+ if (!mediaType)
37139
+ return;
37140
+ const details = await stat5(icon).catch(() => {
37141
+ return;
37142
+ });
37143
+ if (!details?.size || details.size > maxSearchIconBytes)
37144
+ return;
37145
+ return `data:${mediaType};base64,${(await readFile7(icon)).toString("base64")}`;
37146
+ }
37147
+ async function faviconAsset(folderName, assets) {
37148
+ if (process.env.KENNEL_EXTERNAL_ICONS !== "1")
37149
+ return;
37150
+ const host = await folderWebsite(folderName);
37151
+ if (!host)
37152
+ return;
37153
+ const key = `favicon:${host}`;
37154
+ assets[key] = {
37155
+ mediaType: "image/png",
37156
+ source: "favicon",
37157
+ url: `/api/folder-favicon?path=${encodeURIComponent(folderName)}&host=${encodeURIComponent(host)}`
37158
+ };
37159
+ return key;
37160
+ }
37161
+ async function iconWithFaviconFallback(folder, assets, assetFiles) {
37162
+ return folderIcon(folder, assets, assetFiles, (folderName) => faviconAsset(folderName, assets));
37163
+ }
37164
+ async function hydrateFolderIcons(metadata, assetFiles) {
37165
+ const assets = {};
37166
+ const projects = metadata.projects?.items ?? [];
37167
+ const [iconAssetKey, projectItems] = await Promise.all([
37168
+ iconWithFaviconFallback(metadata.folder, assets, assetFiles),
37169
+ Promise.all(projects.map(async (project) => ({
37170
+ ...project,
37171
+ iconAssetKey: await iconWithFaviconFallback(project.worktree, assets, assetFiles)
37172
+ })))
37173
+ ]);
37174
+ return {
37175
+ assets,
37176
+ iconAssetKey,
37177
+ projects: { items: projectItems }
37178
+ };
37179
+ }
37118
37180
  async function workspaceBreadcrumbIcons(breadcrumbs, assetFiles, assets = {}) {
37119
37181
  return Promise.all(breadcrumbs.map(async (crumb) => {
37120
37182
  const iconAssetKey = await folderIcon(crumb.path, assets, assetFiles);
@@ -37691,25 +37753,6 @@ var {
37691
37753
  searchProjectIndex,
37692
37754
  sortProjectList
37693
37755
  } = local;
37694
- var maxIconBytes3 = 512 * 1024;
37695
- var iconTypes2 = new Map([
37696
- [".jpeg", "image/jpeg"],
37697
- [".jpg", "image/jpeg"],
37698
- [".png", "image/png"]
37699
- ]);
37700
- var iconExtensions2 = new Map([
37701
- ["image/jpeg", "jpg"],
37702
- ["image/png", "png"]
37703
- ]);
37704
- var searchIconTypes = new Map([
37705
- [".gif", "image/gif"],
37706
- [".ico", "image/x-icon"],
37707
- [".jpeg", "image/jpeg"],
37708
- [".jpg", "image/jpeg"],
37709
- [".png", "image/png"],
37710
- [".svg", "image/svg+xml"],
37711
- [".webp", "image/webp"]
37712
- ]);
37713
37756
  var projectSearchCacheMs = 5000;
37714
37757
  var metadataExtensions = new Set([
37715
37758
  ".html",
@@ -37785,42 +37828,6 @@ function apiHostAllowed(value, remote) {
37785
37828
  const allowlist = (process.env.KENNEL_VIEWER_HOSTS ?? "").split(",").map((host) => host.trim().toLowerCase()).filter(Boolean);
37786
37829
  return allowlist.includes(hostname);
37787
37830
  }
37788
- function decodeBase64Url(value) {
37789
- const padded = `${value}${"=".repeat((4 - value.length % 4) % 4)}`;
37790
- return Buffer.from(padded.replaceAll("-", "+").replaceAll("_", "/"), "base64").toString("utf8");
37791
- }
37792
- async function searchIconDataUrl(icon) {
37793
- if (!icon)
37794
- return;
37795
- if (icon.startsWith("data:"))
37796
- return icon;
37797
- const mediaType = searchIconTypes.get(extname6(icon).toLowerCase());
37798
- if (!mediaType)
37799
- return;
37800
- const details = await stat7(icon).catch(() => {
37801
- return;
37802
- });
37803
- if (!details?.size || details.size > maxIconBytes3)
37804
- return;
37805
- return `data:${mediaType};base64,${(await readFile8(icon)).toString("base64")}`;
37806
- }
37807
- async function faviconAsset(folderName, assets) {
37808
- if (process.env.KENNEL_EXTERNAL_ICONS !== "1")
37809
- return;
37810
- const host = await folderWebsite(folderName);
37811
- if (!host)
37812
- return;
37813
- const key = `favicon:${host}`;
37814
- assets[key] = {
37815
- mediaType: "image/png",
37816
- source: "favicon",
37817
- url: `/api/folder-favicon?path=${encodeURIComponent(folderName)}&host=${encodeURIComponent(host)}`
37818
- };
37819
- return key;
37820
- }
37821
- async function iconWithFaviconFallback(folder, assets, assetFiles) {
37822
- return folderIcon(folder, assets, assetFiles, (folderName) => faviconAsset(folderName, assets));
37823
- }
37824
37831
  async function repositoryIdentity(folder, assets) {
37825
37832
  const remoteUrl = await gitRemoteUrl(folder).catch(() => {
37826
37833
  return;
@@ -37844,22 +37851,6 @@ async function repositoryIdentity(folder, assets) {
37844
37851
  return;
37845
37852
  }
37846
37853
  }
37847
- async function hydrateAssets(metadata, assetFiles) {
37848
- const assets = {};
37849
- const projects = metadata.projects?.items ?? [];
37850
- const [iconAssetKey, projectItems] = await Promise.all([
37851
- iconWithFaviconFallback(metadata.folder, assets, assetFiles),
37852
- Promise.all(projects.map(async (project) => ({
37853
- ...project,
37854
- iconAssetKey: await iconWithFaviconFallback(project.worktree, assets, assetFiles)
37855
- })))
37856
- ]);
37857
- return {
37858
- assets,
37859
- iconAssetKey,
37860
- projects: { items: projectItems }
37861
- };
37862
- }
37863
37854
  function unique(values) {
37864
37855
  return [...new Set(values)];
37865
37856
  }
@@ -38700,7 +38691,7 @@ function createFolderApi({
38700
38691
  response.off("close", cancel);
38701
38692
  }
38702
38693
  const [hydrated, workspace] = await Promise.all([
38703
- hydrateAssets({ folder, projects: { items: projects } }, assetFiles),
38694
+ hydrateFolderIcons({ folder, projects: { items: projects } }, assetFiles),
38704
38695
  readWorkspace(folder)
38705
38696
  ]);
38706
38697
  workspace.breadcrumbs = await workspaceBreadcrumbIcons(workspace.breadcrumbs ?? [], assetFiles, hydrated.assets);
@@ -38713,7 +38704,7 @@ function createFolderApi({
38713
38704
  return;
38714
38705
  }
38715
38706
  const metadata = machine ? await shallowMetadata(folder) : await loadFolderData(folder);
38716
- const assets = await hydrateAssets(metadata, assetFiles);
38707
+ const assets = await hydrateFolderIcons(metadata, assetFiles);
38717
38708
  const body = {
38718
38709
  ...metadata,
38719
38710
  ...assets,
@@ -38723,6 +38723,10 @@ function assetKey(value) {
38723
38723
  function encodeBase64Url(value) {
38724
38724
  return Buffer.from(value, "utf8").toString("base64").replaceAll("+", "-").replaceAll("/", "_").replaceAll("=", "");
38725
38725
  }
38726
+ function decodeBase64Url2(value) {
38727
+ const padded = `${value}${"=".repeat((4 - value.length % 4) % 4)}`;
38728
+ return Buffer.from(padded.replaceAll("-", "+").replaceAll("_", "/"), "base64").toString("utf8");
38729
+ }
38726
38730
  function iconUrl(folder, hash, mediaType) {
38727
38731
  return `/api/folders/${encodeBase64Url(folder)}/assets/${hash}.${iconExtensions.get(mediaType)}`;
38728
38732
  }
@@ -38746,6 +38750,54 @@ async function folderIcon(folder, assets, assetFiles, fallback) {
38746
38750
  };
38747
38751
  return key;
38748
38752
  }
38753
+ async function searchIconDataUrl(icon) {
38754
+ if (!icon)
38755
+ return;
38756
+ if (icon.startsWith("data:"))
38757
+ return icon;
38758
+ const mediaType = searchIconTypes.get(extname4(icon).toLowerCase());
38759
+ if (!mediaType)
38760
+ return;
38761
+ const details = await stat5(icon).catch(() => {
38762
+ return;
38763
+ });
38764
+ if (!details?.size || details.size > maxSearchIconBytes)
38765
+ return;
38766
+ return `data:${mediaType};base64,${(await readFile8(icon)).toString("base64")}`;
38767
+ }
38768
+ async function faviconAsset(folderName, assets) {
38769
+ if (process.env.KENNEL_EXTERNAL_ICONS !== "1")
38770
+ return;
38771
+ const host = await folderWebsite(folderName);
38772
+ if (!host)
38773
+ return;
38774
+ const key = `favicon:${host}`;
38775
+ assets[key] = {
38776
+ mediaType: "image/png",
38777
+ source: "favicon",
38778
+ url: `/api/folder-favicon?path=${encodeURIComponent(folderName)}&host=${encodeURIComponent(host)}`
38779
+ };
38780
+ return key;
38781
+ }
38782
+ async function iconWithFaviconFallback(folder, assets, assetFiles) {
38783
+ return folderIcon(folder, assets, assetFiles, (folderName) => faviconAsset(folderName, assets));
38784
+ }
38785
+ async function hydrateFolderIcons(metadata, assetFiles) {
38786
+ const assets = {};
38787
+ const projects = metadata.projects?.items ?? [];
38788
+ const [iconAssetKey, projectItems] = await Promise.all([
38789
+ iconWithFaviconFallback(metadata.folder, assets, assetFiles),
38790
+ Promise.all(projects.map(async (project) => ({
38791
+ ...project,
38792
+ iconAssetKey: await iconWithFaviconFallback(project.worktree, assets, assetFiles)
38793
+ })))
38794
+ ]);
38795
+ return {
38796
+ assets,
38797
+ iconAssetKey,
38798
+ projects: { items: projectItems }
38799
+ };
38800
+ }
38749
38801
  async function workspaceBreadcrumbIcons(breadcrumbs, assetFiles, assets = {}) {
38750
38802
  return Promise.all(breadcrumbs.map(async (crumb) => {
38751
38803
  const iconAssetKey = await folderIcon(crumb.path, assets, assetFiles);
@@ -38753,8 +38805,9 @@ async function workspaceBreadcrumbIcons(breadcrumbs, assetFiles, assets = {}) {
38753
38805
  return icon ? { ...crumb, icon: { mediaType: icon.mediaType, url: icon.url } } : crumb;
38754
38806
  }));
38755
38807
  }
38756
- var maxIconBytes2, iconTypes, iconExtensions;
38808
+ var maxIconBytes2, iconTypes, iconExtensions, maxSearchIconBytes, searchIconTypes;
38757
38809
  var init_folder_icons = __esm(() => {
38810
+ init_folder_favicon();
38758
38811
  maxIconBytes2 = 4 * 1024 * 1024;
38759
38812
  iconTypes = new Map([
38760
38813
  [".jpeg", "image/jpeg"],
@@ -38765,6 +38818,16 @@ var init_folder_icons = __esm(() => {
38765
38818
  ["image/jpeg", "jpg"],
38766
38819
  ["image/png", "png"]
38767
38820
  ]);
38821
+ maxSearchIconBytes = 512 * 1024;
38822
+ searchIconTypes = new Map([
38823
+ [".gif", "image/gif"],
38824
+ [".ico", "image/x-icon"],
38825
+ [".jpeg", "image/jpeg"],
38826
+ [".jpg", "image/jpeg"],
38827
+ [".png", "image/png"],
38828
+ [".svg", "image/svg+xml"],
38829
+ [".webp", "image/webp"]
38830
+ ]);
38768
38831
  });
38769
38832
 
38770
38833
  // packages/notes/src/manifest.ts
@@ -39243,42 +39306,6 @@ function apiHostAllowed(value, remote) {
39243
39306
  const allowlist = (process.env.KENNEL_VIEWER_HOSTS ?? "").split(",").map((host) => host.trim().toLowerCase()).filter(Boolean);
39244
39307
  return allowlist.includes(hostname);
39245
39308
  }
39246
- function decodeBase64Url2(value) {
39247
- const padded = `${value}${"=".repeat((4 - value.length % 4) % 4)}`;
39248
- return Buffer.from(padded.replaceAll("-", "+").replaceAll("_", "/"), "base64").toString("utf8");
39249
- }
39250
- async function searchIconDataUrl(icon) {
39251
- if (!icon)
39252
- return;
39253
- if (icon.startsWith("data:"))
39254
- return icon;
39255
- const mediaType = searchIconTypes.get(extname6(icon).toLowerCase());
39256
- if (!mediaType)
39257
- return;
39258
- const details = await stat7(icon).catch(() => {
39259
- return;
39260
- });
39261
- if (!details?.size || details.size > maxIconBytes3)
39262
- return;
39263
- return `data:${mediaType};base64,${(await readFile9(icon)).toString("base64")}`;
39264
- }
39265
- async function faviconAsset(folderName, assets) {
39266
- if (process.env.KENNEL_EXTERNAL_ICONS !== "1")
39267
- return;
39268
- const host = await folderWebsite(folderName);
39269
- if (!host)
39270
- return;
39271
- const key = `favicon:${host}`;
39272
- assets[key] = {
39273
- mediaType: "image/png",
39274
- source: "favicon",
39275
- url: `/api/folder-favicon?path=${encodeURIComponent(folderName)}&host=${encodeURIComponent(host)}`
39276
- };
39277
- return key;
39278
- }
39279
- async function iconWithFaviconFallback(folder, assets, assetFiles) {
39280
- return folderIcon(folder, assets, assetFiles, (folderName) => faviconAsset(folderName, assets));
39281
- }
39282
39309
  async function repositoryIdentity(folder, assets) {
39283
39310
  const remoteUrl = await gitRemoteUrl(folder).catch(() => {
39284
39311
  return;
@@ -39302,22 +39329,6 @@ async function repositoryIdentity(folder, assets) {
39302
39329
  return;
39303
39330
  }
39304
39331
  }
39305
- async function hydrateAssets(metadata, assetFiles) {
39306
- const assets = {};
39307
- const projects = metadata.projects?.items ?? [];
39308
- const [iconAssetKey, projectItems] = await Promise.all([
39309
- iconWithFaviconFallback(metadata.folder, assets, assetFiles),
39310
- Promise.all(projects.map(async (project) => ({
39311
- ...project,
39312
- iconAssetKey: await iconWithFaviconFallback(project.worktree, assets, assetFiles)
39313
- })))
39314
- ]);
39315
- return {
39316
- assets,
39317
- iconAssetKey,
39318
- projects: { items: projectItems }
39319
- };
39320
- }
39321
39332
  function unique(values) {
39322
39333
  return [...new Set(values)];
39323
39334
  }
@@ -40155,7 +40166,7 @@ function createFolderApi({
40155
40166
  response.off("close", cancel);
40156
40167
  }
40157
40168
  const [hydrated, workspace] = await Promise.all([
40158
- hydrateAssets({ folder, projects: { items: projects } }, assetFiles),
40169
+ hydrateFolderIcons({ folder, projects: { items: projects } }, assetFiles),
40159
40170
  readWorkspace(folder)
40160
40171
  ]);
40161
40172
  workspace.breadcrumbs = await workspaceBreadcrumbIcons(workspace.breadcrumbs ?? [], assetFiles, hydrated.assets);
@@ -40168,7 +40179,7 @@ function createFolderApi({
40168
40179
  return;
40169
40180
  }
40170
40181
  const metadata = machine ? await shallowMetadata(folder) : await loadFolderData(folder);
40171
- const assets = await hydrateAssets(metadata, assetFiles);
40182
+ const assets = await hydrateFolderIcons(metadata, assetFiles);
40172
40183
  const body = {
40173
40184
  ...metadata,
40174
40185
  ...assets,
@@ -40186,7 +40197,7 @@ function createFolderApi({
40186
40197
  }
40187
40198
  };
40188
40199
  }
40189
- var applyProjectFavorites, buildProjectCatalog, buildProjectSearchIndex, catalogProjectToLocalProject, discoverProjectIcon, discoverProjectsUnderFolder, listLocalMarkdownFiles, projectRepositoryAccessory, projectSubtitle, projectTitle, readRaggleUserSettings, gitRemoteUrl, githubRepositoryPath, repositoryDisplayName, searchProjectIndex, sortProjectList, maxIconBytes3, iconTypes2, iconExtensions2, searchIconTypes, projectSearchCacheMs = 5000, metadataExtensions, loopbackServerHosts, defaultPluginRegistryConfig;
40200
+ var applyProjectFavorites, buildProjectCatalog, buildProjectSearchIndex, catalogProjectToLocalProject, discoverProjectIcon, discoverProjectsUnderFolder, listLocalMarkdownFiles, projectRepositoryAccessory, projectSubtitle, projectTitle, readRaggleUserSettings, gitRemoteUrl, githubRepositoryPath, repositoryDisplayName, searchProjectIndex, sortProjectList, projectSearchCacheMs = 5000, metadataExtensions, loopbackServerHosts, defaultPluginRegistryConfig;
40190
40201
  var init_folder_metadata_plugin = __esm(() => {
40191
40202
  init_contracts();
40192
40203
  init_markdown();
@@ -40225,25 +40236,6 @@ var init_folder_metadata_plugin = __esm(() => {
40225
40236
  searchProjectIndex,
40226
40237
  sortProjectList
40227
40238
  } = local);
40228
- maxIconBytes3 = 512 * 1024;
40229
- iconTypes2 = new Map([
40230
- [".jpeg", "image/jpeg"],
40231
- [".jpg", "image/jpeg"],
40232
- [".png", "image/png"]
40233
- ]);
40234
- iconExtensions2 = new Map([
40235
- ["image/jpeg", "jpg"],
40236
- ["image/png", "png"]
40237
- ]);
40238
- searchIconTypes = new Map([
40239
- [".gif", "image/gif"],
40240
- [".ico", "image/x-icon"],
40241
- [".jpeg", "image/jpeg"],
40242
- [".jpg", "image/jpeg"],
40243
- [".png", "image/png"],
40244
- [".svg", "image/svg+xml"],
40245
- [".webp", "image/webp"]
40246
- ]);
40247
40239
  metadataExtensions = new Set([
40248
40240
  ".html",
40249
40241
  ".jpeg",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kennel",
3
- "version": "0.2.29",
3
+ "version": "0.2.31",
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.12",
70
+ "kennel-plugins": "0.1.14",
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-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};
1
+ import{g as p,r as u,d as a}from"./chunk-MOJQB5TN-yKbMmUWf.js";import{p as f}from"./chunk-JWPE2WC7-C6RsnzVA.js";import{_ as n,l as o}from"./mermaid.core-BlYNzkpn.js";import{b as c,M as d}from"./cynefin-VYW2F7L2-BSDVyzMI.js";import"./index-CtTx1o2d.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 +1 @@
1
- import{Y as ln,$ as an,a0 as F,a1 as q,a2 as j,a3 as un,a4 as y,a5 as tn,a6 as J,a7 as _,a8 as rn,a9 as o,aa as sn,ab as on,ac as fn}from"./mermaid.core-C_STxONh.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,z,a){var O=I-l,i=D-h,n=z-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function U(l,h,I,D,v,A,z){var a=l-I,O=h-D,i=(z?A:-A)/J(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,B=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*J(on(0,T*T*R-P*P)),Y=(P*g-m*S)/R,$=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=Y-B,e=$-t,r=w-B,C=p-t;return x*x+e*e>r*r+C*C&&(Y=w,$=p),{cx:Y,cy:$,x01:-n,y01:-d,x11:Y*(v/T-1),y11:$*(v/T-1)}}function hn(){var l=cn,h=yn,I=j(0),D=null,v=gn,A=dn,z=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=A.apply(this,arguments)-un,B=rn(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(B>tn-y)a.moveTo(s*F(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*F(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=B,S=B,Y=z.apply(this,arguments)/2,$=Y>y&&(D?+D.apply(this,arguments):J(u*u+s*s)),w=_(rn(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if($>y){var C=sn($/u*q(Y)),K=sn($/s*q(Y));(P-=C*2)>y?(C*=t?1:-1,R+=C,T-=C):(P=0,R=T=(f+c)/2),(S-=K*2)>y?(K*=t?1:-1,m+=K,g-=K):(S=0,m=g=(f+c)/2)}var G=s*F(m),H=s*q(m),L=u*F(T),M=u*q(T);if(w>y){var N=s*F(g),Q=s*q(g),V=u*F(R),W=u*q(R),E;if(B<an)if(E=pn(G,H,V,W,N,Q,L,M)){var X=G-E[0],Z=H-E[1],b=N-E[0],k=Q-E[1],nn=1/q(fn((X*b+Z*k)/(J(X*X+Z*Z)*J(b*b+k*k)))/2),en=J(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=U(V,W,G,H,s,x,t),r=U(N,Q,L,M,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(G,H),a.arc(0,0,s,m,g,!t)):a.moveTo(G,H),!(u>y)||!(P>y)?a.lineTo(L,M):p>y?(e=U(L,M,N,Q,u,-p,t),r=U(G,H,V,W,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[F(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:j(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:j(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:j(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:j(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:j(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:j(+n),i):A},i.padAngle=function(n){return arguments.length?(z=typeof n=="function"?n:j(+n),i):z},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
1
+ import{Y as ln,$ as an,a0 as F,a1 as q,a2 as j,a3 as un,a4 as y,a5 as tn,a6 as J,a7 as _,a8 as rn,a9 as o,aa as sn,ab as on,ac as fn}from"./mermaid.core-BlYNzkpn.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,z,a){var O=I-l,i=D-h,n=z-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function U(l,h,I,D,v,A,z){var a=l-I,O=h-D,i=(z?A:-A)/J(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,B=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*J(on(0,T*T*R-P*P)),Y=(P*g-m*S)/R,$=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=Y-B,e=$-t,r=w-B,C=p-t;return x*x+e*e>r*r+C*C&&(Y=w,$=p),{cx:Y,cy:$,x01:-n,y01:-d,x11:Y*(v/T-1),y11:$*(v/T-1)}}function hn(){var l=cn,h=yn,I=j(0),D=null,v=gn,A=dn,z=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=A.apply(this,arguments)-un,B=rn(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(B>tn-y)a.moveTo(s*F(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*F(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=B,S=B,Y=z.apply(this,arguments)/2,$=Y>y&&(D?+D.apply(this,arguments):J(u*u+s*s)),w=_(rn(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if($>y){var C=sn($/u*q(Y)),K=sn($/s*q(Y));(P-=C*2)>y?(C*=t?1:-1,R+=C,T-=C):(P=0,R=T=(f+c)/2),(S-=K*2)>y?(K*=t?1:-1,m+=K,g-=K):(S=0,m=g=(f+c)/2)}var G=s*F(m),H=s*q(m),L=u*F(T),M=u*q(T);if(w>y){var N=s*F(g),Q=s*q(g),V=u*F(R),W=u*q(R),E;if(B<an)if(E=pn(G,H,V,W,N,Q,L,M)){var X=G-E[0],Z=H-E[1],b=N-E[0],k=Q-E[1],nn=1/q(fn((X*b+Z*k)/(J(X*X+Z*Z)*J(b*b+k*k)))/2),en=J(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=U(V,W,G,H,s,x,t),r=U(N,Q,L,M,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(G,H),a.arc(0,0,s,m,g,!t)):a.moveTo(G,H),!(u>y)||!(P>y)?a.lineTo(L,M):p>y?(e=U(L,M,N,Q,u,-p,t),r=U(G,H,V,W,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[F(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:j(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:j(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:j(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:j(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:j(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:j(+n),i):A},i.padAngle=function(n){return arguments.length?(z=typeof n=="function"?n:j(+n),i):z},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};