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.
- package/dist/core/runtime.js +64 -73
- package/dist/package/preview.js +67 -75
- package/package.json +2 -2
- package/web/assets/{abnfDiagram-VRR7QNED-Bn80ZKWr.js → abnfDiagram-VRR7QNED-DPZyna8O.js} +1 -1
- package/web/assets/{arc-DYtldBwv.js → arc-BAcU9y_V.js} +1 -1
- package/web/assets/{architectureDiagram-ZJ3FMSHR-Q8wivs2p.js → architectureDiagram-ZJ3FMSHR-D5yd7Cag.js} +1 -1
- package/web/assets/{ask-tray-PMT6VVXN-DNWm9l0M.js → ask-tray-PMT6VVXN-C4dJH21Q.js} +3 -3
- package/web/assets/{blockDiagram-677ZJIJ3-VzYV-AA6.js → blockDiagram-677ZJIJ3-C7LSGyxV.js} +1 -1
- package/web/assets/{c4Diagram-LMCZKHZV-BEh1NlA0.js → c4Diagram-LMCZKHZV-BW2KfoQr.js} +1 -1
- package/web/assets/channel-um92dqpm.js +1 -0
- package/web/assets/{chunk-2Q5K7J3B-VMcfJfhB.js → chunk-2Q5K7J3B-4Og6VAFG.js} +1 -1
- package/web/assets/{chunk-32BRIVSS-CnIckQlR.js → chunk-32BRIVSS-BYOowQl5.js} +1 -1
- package/web/assets/{chunk-5VM5RSS4-B7NdDHyk.js → chunk-5VM5RSS4-C1m-lq64.js} +1 -1
- package/web/assets/{chunk-EX3LRPZG-CLmNzhNw.js → chunk-EX3LRPZG-B2hriRpJ.js} +1 -1
- package/web/assets/{chunk-JWPE2WC7-CB7J3YAt.js → chunk-JWPE2WC7-C6RsnzVA.js} +1 -1
- package/web/assets/{chunk-MOJQB5TN-NHmi6U-6.js → chunk-MOJQB5TN-yKbMmUWf.js} +1 -1
- package/web/assets/{chunk-RYQCIY6F-D8mdIHdH.js → chunk-RYQCIY6F-BOokm3Qc.js} +1 -1
- package/web/assets/{chunk-V7JOEXUC-ebyFygjO.js → chunk-V7JOEXUC-CKW-H5An.js} +1 -1
- package/web/assets/{chunk-VR4S4FIN-DdRcpv9A.js → chunk-VR4S4FIN-BU5pFrup.js} +1 -1
- package/web/assets/{chunk-XXDRQBXY-CaDFu2On.js → chunk-XXDRQBXY-DYtdSJHU.js} +1 -1
- package/web/assets/classDiagram-OUVF2IWQ-h7sFEJBg.js +1 -0
- package/web/assets/classDiagram-v2-EOCWNBFH-h7sFEJBg.js +1 -0
- package/web/assets/{cose-bilkent-JH36ORCC-PjfFnCxS.js → cose-bilkent-JH36ORCC-BZeXtC6E.js} +1 -1
- package/web/assets/{cynefin-VYW2F7L2-DRgOkHBE.js → cynefin-VYW2F7L2-BSDVyzMI.js} +1 -1
- package/web/assets/{cynefinDiagram-TSTJHNR4-DrY10Xz3.js → cynefinDiagram-TSTJHNR4-CReoDBYo.js} +1 -1
- package/web/assets/{dagre-VKFMJZFB-Bscwbkne.js → dagre-VKFMJZFB-CBLLzMxd.js} +1 -1
- package/web/assets/{diagram-FQU43EPY-CEagDGS8.js → diagram-FQU43EPY-BcGWiZXZ.js} +1 -1
- package/web/assets/{diagram-G47NLZAW-BZhMoJam.js → diagram-G47NLZAW-BXUYZA9N.js} +1 -1
- package/web/assets/{diagram-NH7WQ7WH-Cj6Bu-O4.js → diagram-NH7WQ7WH-BrvrZs7N.js} +1 -1
- package/web/assets/{diagram-OA4YK3LP-Bnr8Sd0b.js → diagram-OA4YK3LP-7lnVcjXL.js} +1 -1
- package/web/assets/{diagram-WEI45ONY-CRMqzsgH.js → diagram-WEI45ONY-s58_bMFf.js} +1 -1
- package/web/assets/{ebnfDiagram-CCIWWBDH-CAbB-8JZ.js → ebnfDiagram-CCIWWBDH-BemWecoD.js} +1 -1
- package/web/assets/{entity-search-page-G6QEQNXT-CRfdTtti.js → entity-search-page-G6QEQNXT--sKP5dP3.js} +1 -1
- package/web/assets/{erDiagram-Q63AITRT-C8RUnhzS.js → erDiagram-Q63AITRT-ClVJddch.js} +1 -1
- package/web/assets/{flowDiagram-23GEKE2U-Bsr7qout.js → flowDiagram-23GEKE2U-xzUJu-i_.js} +1 -1
- package/web/assets/{ganttDiagram-NO4QXBWP-Cj4c0JYQ.js → ganttDiagram-NO4QXBWP-CXQmtF5g.js} +1 -1
- package/web/assets/{gitGraphDiagram-IHSO6WYX-Bs314gD3.js → gitGraphDiagram-IHSO6WYX-DCdljcLl.js} +1 -1
- package/web/assets/{index-CSVH3QUs.js → index-CtTx1o2d.js} +43 -43
- package/web/assets/{infoDiagram-FWYZ7A6U-DH-cmVkX.js → infoDiagram-FWYZ7A6U-B11SJYSK.js} +1 -1
- package/web/assets/{ishikawaDiagram-FXEZZL3T-BDJNBoGn.js → ishikawaDiagram-FXEZZL3T-B2CCGlAm.js} +1 -1
- package/web/assets/{journeyDiagram-5HDEW3XC-BPzolpTl.js → journeyDiagram-5HDEW3XC-CBPETzOk.js} +1 -1
- package/web/assets/{kanban-definition-HUTT4EX6-Cbwk3hWN.js → kanban-definition-HUTT4EX6-unhQ3RPE.js} +1 -1
- package/web/assets/{linear-C_hmEwuP.js → linear-DuP_pG51.js} +1 -1
- package/web/assets/{linked-session-header-M7WY6IGF-wWopBTMB.js → linked-session-header-M7WY6IGF-DwlNCJlj.js} +1 -1
- package/web/assets/{mermaid.core-C_STxONh.js → mermaid.core-BlYNzkpn.js} +4 -4
- package/web/assets/{mindmap-definition-LN4V7U3C-t11NOd4O.js → mindmap-definition-LN4V7U3C-CtKHN6O1.js} +1 -1
- package/web/assets/{pegDiagram-2B236MQR-DJfAH7lH.js → pegDiagram-2B236MQR-CRyz6XWY.js} +1 -1
- package/web/assets/{pieDiagram-ENE6RG2P-CWUBmV0d.js → pieDiagram-ENE6RG2P-BXfkPm3Q.js} +1 -1
- package/web/assets/{plugin-host-modules-DJHbqQhr.js → plugin-host-modules-5NQgs5Cq.js} +1 -1
- package/web/assets/{project-search-dialog-HJFGW4DG-BXLg3396.js → project-search-dialog-HJFGW4DG-DPly4OiB.js} +1 -1
- package/web/assets/{project-search-page-NKQEBGPF-vTDDUXOQ.js → project-search-page-NKQEBGPF-Cc6HV7BN.js} +1 -1
- package/web/assets/{quadrantDiagram-ABIIQ3AL-D3VESec_.js → quadrantDiagram-ABIIQ3AL-Drb_qWex.js} +1 -1
- package/web/assets/{railroadDiagram-RFXS5EU6-n_5zh_mW.js → railroadDiagram-RFXS5EU6-DCKk2Pix.js} +1 -1
- package/web/assets/{requirementDiagram-TGXJPOKE-DOEJVC4O.js → requirementDiagram-TGXJPOKE-6WwZwcpD.js} +1 -1
- package/web/assets/{sankeyDiagram-HTMAVEWB-p-X5ZPgN.js → sankeyDiagram-HTMAVEWB-DGGk3WCE.js} +1 -1
- package/web/assets/{selection-popup-532EHNCZ-DR8C-3fL.js → selection-popup-532EHNCZ-yPhTrk7L.js} +1 -1
- package/web/assets/{sequenceDiagram-DBY2YBRQ-BAas_TGB.js → sequenceDiagram-DBY2YBRQ-a4tGi3DH.js} +1 -1
- package/web/assets/{sizeCapture-X5ZJPWSS-CgQwiack.js → sizeCapture-X5ZJPWSS-CHehBmy9.js} +1 -1
- package/web/assets/{stateDiagram-2N3HPSRC-DRizvoeL.js → stateDiagram-2N3HPSRC-Bn9GSWgV.js} +1 -1
- package/web/assets/{stateDiagram-v2-6OUMAXLB-BJdHb7cS.js → stateDiagram-v2-6OUMAXLB-DI7fdBd7.js} +1 -1
- package/web/assets/{swimlanes-5IMT3BWC-CuKRbnuf.js → swimlanes-5IMT3BWC-BX0WRzfR.js} +2 -2
- package/web/assets/swimlanesDiagram-G3AALYLV-OGHC9nqi.js +8 -0
- package/web/assets/{timeline-definition-FHXFAJF6-BKzroj6g.js → timeline-definition-FHXFAJF6-9Ni2kIzq.js} +1 -1
- package/web/assets/{vennDiagram-L72KCM5P-DO-bKMoT.js → vennDiagram-L72KCM5P-rfBSNh3U.js} +1 -1
- package/web/assets/{wardleyDiagram-EHGQE667-BQQVafvV.js → wardleyDiagram-EHGQE667-CzziImCC.js} +1 -1
- package/web/assets/{xychartDiagram-FW5EYKEG-TZiE1TnS.js → xychartDiagram-FW5EYKEG-DTLI4h5R.js} +1 -1
- package/web/index.html +1 -1
- package/dist/site/folder-icons.d.ts +0 -39
- package/dist/site/folder-icons.js +0 -68
- package/web/assets/channel-CPeCBcEl.js +0 -1
- package/web/assets/classDiagram-OUVF2IWQ-3AGK8leR.js +0 -1
- package/web/assets/classDiagram-v2-EOCWNBFH-3AGK8leR.js +0 -1
- package/web/assets/swimlanesDiagram-G3AALYLV-CjKn7pGa.js +0 -8
package/dist/core/runtime.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
38707
|
+
const assets = await hydrateFolderIcons(metadata, assetFiles);
|
|
38717
38708
|
const body = {
|
|
38718
38709
|
...metadata,
|
|
38719
38710
|
...assets,
|
package/dist/package/preview.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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,
|
|
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.
|
|
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.
|
|
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-
|
|
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-
|
|
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};
|