kennel 0.2.40 → 0.2.42
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/package/preview.js +21 -15
- package/dist/plugins/external.d.ts +5 -0
- package/dist/plugins/external.js +6 -0
- package/dist/site/hot-viewer.js +3 -3
- package/dist/site/terminal.d.ts +6 -1
- package/dist/site/terminal.js +23 -17
- package/dist/site/viewer.d.ts +3 -0
- package/dist/site/viewer.js +19 -2
- package/package.json +2 -2
- package/schemas/config.schema.json +14 -0
- package/web/assets/{abnfDiagram-VRR7QNED-BHzMGS_1.js → abnfDiagram-VRR7QNED-C95Ks6-o.js} +1 -1
- package/web/assets/{arc-DyndPQcf.js → arc-BZo1f2tP.js} +1 -1
- package/web/assets/{architectureDiagram-ZJ3FMSHR-CLHbvWQY.js → architectureDiagram-ZJ3FMSHR-DeheWY9Z.js} +1 -1
- package/web/assets/{ask-tray-KUTWZ4MV-DI1S-Fcd.js → ask-tray-KUTWZ4MV-CxvfIw9u.js} +7 -7
- package/web/assets/{blockDiagram-677ZJIJ3-BRy7iJJU.js → blockDiagram-677ZJIJ3-C2gPgefk.js} +1 -1
- package/web/assets/{c4Diagram-LMCZKHZV-DuU2GykO.js → c4Diagram-LMCZKHZV-D7eqpETg.js} +1 -1
- package/web/assets/channel-CrJW7F7C.js +1 -0
- package/web/assets/{chunk-2Q5K7J3B-C7naiN4l.js → chunk-2Q5K7J3B-CqPrOden.js} +1 -1
- package/web/assets/{chunk-32BRIVSS-BCX8TSdh.js → chunk-32BRIVSS-CxWYyFcn.js} +1 -1
- package/web/assets/{chunk-5VM5RSS4-D5Diz6V8.js → chunk-5VM5RSS4-WxfwUe_w.js} +1 -1
- package/web/assets/{chunk-EX3LRPZG-BiHKTgBl.js → chunk-EX3LRPZG-BwbKQfAB.js} +1 -1
- package/web/assets/{chunk-JWPE2WC7-D7WVPh9o.js → chunk-JWPE2WC7-CY2fyOB-.js} +1 -1
- package/web/assets/{chunk-MOJQB5TN-CBFipUDF.js → chunk-MOJQB5TN-BJb4GtCJ.js} +1 -1
- package/web/assets/{chunk-RYQCIY6F-Drg9Xrwd.js → chunk-RYQCIY6F-FZB0Ijl-.js} +1 -1
- package/web/assets/{chunk-V7JOEXUC-CwvlCwRl.js → chunk-V7JOEXUC-Bat_9367.js} +1 -1
- package/web/assets/{chunk-VR4S4FIN-2lTFtGkb.js → chunk-VR4S4FIN-BV_nIsil.js} +1 -1
- package/web/assets/{chunk-XXDRQBXY-ghZ3EH-4.js → chunk-XXDRQBXY-nZF49NM1.js} +1 -1
- package/web/assets/classDiagram-OUVF2IWQ-D9l66AaJ.js +1 -0
- package/web/assets/classDiagram-v2-EOCWNBFH-D9l66AaJ.js +1 -0
- package/web/assets/{cose-bilkent-JH36ORCC-xGLI43nJ.js → cose-bilkent-JH36ORCC-5jLaefF7.js} +1 -1
- package/web/assets/{cynefin-VYW2F7L2-D6NWRALK.js → cynefin-VYW2F7L2-D_M6zxNK.js} +1 -1
- package/web/assets/{cynefinDiagram-TSTJHNR4-CH-SnmUU.js → cynefinDiagram-TSTJHNR4-hmCcn34X.js} +1 -1
- package/web/assets/{dagre-VKFMJZFB-D8B-21Gr.js → dagre-VKFMJZFB-Brka7Xhg.js} +1 -1
- package/web/assets/{diagram-FQU43EPY-D_yiMbmD.js → diagram-FQU43EPY-BWpeshcb.js} +1 -1
- package/web/assets/{diagram-G47NLZAW-0i1tMw7V.js → diagram-G47NLZAW-Cl2XbP7n.js} +1 -1
- package/web/assets/{diagram-NH7WQ7WH-C44L1-QE.js → diagram-NH7WQ7WH-BBF0AyF6.js} +1 -1
- package/web/assets/{diagram-OA4YK3LP-y8dAByg4.js → diagram-OA4YK3LP-ggxUOgcy.js} +1 -1
- package/web/assets/{diagram-WEI45ONY-DPKSJUZt.js → diagram-WEI45ONY-5gqEm0IZ.js} +1 -1
- package/web/assets/{ebnfDiagram-CCIWWBDH-Da_kSzd7.js → ebnfDiagram-CCIWWBDH-DvOOCI9m.js} +1 -1
- package/web/assets/{entity-search-page-YP4SPMBC-CGgblVeK.js → entity-search-page-YP4SPMBC-CL6z_JLV.js} +1 -1
- package/web/assets/{erDiagram-Q63AITRT-BJqOqOsb.js → erDiagram-Q63AITRT-LMvg3eDB.js} +1 -1
- package/web/assets/{flowDiagram-23GEKE2U-DnSFeEnV.js → flowDiagram-23GEKE2U-BkWKqObX.js} +1 -1
- package/web/assets/{ganttDiagram-NO4QXBWP-CLdrPHpW.js → ganttDiagram-NO4QXBWP-DUGEnNqM.js} +1 -1
- package/web/assets/{gitGraphDiagram-IHSO6WYX-By6bnIzD.js → gitGraphDiagram-IHSO6WYX-CDQG334H.js} +1 -1
- package/web/assets/{index-C9fklzYg.js → index-B4WnXxGr.js} +135 -134
- package/web/assets/index-Di6pguZz.css +1 -0
- package/web/assets/{infoDiagram-FWYZ7A6U-GpnV6K4J.js → infoDiagram-FWYZ7A6U-BVS6-42t.js} +1 -1
- package/web/assets/{ishikawaDiagram-FXEZZL3T-DWAqkj-W.js → ishikawaDiagram-FXEZZL3T-B63B2D4K.js} +1 -1
- package/web/assets/{journeyDiagram-5HDEW3XC-C5neCtQj.js → journeyDiagram-5HDEW3XC-DFZcImlX.js} +1 -1
- package/web/assets/{kanban-definition-HUTT4EX6-CMurkSvP.js → kanban-definition-HUTT4EX6-Cmd4XrqE.js} +1 -1
- package/web/assets/{linear-DXSnc47F.js → linear-DAkYxlnA.js} +1 -1
- package/web/assets/{linked-session-header-DOEX4FYM-D76MmnVa.js → linked-session-header-DOEX4FYM-D0mAsins.js} +1 -1
- package/web/assets/{mermaid.core-7Kdi5Xv0.js → mermaid.core-BE2AlF1A.js} +4 -4
- package/web/assets/{mindmap-definition-LN4V7U3C-BNZw5mjJ.js → mindmap-definition-LN4V7U3C-SuG3IorS.js} +1 -1
- package/web/assets/{pegDiagram-2B236MQR-CrPwUM5V.js → pegDiagram-2B236MQR-Bscdsbzn.js} +1 -1
- package/web/assets/{pieDiagram-ENE6RG2P-CFPnbH08.js → pieDiagram-ENE6RG2P-Dg_t_TWu.js} +1 -1
- package/web/assets/{plugin-host-modules-Di1QBOHJ.js → plugin-host-modules-CcpBt3st.js} +1 -1
- package/web/assets/{project-search-page-TZG7AZBQ-CS3QMmIZ.js → project-search-page-TZG7AZBQ-DrMBMFbS.js} +1 -1
- package/web/assets/{quadrantDiagram-ABIIQ3AL-DG2SfRBv.js → quadrantDiagram-ABIIQ3AL-CHImGA_b.js} +1 -1
- package/web/assets/{railroadDiagram-RFXS5EU6-HgJmx22o.js → railroadDiagram-RFXS5EU6-BZRS_CFF.js} +1 -1
- package/web/assets/{requirementDiagram-TGXJPOKE-DSzEksjO.js → requirementDiagram-TGXJPOKE-Ckw1abgN.js} +1 -1
- package/web/assets/{sankeyDiagram-HTMAVEWB-DdTGTi9r.js → sankeyDiagram-HTMAVEWB-BZVBAe8k.js} +1 -1
- package/web/assets/{selection-popup-ABYH3A27-BReisWPp.js → selection-popup-ABYH3A27-D0_B1ozz.js} +1 -1
- package/web/assets/{sequenceDiagram-DBY2YBRQ-BehmA1us.js → sequenceDiagram-DBY2YBRQ-DA8YzEAG.js} +1 -1
- package/web/assets/{sizeCapture-X5ZJPWSS-D6RzKS_R.js → sizeCapture-X5ZJPWSS-B_aUT6yb.js} +1 -1
- package/web/assets/{stateDiagram-2N3HPSRC-DOdbQZzq.js → stateDiagram-2N3HPSRC-DE0B_1vK.js} +1 -1
- package/web/assets/{stateDiagram-v2-6OUMAXLB-F3acm-aM.js → stateDiagram-v2-6OUMAXLB-LQnwbWz3.js} +1 -1
- package/web/assets/{swimlanes-5IMT3BWC-BWGnEd-1.js → swimlanes-5IMT3BWC-DGjZrxBh.js} +2 -2
- package/web/assets/swimlanesDiagram-G3AALYLV-C-GBzQUn.js +8 -0
- package/web/assets/{timeline-definition-FHXFAJF6-C7wmWW47.js → timeline-definition-FHXFAJF6-BnDMvIhe.js} +1 -1
- package/web/assets/{vennDiagram-L72KCM5P-BSLMUPgY.js → vennDiagram-L72KCM5P-Bolx4asy.js} +1 -1
- package/web/assets/{wardleyDiagram-EHGQE667-C9khxrTq.js → wardleyDiagram-EHGQE667-DKGCLLoK.js} +1 -1
- package/web/assets/{xychartDiagram-FW5EYKEG-Cc4Mew9L.js → xychartDiagram-FW5EYKEG-BEPuzAws.js} +1 -1
- package/web/index.html +2 -2
- package/web/assets/channel-BvHB6Mhp.js +0 -1
- package/web/assets/classDiagram-OUVF2IWQ-CPYq7Vyr.js +0 -1
- package/web/assets/classDiagram-v2-EOCWNBFH-CPYq7Vyr.js +0 -1
- package/web/assets/index-QCajCjwA.css +0 -1
- package/web/assets/swimlanesDiagram-G3AALYLV-Cxum_K1V.js +0 -8
package/dist/package/preview.js
CHANGED
|
@@ -242,7 +242,7 @@ function repositoryName(folder) {
|
|
|
242
242
|
return;
|
|
243
243
|
}
|
|
244
244
|
}
|
|
245
|
-
function previewTerminal(url, target, startShare) {
|
|
245
|
+
function previewTerminal(url, target, startShare, views) {
|
|
246
246
|
url = new URL(url).href;
|
|
247
247
|
const input = process.stdin;
|
|
248
248
|
const output = process.stdout;
|
|
@@ -253,8 +253,9 @@ function previewTerminal(url, target, startShare) {
|
|
|
253
253
|
const repository = interactive ? repositoryName(target.root) : undefined;
|
|
254
254
|
const color = terminal && process.env.NO_COLOR === undefined && output.hasColors();
|
|
255
255
|
const accent = (text) => color ? `\x1B[32m${text}\x1B[39m` : text;
|
|
256
|
-
const
|
|
257
|
-
|
|
256
|
+
const linkTo = (label, href, plain = `${label}
|
|
257
|
+
${href}`) => terminal ? `\x1B]8;;${href}\x07${accent(label)}\x1B]8;;\x07` : plain;
|
|
258
|
+
const link = (label) => linkTo(label, url);
|
|
258
259
|
const wasRaw = Boolean(input.isRaw);
|
|
259
260
|
const wasFlowing = input.readableFlowing === true;
|
|
260
261
|
let resolveClosed;
|
|
@@ -271,27 +272,28 @@ function previewTerminal(url, target, startShare) {
|
|
|
271
272
|
return;
|
|
272
273
|
cursorTo(output, 0, 0);
|
|
273
274
|
clearScreenDown(output);
|
|
274
|
-
const width = Math.max(1, (output.columns || 80) -
|
|
275
|
+
const width = Math.max(1, (output.columns || 80) - 1);
|
|
275
276
|
const fit = (text) => {
|
|
276
277
|
const characters = Array.from(terminalText(text));
|
|
277
278
|
return characters.length > width ? characters.slice(0, width - 1).join("") + "…" : characters.join("");
|
|
278
279
|
};
|
|
279
|
-
const
|
|
280
|
-
|
|
281
|
-
const choices = actions.slice(start, start + count).map((item, index) => {
|
|
280
|
+
const choices = [];
|
|
281
|
+
actions.forEach((item, index) => {
|
|
282
282
|
const label = fit(item.shortcut ? `[${item.shortcut}] ${item.label}` : item.label);
|
|
283
|
-
|
|
283
|
+
let text = index === selected ? accent(`› ${label}`) : ` ${label}`;
|
|
284
|
+
if (item.view !== undefined)
|
|
285
|
+
text = linkTo(text, item.view, accent(text));
|
|
286
|
+
choices.push(text);
|
|
284
287
|
});
|
|
285
288
|
output.write([
|
|
286
|
-
|
|
287
|
-
...repository ? [
|
|
288
|
-
...target.target ? [`
|
|
289
|
+
`\x1B[1m${link(fit(title))}\x1B[22m`,
|
|
290
|
+
...repository ? [`${color ? "\x1B[2m" : ""}${fit(repository)}${color ? "\x1B[22m" : ""}`] : [],
|
|
291
|
+
...target.target ? [`File: ${fit(name)}`] : [],
|
|
289
292
|
"",
|
|
290
293
|
...choices,
|
|
291
294
|
"",
|
|
292
|
-
"
|
|
293
|
-
...
|
|
294
|
-
...status ? ["", ` ${status}`] : [],
|
|
295
|
+
"↑ ↓ to move · Enter to choose · Esc or Ctrl+C to exit",
|
|
296
|
+
...status ? ["", status] : [],
|
|
295
297
|
""
|
|
296
298
|
].join(`
|
|
297
299
|
`));
|
|
@@ -356,6 +358,10 @@ function previewTerminal(url, target, startShare) {
|
|
|
356
358
|
resolveClosed();
|
|
357
359
|
};
|
|
358
360
|
const actions = [
|
|
361
|
+
...(views ?? []).map((view) => ({ label: view.id, run: () => {
|
|
362
|
+
openPreview(view.url);
|
|
363
|
+
status = "Browser open requested.";
|
|
364
|
+
}, view: view.url })),
|
|
359
365
|
{ label: "Open in browser", shortcut: "o", run: () => {
|
|
360
366
|
openPreview(url);
|
|
361
367
|
status = "Browser open requested.";
|
|
@@ -415,7 +421,7 @@ function previewTerminal(url, target, startShare) {
|
|
|
415
421
|
render();
|
|
416
422
|
else
|
|
417
423
|
console.log(`
|
|
418
|
-
|
|
424
|
+
${link(name)}
|
|
419
425
|
`);
|
|
420
426
|
return { close, closed, interactive };
|
|
421
427
|
}
|
|
@@ -25,6 +25,11 @@ export type ExternalPluginEntry = {
|
|
|
25
25
|
digest: string;
|
|
26
26
|
};
|
|
27
27
|
};
|
|
28
|
+
/** Manifest-declared subviews, recorded at install time. */
|
|
29
|
+
views?: {
|
|
30
|
+
subpath: string;
|
|
31
|
+
label: string;
|
|
32
|
+
}[];
|
|
28
33
|
};
|
|
29
34
|
export declare function kennelConfigPath(): string;
|
|
30
35
|
export declare const PLUGIN_SOURCE_IGNORED: Set<string>;
|
package/dist/plugins/external.js
CHANGED
|
@@ -373,6 +373,12 @@ async function validateImports(entry) {
|
|
|
373
373
|
if (typeof apiModule.default !== "function")
|
|
374
374
|
throw new Error("API default export missing handler");
|
|
375
375
|
}
|
|
376
|
+
if (Array.isArray(manifest.views)) {
|
|
377
|
+
entry.views = manifest.views.map((view) => ({
|
|
378
|
+
subpath: view.subpath,
|
|
379
|
+
label: view.label,
|
|
380
|
+
}));
|
|
381
|
+
}
|
|
376
382
|
}
|
|
377
383
|
finally {
|
|
378
384
|
await rm(dir, { force: true, recursive: true });
|
package/dist/site/hot-viewer.js
CHANGED
|
@@ -6,7 +6,7 @@ import { createConnection } from 'node:net';
|
|
|
6
6
|
import { tmpdir } from 'node:os';
|
|
7
7
|
import { dirname, relative, resolve } from 'node:path';
|
|
8
8
|
import { fileURLToPath } from 'node:url';
|
|
9
|
-
import { popUrl } from './viewer.js';
|
|
9
|
+
import { popUrl, pluginViewLinks } from './viewer.js';
|
|
10
10
|
import { createKennelClient } from '../core/api-client.js';
|
|
11
11
|
import { pluginSetKey } from '../plugins/external.js';
|
|
12
12
|
import { openPreview, previewTerminal } from './terminal.js';
|
|
@@ -179,7 +179,7 @@ export async function hotViewer(options, restarting = false) {
|
|
|
179
179
|
return hotViewer(options, true);
|
|
180
180
|
throw new Error(stale);
|
|
181
181
|
}
|
|
182
|
-
const terminal = previewTerminal(viewerUrl, options);
|
|
182
|
+
const terminal = previewTerminal(viewerUrl, options, pluginViewLinks(viewerUrl, options.root));
|
|
183
183
|
if (options.open)
|
|
184
184
|
openPreview(viewerUrl);
|
|
185
185
|
try {
|
|
@@ -245,7 +245,7 @@ export async function hotViewer(options, restarting = false) {
|
|
|
245
245
|
},
|
|
246
246
|
stdio: ['ignore', 'inherit', 'inherit'],
|
|
247
247
|
});
|
|
248
|
-
const terminal = previewTerminal(viewerUrl, options);
|
|
248
|
+
const terminal = previewTerminal(viewerUrl, options, pluginViewLinks(viewerUrl, options.root));
|
|
249
249
|
void terminal.closed.then(() => {
|
|
250
250
|
if (child.exitCode === null && child.signalCode === null)
|
|
251
251
|
child.kill('SIGTERM');
|
package/dist/site/terminal.d.ts
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
export { openPreview } from "kennel-preview/terminal";
|
|
2
|
+
/** Extra list entries rendered as hyperlinked plugin view links. */
|
|
3
|
+
export type PluginView = {
|
|
4
|
+
id: string;
|
|
5
|
+
url: string;
|
|
6
|
+
};
|
|
2
7
|
export declare function previewTerminal(url: string, target: {
|
|
3
8
|
root: string;
|
|
4
9
|
target?: string;
|
|
5
|
-
}): {
|
|
10
|
+
}, views: PluginView[]): {
|
|
6
11
|
close: () => void;
|
|
7
12
|
closed: Promise<void>;
|
|
8
13
|
interactive: boolean;
|
package/dist/site/terminal.js
CHANGED
|
@@ -31,7 +31,7 @@ function repositoryName(folder) {
|
|
|
31
31
|
return;
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
|
-
function previewTerminal(url, target, startShare) {
|
|
34
|
+
function previewTerminal(url, target, startShare, views) {
|
|
35
35
|
url = new URL(url).href;
|
|
36
36
|
const input = process.stdin;
|
|
37
37
|
const output = process.stdout;
|
|
@@ -42,8 +42,9 @@ function previewTerminal(url, target, startShare) {
|
|
|
42
42
|
const repository = interactive ? repositoryName(target.root) : undefined;
|
|
43
43
|
const color = terminal && process.env.NO_COLOR === undefined && output.hasColors();
|
|
44
44
|
const accent = (text) => color ? `\x1B[32m${text}\x1B[39m` : text;
|
|
45
|
-
const
|
|
46
|
-
|
|
45
|
+
const linkTo = (label, href, plain = `${label}
|
|
46
|
+
${href}`) => terminal ? `\x1B]8;;${href}\x07${accent(label)}\x1B]8;;\x07` : plain;
|
|
47
|
+
const link = (label) => linkTo(label, url);
|
|
47
48
|
const wasRaw = Boolean(input.isRaw);
|
|
48
49
|
const wasFlowing = input.readableFlowing === true;
|
|
49
50
|
let resolveClosed;
|
|
@@ -60,27 +61,28 @@ function previewTerminal(url, target, startShare) {
|
|
|
60
61
|
return;
|
|
61
62
|
cursorTo(output, 0, 0);
|
|
62
63
|
clearScreenDown(output);
|
|
63
|
-
const width = Math.max(1, (output.columns || 80) -
|
|
64
|
+
const width = Math.max(1, (output.columns || 80) - 1);
|
|
64
65
|
const fit = (text) => {
|
|
65
66
|
const characters = Array.from(terminalText(text));
|
|
66
67
|
return characters.length > width ? characters.slice(0, width - 1).join("") + "…" : characters.join("");
|
|
67
68
|
};
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
const choices = actions.slice(start, start + count).map((item, index) => {
|
|
69
|
+
const choices = [];
|
|
70
|
+
actions.forEach((item, index) => {
|
|
71
71
|
const label = fit(item.shortcut ? `[${item.shortcut}] ${item.label}` : item.label);
|
|
72
|
-
|
|
72
|
+
let text = index === selected ? accent(`› ${label}`) : ` ${label}`;
|
|
73
|
+
if (item.view !== undefined)
|
|
74
|
+
text = linkTo(text, item.view, accent(text));
|
|
75
|
+
choices.push(text);
|
|
73
76
|
});
|
|
74
77
|
output.write([
|
|
75
|
-
|
|
76
|
-
...repository ? [
|
|
77
|
-
...target.target ? [`
|
|
78
|
+
`\x1B[1m${link(fit(title))}\x1B[22m`,
|
|
79
|
+
...repository ? [`${color ? "\x1B[2m" : ""}${fit(repository)}${color ? "\x1B[22m" : ""}`] : [],
|
|
80
|
+
...target.target ? [`File: ${fit(name)}`] : [],
|
|
78
81
|
"",
|
|
79
82
|
...choices,
|
|
80
83
|
"",
|
|
81
|
-
"
|
|
82
|
-
...
|
|
83
|
-
...status ? ["", ` ${status}`] : [],
|
|
84
|
+
"↑ ↓ to move · Enter to choose · Esc or Ctrl+C to exit",
|
|
85
|
+
...status ? ["", status] : [],
|
|
84
86
|
""
|
|
85
87
|
].join(`
|
|
86
88
|
`));
|
|
@@ -145,6 +147,10 @@ function previewTerminal(url, target, startShare) {
|
|
|
145
147
|
resolveClosed();
|
|
146
148
|
};
|
|
147
149
|
const actions = [
|
|
150
|
+
...(views ?? []).map((view) => ({ label: view.id, run: () => {
|
|
151
|
+
openPreview(view.url);
|
|
152
|
+
status = "Browser open requested.";
|
|
153
|
+
}, view: view.url })),
|
|
148
154
|
{ label: "Open in browser", shortcut: "o", run: () => {
|
|
149
155
|
openPreview(url);
|
|
150
156
|
status = "Browser open requested.";
|
|
@@ -204,17 +210,17 @@ function previewTerminal(url, target, startShare) {
|
|
|
204
210
|
render();
|
|
205
211
|
else
|
|
206
212
|
console.log(`
|
|
207
|
-
|
|
213
|
+
${link(name)}
|
|
208
214
|
`);
|
|
209
215
|
return { close, closed, interactive };
|
|
210
216
|
}
|
|
211
217
|
|
|
212
218
|
// packages/cli/src/site/terminal.ts
|
|
213
|
-
function previewTerminal2(url, target) {
|
|
219
|
+
function previewTerminal2(url, target, views) {
|
|
214
220
|
return previewTerminal(url, target, async (password = false) => {
|
|
215
221
|
const { startPreviewShare } = await import(new URL("../package/preview.js", import.meta.url).href);
|
|
216
222
|
return startPreviewShare({ ...target, ...password ? { password: true } : {} });
|
|
217
|
-
});
|
|
223
|
+
}, views);
|
|
218
224
|
}
|
|
219
225
|
export {
|
|
220
226
|
openPreview,
|
package/dist/site/viewer.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { type PluginView } from "./terminal.js";
|
|
2
|
+
/** Installed-plugin view links for the terminal menu; each is hyperlinked. */
|
|
3
|
+
export declare function pluginViewLinks(viewerUrl: string, root: string): PluginView[];
|
|
1
4
|
export type ViewerOptions = {
|
|
2
5
|
dryRun: boolean;
|
|
3
6
|
host: string;
|
package/dist/site/viewer.js
CHANGED
|
@@ -2,8 +2,25 @@ import { execFileSync } from "node:child_process";
|
|
|
2
2
|
import { existsSync, realpathSync, statSync } from "node:fs";
|
|
3
3
|
import { createServer } from "node:net";
|
|
4
4
|
import { dirname, isAbsolute, relative, resolve } from "node:path";
|
|
5
|
+
import { readExternalPlugins } from "../plugins/external.js";
|
|
5
6
|
import { previewKind } from "./kinds.js";
|
|
6
7
|
import { openPreview, previewTerminal } from "./terminal.js";
|
|
8
|
+
/** Installed-plugin view links for the terminal menu; each is hyperlinked. */
|
|
9
|
+
export function pluginViewLinks(viewerUrl, root) {
|
|
10
|
+
return readExternalPlugins().flatMap((plugin) => {
|
|
11
|
+
const view = (subpath) => {
|
|
12
|
+
const url = new URL(viewerUrl);
|
|
13
|
+
url.pathname = `/folder/${encodeBase64Url(root)}/views/${encodeURIComponent(plugin.id)}${subpath ? `/${encodeURIComponent(subpath)}` : ""}`;
|
|
14
|
+
// A query `folder` makes the route parser ignore the path and select Notes.
|
|
15
|
+
url.searchParams.delete("folder");
|
|
16
|
+
return url.href;
|
|
17
|
+
};
|
|
18
|
+
const views = [{ id: plugin.id, url: view() }];
|
|
19
|
+
for (const item of plugin.views ?? [])
|
|
20
|
+
views.push({ id: `${plugin.id} · ${item.label}`, url: view(item.subpath) });
|
|
21
|
+
return views;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
7
24
|
export function viewerFolder(root, value) {
|
|
8
25
|
return resolve(value ?? root);
|
|
9
26
|
}
|
|
@@ -312,7 +329,7 @@ export async function viewer(input, plugin) {
|
|
|
312
329
|
existing.kernelKey === plugins.key &&
|
|
313
330
|
isSameOrDescendant(existing.root, options.root)))) {
|
|
314
331
|
const viewerUrl = popUrl(displayHost, options.port, options);
|
|
315
|
-
const terminal = previewTerminal(viewerUrl, options);
|
|
332
|
+
const terminal = previewTerminal(viewerUrl, options, pluginViewLinks(viewerUrl, options.root));
|
|
316
333
|
if (options.open)
|
|
317
334
|
openPreview(viewerUrl);
|
|
318
335
|
try {
|
|
@@ -342,7 +359,7 @@ export async function viewer(input, plugin) {
|
|
|
342
359
|
execFileSync("tailscale", ["serve", "--bg", "--yes", options.port]);
|
|
343
360
|
}
|
|
344
361
|
const viewerUrl = popUrl(displayHost, options.port, options);
|
|
345
|
-
const terminal = previewTerminal(viewerUrl, options);
|
|
362
|
+
const terminal = previewTerminal(viewerUrl, options, pluginViewLinks(viewerUrl, options.root));
|
|
346
363
|
if (options.open)
|
|
347
364
|
openPreview(viewerUrl);
|
|
348
365
|
try {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kennel",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.42",
|
|
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",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"effect": "^3.19.7",
|
|
70
70
|
"esbuild": "^0.27.0",
|
|
71
71
|
"kennel-mcp": "https://registry.npmjs.org/%40raggle-ai%2fkennel-mcp/-/kennel-mcp-0.1.8.tgz",
|
|
72
|
-
"kennel-plugins": "0.1.
|
|
72
|
+
"kennel-plugins": "0.1.20",
|
|
73
73
|
"koffi": "^3.3.1",
|
|
74
74
|
"lucide-react": "^0.562.0",
|
|
75
75
|
"radix-ui": "^1.6.7",
|
|
@@ -100,6 +100,20 @@
|
|
|
100
100
|
"pattern": "^(?!\\.{1,2}$)[^/\\\\]+$"
|
|
101
101
|
},
|
|
102
102
|
"skill": { "$ref": "#/$defs/pluginSkill" },
|
|
103
|
+
"views": {
|
|
104
|
+
"description": "Undirected views declared by the plugin manifest, recorded at install time.",
|
|
105
|
+
"type": "array",
|
|
106
|
+
"uniqueItems": true,
|
|
107
|
+
"items": {
|
|
108
|
+
"type": "object",
|
|
109
|
+
"additionalProperties": false,
|
|
110
|
+
"required": ["subpath", "label"],
|
|
111
|
+
"properties": {
|
|
112
|
+
"subpath": { "type": "string", "pattern": "^[a-z][a-z0-9-]*$" },
|
|
113
|
+
"label": { "type": "string", "minLength": 1 }
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
},
|
|
103
117
|
"entries": {
|
|
104
118
|
"description": "Resolved absolute convention entry files. api is optional.",
|
|
105
119
|
"oneOf": [
|
|
@@ -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-BJb4GtCJ.js";import{p as f}from"./chunk-JWPE2WC7-CY2fyOB-.js";import{_ as n,l as o}from"./mermaid.core-BE2AlF1A.js";import{b as c,M as d}from"./cynefin-VYW2F7L2-D_M6zxNK.js";import"./index-B4WnXxGr.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-BE2AlF1A.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};
|