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.
- package/dist/core/runtime.js +15 -15
- package/dist/package/preview.d.ts +1 -1
- package/dist/package/preview.js +103 -121
- package/dist/site/terminal.js +9 -10
- package/package.json +2 -2
- package/web/assets/{abnfDiagram-VRR7QNED-CIyEzNaJ.js → abnfDiagram-VRR7QNED-Bn80ZKWr.js} +1 -1
- package/web/assets/{arc-Dba3y3eW.js → arc-DYtldBwv.js} +1 -1
- package/web/assets/{architectureDiagram-ZJ3FMSHR-DjFjO3tR.js → architectureDiagram-ZJ3FMSHR-Q8wivs2p.js} +1 -1
- package/web/assets/{ask-tray-PMT6VVXN-ButKBzsY.js → ask-tray-PMT6VVXN-DNWm9l0M.js} +3 -3
- package/web/assets/{blockDiagram-677ZJIJ3-C8ZQgtnK.js → blockDiagram-677ZJIJ3-VzYV-AA6.js} +1 -1
- package/web/assets/{c4Diagram-LMCZKHZV-DhWn2tZm.js → c4Diagram-LMCZKHZV-BEh1NlA0.js} +1 -1
- package/web/assets/channel-CPeCBcEl.js +1 -0
- package/web/assets/{chunk-2Q5K7J3B-BEkPxYAB.js → chunk-2Q5K7J3B-VMcfJfhB.js} +1 -1
- package/web/assets/{chunk-32BRIVSS-BZ0ofM9m.js → chunk-32BRIVSS-CnIckQlR.js} +1 -1
- package/web/assets/{chunk-5VM5RSS4-CTgBiom0.js → chunk-5VM5RSS4-B7NdDHyk.js} +1 -1
- package/web/assets/{chunk-EX3LRPZG-B7lDJEfz.js → chunk-EX3LRPZG-CLmNzhNw.js} +1 -1
- package/web/assets/{chunk-JWPE2WC7-DotlQGla.js → chunk-JWPE2WC7-CB7J3YAt.js} +1 -1
- package/web/assets/{chunk-MOJQB5TN-BSlB5ICN.js → chunk-MOJQB5TN-NHmi6U-6.js} +1 -1
- package/web/assets/{chunk-RYQCIY6F-BbDvgRvj.js → chunk-RYQCIY6F-D8mdIHdH.js} +1 -1
- package/web/assets/{chunk-V7JOEXUC-CqC2yHBO.js → chunk-V7JOEXUC-ebyFygjO.js} +1 -1
- package/web/assets/{chunk-VR4S4FIN-18aLOCVw.js → chunk-VR4S4FIN-DdRcpv9A.js} +1 -1
- package/web/assets/{chunk-XXDRQBXY-uulB67ep.js → chunk-XXDRQBXY-CaDFu2On.js} +1 -1
- package/web/assets/classDiagram-OUVF2IWQ-3AGK8leR.js +1 -0
- package/web/assets/classDiagram-v2-EOCWNBFH-3AGK8leR.js +1 -0
- package/web/assets/{cose-bilkent-JH36ORCC-C8yqL7ml.js → cose-bilkent-JH36ORCC-PjfFnCxS.js} +1 -1
- package/web/assets/{cynefin-VYW2F7L2-D-wd85t1.js → cynefin-VYW2F7L2-DRgOkHBE.js} +1 -1
- package/web/assets/{cynefinDiagram-TSTJHNR4-rrV6rLov.js → cynefinDiagram-TSTJHNR4-DrY10Xz3.js} +1 -1
- package/web/assets/{dagre-VKFMJZFB-BxwiLhMr.js → dagre-VKFMJZFB-Bscwbkne.js} +1 -1
- package/web/assets/{diagram-FQU43EPY-8sr7lcj4.js → diagram-FQU43EPY-CEagDGS8.js} +1 -1
- package/web/assets/{diagram-G47NLZAW-BQIU_Mie.js → diagram-G47NLZAW-BZhMoJam.js} +1 -1
- package/web/assets/{diagram-NH7WQ7WH-Bt-xVbVq.js → diagram-NH7WQ7WH-Cj6Bu-O4.js} +1 -1
- package/web/assets/{diagram-OA4YK3LP-p-i-3cps.js → diagram-OA4YK3LP-Bnr8Sd0b.js} +1 -1
- package/web/assets/{diagram-WEI45ONY-E6t6-_mU.js → diagram-WEI45ONY-CRMqzsgH.js} +1 -1
- package/web/assets/{ebnfDiagram-CCIWWBDH-DCszfyU3.js → ebnfDiagram-CCIWWBDH-CAbB-8JZ.js} +1 -1
- package/web/assets/{entity-search-page-G6QEQNXT-D6cvoqrF.js → entity-search-page-G6QEQNXT-CRfdTtti.js} +1 -1
- package/web/assets/{erDiagram-Q63AITRT-C4gBewIM.js → erDiagram-Q63AITRT-C8RUnhzS.js} +1 -1
- package/web/assets/{flowDiagram-23GEKE2U-BEyFAV-g.js → flowDiagram-23GEKE2U-Bsr7qout.js} +1 -1
- package/web/assets/{ganttDiagram-NO4QXBWP-Bat5BF2x.js → ganttDiagram-NO4QXBWP-Cj4c0JYQ.js} +1 -1
- package/web/assets/{gitGraphDiagram-IHSO6WYX-CGZs8b5E.js → gitGraphDiagram-IHSO6WYX-Bs314gD3.js} +1 -1
- package/web/assets/{index-DmJQJIC1.js → index-CSVH3QUs.js} +4 -4
- package/web/assets/{index-tpV2etC4.css → index-vjrhIAJn.css} +1 -1
- package/web/assets/{infoDiagram-FWYZ7A6U-Cglwuazb.js → infoDiagram-FWYZ7A6U-DH-cmVkX.js} +1 -1
- package/web/assets/{ishikawaDiagram-FXEZZL3T-C95-Gz9z.js → ishikawaDiagram-FXEZZL3T-BDJNBoGn.js} +1 -1
- package/web/assets/{journeyDiagram-5HDEW3XC-C055Trr6.js → journeyDiagram-5HDEW3XC-BPzolpTl.js} +1 -1
- package/web/assets/{kanban-definition-HUTT4EX6-CznSv3_t.js → kanban-definition-HUTT4EX6-Cbwk3hWN.js} +1 -1
- package/web/assets/{linear-CnWGyi6E.js → linear-C_hmEwuP.js} +1 -1
- package/web/assets/{linked-session-header-M7WY6IGF-BFioq_q7.js → linked-session-header-M7WY6IGF-wWopBTMB.js} +1 -1
- package/web/assets/{mermaid.core-BIJiZKob.js → mermaid.core-C_STxONh.js} +4 -4
- package/web/assets/{mindmap-definition-LN4V7U3C-k97sTi1e.js → mindmap-definition-LN4V7U3C-t11NOd4O.js} +1 -1
- package/web/assets/{pegDiagram-2B236MQR-C-4ETzyd.js → pegDiagram-2B236MQR-DJfAH7lH.js} +1 -1
- package/web/assets/{pieDiagram-ENE6RG2P-CH8gYIx3.js → pieDiagram-ENE6RG2P-CWUBmV0d.js} +1 -1
- package/web/assets/{plugin-host-modules-BI0aGGBk.js → plugin-host-modules-DJHbqQhr.js} +1 -1
- package/web/assets/{project-search-dialog-HJFGW4DG-DC6mBFkm.js → project-search-dialog-HJFGW4DG-BXLg3396.js} +1 -1
- package/web/assets/{project-search-page-NKQEBGPF-B0OxN-l5.js → project-search-page-NKQEBGPF-vTDDUXOQ.js} +1 -1
- package/web/assets/{quadrantDiagram-ABIIQ3AL-BFV2fyQY.js → quadrantDiagram-ABIIQ3AL-D3VESec_.js} +1 -1
- package/web/assets/{railroadDiagram-RFXS5EU6-Dxj8XtW1.js → railroadDiagram-RFXS5EU6-n_5zh_mW.js} +1 -1
- package/web/assets/{requirementDiagram-TGXJPOKE-Drb3A2JL.js → requirementDiagram-TGXJPOKE-DOEJVC4O.js} +1 -1
- package/web/assets/{sankeyDiagram-HTMAVEWB-DP7Lyg91.js → sankeyDiagram-HTMAVEWB-p-X5ZPgN.js} +1 -1
- package/web/assets/{selection-popup-532EHNCZ-C8EBNgOw.js → selection-popup-532EHNCZ-DR8C-3fL.js} +1 -1
- package/web/assets/{sequenceDiagram-DBY2YBRQ-6qzKd9e_.js → sequenceDiagram-DBY2YBRQ-BAas_TGB.js} +1 -1
- package/web/assets/{sizeCapture-X5ZJPWSS-DhCU_-w6.js → sizeCapture-X5ZJPWSS-CgQwiack.js} +1 -1
- package/web/assets/{stateDiagram-2N3HPSRC-C_BN15Uj.js → stateDiagram-2N3HPSRC-DRizvoeL.js} +1 -1
- package/web/assets/{stateDiagram-v2-6OUMAXLB-DtNCoZjH.js → stateDiagram-v2-6OUMAXLB-BJdHb7cS.js} +1 -1
- package/web/assets/{swimlanes-5IMT3BWC-CW-FMmDB.js → swimlanes-5IMT3BWC-CuKRbnuf.js} +2 -2
- package/web/assets/swimlanesDiagram-G3AALYLV-CjKn7pGa.js +8 -0
- package/web/assets/{timeline-definition-FHXFAJF6-VX8Kq-Hg.js → timeline-definition-FHXFAJF6-BKzroj6g.js} +1 -1
- package/web/assets/{vennDiagram-L72KCM5P-DU3qCuRJ.js → vennDiagram-L72KCM5P-DO-bKMoT.js} +1 -1
- package/web/assets/{wardleyDiagram-EHGQE667-CAA7wYyD.js → wardleyDiagram-EHGQE667-BQQVafvV.js} +1 -1
- package/web/assets/{xychartDiagram-FW5EYKEG-B-GbIjdQ.js → xychartDiagram-FW5EYKEG-TZiE1TnS.js} +1 -1
- package/web/index.html +2 -2
- package/web/assets/channel-BuqSObVl.js +0 -1
- package/web/assets/classDiagram-OUVF2IWQ-xfk1LZB_.js +0 -1
- package/web/assets/classDiagram-v2-EOCWNBFH-xfk1LZB_.js +0 -1
- package/web/assets/swimlanesDiagram-G3AALYLV-Cak69Ty7.js +0 -8
package/dist/core/runtime.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
10
|
+
export declare function startPreviewShare(target: {
|
|
11
11
|
root: string;
|
|
12
12
|
target?: string;
|
|
13
13
|
}): Promise<import("kennel-preview/terminal").PreviewShare>;
|
package/dist/package/preview.js
CHANGED
|
@@ -297,7 +297,7 @@ function previewTerminal(url, target, startShare) {
|
|
|
297
297
|
`));
|
|
298
298
|
};
|
|
299
299
|
const shareFolder = async () => {
|
|
300
|
-
status = "Preparing a
|
|
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 = `
|
|
313
|
+
status = `Tailscale link: ${active.url}
|
|
314
314
|
Username: ${active.username} · Password: ${active.password}
|
|
315
|
-
Password required. Send the password separately.
|
|
316
|
-
|
|
317
|
-
|
|
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
|
-
|
|
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(`
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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 {
|
|
40767
|
-
import {
|
|
40768
|
-
|
|
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(
|
|
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,
|
|
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,
|
|
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
|
|
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
|
|
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 =
|
|
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: "
|
|
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
|
|
40965
|
+
await proxy?.close();
|
|
40965
40966
|
} finally {
|
|
40966
|
-
|
|
40967
|
+
try {
|
|
40968
|
+
await shared?.close();
|
|
40969
|
+
} finally {
|
|
40970
|
+
await api.close();
|
|
40971
|
+
}
|
|
40967
40972
|
}
|
|
40968
40973
|
};
|
|
40969
40974
|
try {
|
|
40970
|
-
shared = await startProtectedShare(
|
|
40975
|
+
shared = await startProtectedShare((request, response) => {
|
|
40971
40976
|
api.handle(request, response);
|
|
40972
40977
|
});
|
|
40973
|
-
|
|
40978
|
+
proxy = await startTailscaleProxy(host, shared.port);
|
|
40979
|
+
const path = new URL(popUrl(host, String(shared.port), {
|
|
40974
40980
|
dryRun: false,
|
|
40975
|
-
host: "
|
|
40981
|
+
host: "127.0.0.1",
|
|
40976
40982
|
hot: false,
|
|
40977
|
-
lan:
|
|
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
|
|
40986
|
-
const
|
|
40987
|
-
|
|
40988
|
-
|
|
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
|
|
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
|
-
|
|
41042
|
+
startPreviewShare
|
|
41061
41043
|
};
|
package/dist/site/terminal.js
CHANGED
|
@@ -86,7 +86,7 @@ function previewTerminal(url, target, startShare) {
|
|
|
86
86
|
`));
|
|
87
87
|
};
|
|
88
88
|
const shareFolder = async () => {
|
|
89
|
-
status = "Preparing a
|
|
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 = `
|
|
102
|
+
status = `Tailscale link: ${active.url}
|
|
103
103
|
Username: ${active.username} · Password: ${active.password}
|
|
104
|
-
Password required. Send the password separately.
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
|
|
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(`
|
|
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 {
|
|
213
|
-
return
|
|
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.
|
|
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.
|
|
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-
|
|
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};
|