deepclause-sdk 0.1.0 → 0.1.1
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/README.md +83 -12
- package/dist/agent.d.ts +2 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +1 -0
- package/dist/agent.js.map +1 -1
- package/dist/cli/config.d.ts +62 -2
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +15 -0
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/index.js +38 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/repl.d.ts +25 -0
- package/dist/cli/repl.d.ts.map +1 -1
- package/dist/cli/repl.js +165 -5
- package/dist/cli/repl.js.map +1 -1
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +6 -0
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/visualize.d.ts +4 -0
- package/dist/cli/visualize.d.ts.map +1 -1
- package/dist/cli/visualize.js +29 -4
- package/dist/cli/visualize.js.map +1 -1
- package/dist/prolog/bridge.d.ts +3 -1
- package/dist/prolog/bridge.d.ts.map +1 -1
- package/dist/prolog/bridge.js +2 -0
- package/dist/prolog/bridge.js.map +1 -1
- package/dist/prolog-src/deepclause_mi.pl +196 -9
- package/dist/repl/agent.d.ts +18 -0
- package/dist/repl/agent.d.ts.map +1 -1
- package/dist/repl/agent.js +47 -3
- package/dist/repl/agent.js.map +1 -1
- package/dist/repl/backend.d.ts +31 -0
- package/dist/repl/backend.d.ts.map +1 -1
- package/dist/repl/backend.js +122 -77
- package/dist/repl/backend.js.map +1 -1
- package/dist/repl/harness-tools.d.ts +25 -0
- package/dist/repl/harness-tools.d.ts.map +1 -1
- package/dist/repl/harness-tools.js +73 -2
- package/dist/repl/harness-tools.js.map +1 -1
- package/dist/repl/imagegen.d.ts +29 -0
- package/dist/repl/imagegen.d.ts.map +1 -0
- package/dist/repl/imagegen.js +84 -0
- package/dist/repl/imagegen.js.map +1 -0
- package/dist/repl/index.d.ts +12 -2
- package/dist/repl/index.d.ts.map +1 -1
- package/dist/repl/index.js +5 -0
- package/dist/repl/index.js.map +1 -1
- package/dist/repl/model-resolver.d.ts +59 -0
- package/dist/repl/model-resolver.d.ts.map +1 -0
- package/dist/repl/model-resolver.js +156 -0
- package/dist/repl/model-resolver.js.map +1 -0
- package/dist/repl/render.d.ts +28 -1
- package/dist/repl/render.d.ts.map +1 -1
- package/dist/repl/render.js +94 -1
- package/dist/repl/render.js.map +1 -1
- package/dist/repl/session.d.ts +68 -0
- package/dist/repl/session.d.ts.map +1 -1
- package/dist/repl/session.js +206 -8
- package/dist/repl/session.js.map +1 -1
- package/dist/repl/tui/transcript.d.ts +2 -0
- package/dist/repl/tui/transcript.d.ts.map +1 -1
- package/dist/repl/tui/transcript.js +16 -0
- package/dist/repl/tui/transcript.js.map +1 -1
- package/dist/runner.d.ts +13 -2
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +101 -16
- package/dist/runner.js.map +1 -1
- package/dist/system/assets/docs/AGENT_PROMPT.md +75 -1
- package/dist/system/assets/docs/DML_REFERENCE.md +32 -0
- package/dist/types.d.ts +56 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/visualize/ascii.d.ts +55 -0
- package/dist/visualize/ascii.d.ts.map +1 -0
- package/dist/visualize/ascii.js +242 -0
- package/dist/visualize/ascii.js.map +1 -0
- package/dist/visualize/display.d.ts +24 -0
- package/dist/visualize/display.d.ts.map +1 -0
- package/dist/visualize/display.js +29 -0
- package/dist/visualize/display.js.map +1 -0
- package/dist/visualize/graphics.d.ts +35 -0
- package/dist/visualize/graphics.d.ts.map +1 -0
- package/dist/visualize/graphics.js +96 -0
- package/dist/visualize/graphics.js.map +1 -0
- package/dist/visualize/image.d.ts +38 -0
- package/dist/visualize/image.d.ts.map +1 -0
- package/dist/visualize/image.js +95 -0
- package/dist/visualize/image.js.map +1 -0
- package/dist/visualize/index.d.ts +7 -0
- package/dist/visualize/index.d.ts.map +1 -1
- package/dist/visualize/index.js +9 -0
- package/dist/visualize/index.js.map +1 -1
- package/dist/visualize/raster.d.ts +23 -0
- package/dist/visualize/raster.d.ts.map +1 -0
- package/dist/visualize/raster.js +47 -0
- package/dist/visualize/raster.js.map +1 -0
- package/dist/visualize/svg.d.ts +39 -0
- package/dist/visualize/svg.d.ts.map +1 -0
- package/dist/visualize/svg.js +148 -0
- package/dist/visualize/svg.js.map +1 -0
- package/dist/visualize/transcode.d.ts +13 -0
- package/dist/visualize/transcode.d.ts.map +1 -0
- package/dist/visualize/transcode.js +40 -0
- package/dist/visualize/transcode.js.map +1 -0
- package/docs/images/repl.png +0 -0
- package/package.json +7 -5
- package/src/prolog-src/deepclause_mi.pl +196 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/visualize/display.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAqB,MAAM,eAAe,CAAC;AAehG,qEAAqE;AACrE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAA0B,EAC1B,UAA+B,EAAE;IAEjC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC;IACrE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3F,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,EAAE;QACrC,QAAQ;QACR,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE;QAC1C,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC,CAAC;IACH,OAAO,KAAK,EAAE,KAAK,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal graphics over `@earendil-works/pi-tui`'s `terminal-image` module.
|
|
3
|
+
*
|
|
4
|
+
* We reuse pi's Kitty / iTerm2 inline-image encoding and its capability
|
|
5
|
+
* detection (Kitty, Ghostty, WezTerm, iTerm2 — tmux-aware); when the terminal
|
|
6
|
+
* advertises no image protocol the caller falls back to `renderMermaidAscii`.
|
|
7
|
+
*
|
|
8
|
+
* The returned `lines` mirror pi-tui's `Image` component: the escape sequence
|
|
9
|
+
* plus the empty padding rows the TUI must reserve for the image.
|
|
10
|
+
*/
|
|
11
|
+
/** User-facing graphics selection (`/viz --graphics=<mode>`). */
|
|
12
|
+
export type GraphicsMode = 'auto' | 'kitty' | 'iterm2' | 'ascii' | 'off';
|
|
13
|
+
export type GraphicsProtocol = 'kitty' | 'iterm2';
|
|
14
|
+
/** Resolve the protocol to use for a mode, or undefined for ASCII/no image. */
|
|
15
|
+
export declare function resolveGraphicsProtocol(mode?: GraphicsMode): GraphicsProtocol | undefined;
|
|
16
|
+
/** True when the current terminal can display inline images. */
|
|
17
|
+
export declare function graphicsSupported(): boolean;
|
|
18
|
+
export interface RenderedImage {
|
|
19
|
+
/** Lines to emit: the escape sequence plus reserved padding rows. */
|
|
20
|
+
lines: string[];
|
|
21
|
+
columns: number;
|
|
22
|
+
rows: number;
|
|
23
|
+
protocol: GraphicsProtocol;
|
|
24
|
+
}
|
|
25
|
+
export interface RenderImageOptions {
|
|
26
|
+
protocol: GraphicsProtocol;
|
|
27
|
+
maxWidthCells?: number;
|
|
28
|
+
maxHeightCells?: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Encode a PNG buffer for inline display. Returns undefined when the PNG is not
|
|
32
|
+
* recognizable or sizing fails.
|
|
33
|
+
*/
|
|
34
|
+
export declare function renderTerminalImage(png: Buffer, options: RenderImageOptions): RenderedImage | undefined;
|
|
35
|
+
//# sourceMappingURL=graphics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphics.d.ts","sourceRoot":"","sources":["../../src/visualize/graphics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAYH,iEAAiE;AACjE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;AAEzE,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAElD,+EAA+E;AAC/E,wBAAgB,uBAAuB,CAAC,IAAI,GAAE,YAAqB,GAAG,gBAAgB,GAAG,SAAS,CASjG;AAED,gEAAgE;AAChE,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AA2BD,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,aAAa,GAAG,SAAS,CA8CvG"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal graphics over `@earendil-works/pi-tui`'s `terminal-image` module.
|
|
3
|
+
*
|
|
4
|
+
* We reuse pi's Kitty / iTerm2 inline-image encoding and its capability
|
|
5
|
+
* detection (Kitty, Ghostty, WezTerm, iTerm2 — tmux-aware); when the terminal
|
|
6
|
+
* advertises no image protocol the caller falls back to `renderMermaidAscii`.
|
|
7
|
+
*
|
|
8
|
+
* The returned `lines` mirror pi-tui's `Image` component: the escape sequence
|
|
9
|
+
* plus the empty padding rows the TUI must reserve for the image.
|
|
10
|
+
*/
|
|
11
|
+
import { allocateImageId, encodeITerm2, encodeKitty, getCapabilities, getCellDimensions, getPngDimensions, renderImage, } from '@earendil-works/pi-tui';
|
|
12
|
+
/** Resolve the protocol to use for a mode, or undefined for ASCII/no image. */
|
|
13
|
+
export function resolveGraphicsProtocol(mode = 'auto') {
|
|
14
|
+
if (mode === 'off' || mode === 'ascii') {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
if (mode === 'kitty' || mode === 'iterm2') {
|
|
18
|
+
return mode;
|
|
19
|
+
}
|
|
20
|
+
const detected = getCapabilities().images;
|
|
21
|
+
return detected ?? undefined;
|
|
22
|
+
}
|
|
23
|
+
/** True when the current terminal can display inline images. */
|
|
24
|
+
export function graphicsSupported() {
|
|
25
|
+
return resolveGraphicsProtocol('auto') !== undefined;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Fit an image (px) into a cell box, mirroring pi-tui's `calculateImageCellSize`
|
|
29
|
+
* (which the package does not re-export from its index).
|
|
30
|
+
*/
|
|
31
|
+
function fitToCells(dimensions, maxWidthCells, maxHeightCells) {
|
|
32
|
+
const cell = getCellDimensions();
|
|
33
|
+
const maxWidth = Math.max(1, Math.floor(maxWidthCells));
|
|
34
|
+
const maxHeight = maxHeightCells === undefined ? undefined : Math.max(1, Math.floor(maxHeightCells));
|
|
35
|
+
const imageWidth = Math.max(1, dimensions.widthPx);
|
|
36
|
+
const imageHeight = Math.max(1, dimensions.heightPx);
|
|
37
|
+
const widthScale = (maxWidth * cell.widthPx) / imageWidth;
|
|
38
|
+
const heightScale = maxHeight === undefined ? widthScale : (maxHeight * cell.heightPx) / imageHeight;
|
|
39
|
+
const scale = Math.min(widthScale, heightScale);
|
|
40
|
+
const columns = Math.max(1, Math.min(maxWidth, Math.ceil((imageWidth * scale) / cell.widthPx)));
|
|
41
|
+
let rows = Math.max(1, Math.ceil((imageHeight * scale) / cell.heightPx));
|
|
42
|
+
if (maxHeight !== undefined) {
|
|
43
|
+
rows = Math.min(maxHeight, rows);
|
|
44
|
+
}
|
|
45
|
+
return { columns, rows };
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Encode a PNG buffer for inline display. Returns undefined when the PNG is not
|
|
49
|
+
* recognizable or sizing fails.
|
|
50
|
+
*/
|
|
51
|
+
export function renderTerminalImage(png, options) {
|
|
52
|
+
const base64 = png.toString('base64');
|
|
53
|
+
const dimensions = getPngDimensions(base64);
|
|
54
|
+
if (!dimensions) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
const maxWidth = Math.max(1, options.maxWidthCells ?? 80);
|
|
58
|
+
const detected = getCapabilities().images;
|
|
59
|
+
// When the requested protocol is the detected one, use pi-tui's `renderImage`:
|
|
60
|
+
// it registers Kitty metadata that the TUI needs for row reservation and
|
|
61
|
+
// scrolling. Forced mismatches fall back to the raw encoders.
|
|
62
|
+
if (detected === options.protocol) {
|
|
63
|
+
const result = renderImage(base64, dimensions, {
|
|
64
|
+
maxWidthCells: maxWidth,
|
|
65
|
+
maxHeightCells: options.maxHeightCells,
|
|
66
|
+
imageId: options.protocol === 'kitty' ? allocateImageId() : undefined,
|
|
67
|
+
moveCursor: false,
|
|
68
|
+
});
|
|
69
|
+
if (!result) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
const rowOffset = result.rows - 1;
|
|
73
|
+
const lines = options.protocol === 'kitty'
|
|
74
|
+
? [result.sequence, ...Array(rowOffset).fill('')]
|
|
75
|
+
: [...Array(rowOffset).fill(''), `${rowOffset > 0 ? `\x1b[${rowOffset}A` : ''}${result.sequence}`];
|
|
76
|
+
return { lines, columns: result.columns, rows: result.rows, protocol: options.protocol };
|
|
77
|
+
}
|
|
78
|
+
const size = fitToCells(dimensions, maxWidth, options.maxHeightCells);
|
|
79
|
+
if (options.protocol === 'kitty') {
|
|
80
|
+
const sequence = encodeKitty(base64, { columns: size.columns, rows: size.rows, imageId: allocateImageId(), moveCursor: false });
|
|
81
|
+
const lines = [sequence];
|
|
82
|
+
for (let i = 0; i < size.rows - 1; i++) {
|
|
83
|
+
lines.push('');
|
|
84
|
+
}
|
|
85
|
+
return { lines, columns: size.columns, rows: size.rows, protocol: 'kitty' };
|
|
86
|
+
}
|
|
87
|
+
const sequence = encodeITerm2(base64, { width: size.columns, height: 'auto', preserveAspectRatio: true });
|
|
88
|
+
const lines = [];
|
|
89
|
+
for (let i = 0; i < size.rows - 1; i++) {
|
|
90
|
+
lines.push('');
|
|
91
|
+
}
|
|
92
|
+
const rowOffset = size.rows - 1;
|
|
93
|
+
lines.push(`${rowOffset > 0 ? `\x1b[${rowOffset}A` : ''}${sequence}`);
|
|
94
|
+
return { lines, columns: size.columns, rows: size.rows, protocol: 'iterm2' };
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=graphics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphics.js","sourceRoot":"","sources":["../../src/visualize/graphics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a media reference (`output(media(...))`, a file, inline SVG, or inline
|
|
3
|
+
* bytes) into a base64 PNG for terminal display, and to bytes for saving.
|
|
4
|
+
*
|
|
5
|
+
* Same pipeline as the diagram renderer: SVG → resvg, PNG passthrough, other
|
|
6
|
+
* rasters → optional `sharp` (`transcode.ts`). When no raster can be produced,
|
|
7
|
+
* the caller falls back to showing the path.
|
|
8
|
+
*/
|
|
9
|
+
export interface MediaInput {
|
|
10
|
+
/** Workspace-relative path (for file references). */
|
|
11
|
+
path?: string;
|
|
12
|
+
mimeType?: string;
|
|
13
|
+
/** `file` (default) | `inline_svg` | `inline_data`. */
|
|
14
|
+
kind?: string;
|
|
15
|
+
/** SVG source text (`inline_svg`) or base64 bytes (`inline_data`). */
|
|
16
|
+
data?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ResolvedMedia {
|
|
19
|
+
mimeType: string;
|
|
20
|
+
relPath?: string;
|
|
21
|
+
absPath?: string;
|
|
22
|
+
/** Base64 PNG when one could be produced (for inline terminal display). */
|
|
23
|
+
pngBase64?: string;
|
|
24
|
+
/** Raw bytes when read from a file. */
|
|
25
|
+
bytes?: Buffer;
|
|
26
|
+
}
|
|
27
|
+
/** Resolve a media reference to (optionally) a base64 PNG + path metadata. */
|
|
28
|
+
export declare function resolveMedia(workspacePath: string, media: MediaInput): Promise<ResolvedMedia | undefined>;
|
|
29
|
+
/**
|
|
30
|
+
* Materialize a media reference to a workspace file. Inline SVG/bytes and file
|
|
31
|
+
* references are written to `outPath` (workspace-relative). When the target is
|
|
32
|
+
* `.svg`, an inline SVG is written verbatim; otherwise raster content is written.
|
|
33
|
+
*/
|
|
34
|
+
export declare function saveMedia(workspacePath: string, media: MediaInput, outPath: string): Promise<{
|
|
35
|
+
path: string;
|
|
36
|
+
mimeType: string;
|
|
37
|
+
}>;
|
|
38
|
+
//# sourceMappingURL=image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/visualize/image.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA0BD,8EAA8E;AAC9E,wBAAsB,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CA+B/G;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B7C"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a media reference (`output(media(...))`, a file, inline SVG, or inline
|
|
3
|
+
* bytes) into a base64 PNG for terminal display, and to bytes for saving.
|
|
4
|
+
*
|
|
5
|
+
* Same pipeline as the diagram renderer: SVG → resvg, PNG passthrough, other
|
|
6
|
+
* rasters → optional `sharp` (`transcode.ts`). When no raster can be produced,
|
|
7
|
+
* the caller falls back to showing the path.
|
|
8
|
+
*/
|
|
9
|
+
import * as fs from 'fs/promises';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import { rasterizeSvg } from './raster.js';
|
|
12
|
+
import { transcodeToPng } from './transcode.js';
|
|
13
|
+
const DEFAULT_SVG_WIDTH = 900;
|
|
14
|
+
const MIME_BY_EXT = {
|
|
15
|
+
'.png': 'image/png',
|
|
16
|
+
'.jpg': 'image/jpeg',
|
|
17
|
+
'.jpeg': 'image/jpeg',
|
|
18
|
+
'.gif': 'image/gif',
|
|
19
|
+
'.webp': 'image/webp',
|
|
20
|
+
'.svg': 'image/svg+xml',
|
|
21
|
+
};
|
|
22
|
+
/** Mime for a reference: explicit wins, else inferred from the extension. */
|
|
23
|
+
function inferMime(relPath, given) {
|
|
24
|
+
if (given) {
|
|
25
|
+
return given;
|
|
26
|
+
}
|
|
27
|
+
const ext = relPath ? path.extname(relPath).toLowerCase() : '';
|
|
28
|
+
return MIME_BY_EXT[ext] ?? 'image/png';
|
|
29
|
+
}
|
|
30
|
+
function isSvg(mimeType, source) {
|
|
31
|
+
return mimeType === 'image/svg+xml' || /^\s*<svg[\s>]/i.test(source);
|
|
32
|
+
}
|
|
33
|
+
/** Resolve a media reference to (optionally) a base64 PNG + path metadata. */
|
|
34
|
+
export async function resolveMedia(workspacePath, media) {
|
|
35
|
+
const mimeType = inferMime(media.path, media.mimeType);
|
|
36
|
+
// Inline SVG text or inline bytes.
|
|
37
|
+
if (media.kind === 'inline_svg' || (media.data && isSvg(mimeType, media.data))) {
|
|
38
|
+
const png = await rasterizeSvg(media.data ?? '', { width: DEFAULT_SVG_WIDTH, height: 0 });
|
|
39
|
+
return { mimeType: 'image/svg+xml', pngBase64: png?.toString('base64') };
|
|
40
|
+
}
|
|
41
|
+
if (media.kind === 'inline_data' || (media.data && !media.path)) {
|
|
42
|
+
const bytes = Buffer.from(media.data ?? '', 'base64');
|
|
43
|
+
const png = await transcodeToPng(bytes, mimeType);
|
|
44
|
+
return { mimeType, pngBase64: png?.toString('base64'), bytes };
|
|
45
|
+
}
|
|
46
|
+
if (!media.path) {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
const absPath = path.resolve(workspacePath, media.path);
|
|
50
|
+
let bytes;
|
|
51
|
+
try {
|
|
52
|
+
bytes = await fs.readFile(absPath);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return { mimeType, relPath: media.path, absPath };
|
|
56
|
+
}
|
|
57
|
+
if (mimeType === 'image/svg+xml') {
|
|
58
|
+
const png = await rasterizeSvg(bytes.toString('utf8'), { width: DEFAULT_SVG_WIDTH, height: 0 });
|
|
59
|
+
return { mimeType, relPath: media.path, absPath, bytes, pngBase64: png?.toString('base64') };
|
|
60
|
+
}
|
|
61
|
+
const png = await transcodeToPng(bytes, mimeType);
|
|
62
|
+
return { mimeType, relPath: media.path, absPath, bytes, pngBase64: png?.toString('base64') };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Materialize a media reference to a workspace file. Inline SVG/bytes and file
|
|
66
|
+
* references are written to `outPath` (workspace-relative). When the target is
|
|
67
|
+
* `.svg`, an inline SVG is written verbatim; otherwise raster content is written.
|
|
68
|
+
*/
|
|
69
|
+
export async function saveMedia(workspacePath, media, outPath) {
|
|
70
|
+
const resolved = await resolveMedia(workspacePath, media);
|
|
71
|
+
if (!resolved) {
|
|
72
|
+
throw new Error('empty media reference');
|
|
73
|
+
}
|
|
74
|
+
const abs = path.resolve(workspacePath, outPath);
|
|
75
|
+
await fs.mkdir(path.dirname(abs), { recursive: true });
|
|
76
|
+
if (outPath.toLowerCase().endsWith('.svg')) {
|
|
77
|
+
const svg = media.kind === 'inline_svg' || isSvg(media.mimeType, media.data ?? '')
|
|
78
|
+
? (media.data ?? '')
|
|
79
|
+
: resolved.bytes?.toString('utf8');
|
|
80
|
+
if (svg) {
|
|
81
|
+
await fs.writeFile(abs, svg, 'utf8');
|
|
82
|
+
return { path: outPath, mimeType: 'image/svg+xml' };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (resolved.pngBase64) {
|
|
86
|
+
await fs.writeFile(abs, Buffer.from(resolved.pngBase64, 'base64'));
|
|
87
|
+
return { path: outPath, mimeType: 'image/png' };
|
|
88
|
+
}
|
|
89
|
+
if (resolved.bytes) {
|
|
90
|
+
await fs.writeFile(abs, resolved.bytes);
|
|
91
|
+
return { path: outPath, mimeType: resolved.mimeType };
|
|
92
|
+
}
|
|
93
|
+
throw new Error(`cannot save media to ${outPath}`);
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/visualize/image.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,4 +49,11 @@ export declare function resolveOutputPaths(output: string | undefined, entry: st
|
|
|
49
49
|
};
|
|
50
50
|
/** Write the Mermaid source (creating directories as needed). */
|
|
51
51
|
export declare function writeMermaid(mmdPath: string, source: string): Promise<void>;
|
|
52
|
+
export * from './ascii.js';
|
|
53
|
+
export * from './svg.js';
|
|
54
|
+
export * from './raster.js';
|
|
55
|
+
export * from './graphics.js';
|
|
56
|
+
export * from './display.js';
|
|
57
|
+
export * from './image.js';
|
|
58
|
+
export * from './transcode.js';
|
|
52
59
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/visualize/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,MAAM,CAAC;AAIlD,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,WAAW,CAAC;IAClB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAuCpE;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYnD;AAED,gEAAgE;AAChE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBxD;AAED,uDAAuD;AACvD,wBAAgB,mBAAmB,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CAQrF;AAiBD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsC5F;AAED,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAU1E;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CASrH;AAED,iEAAiE;AACjE,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjF"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/visualize/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,MAAM,CAAC;AAIlD,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,WAAW,CAAC;IAClB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAuCpE;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYnD;AAED,gEAAgE;AAChE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBxD;AAED,uDAAuD;AACvD,wBAAgB,mBAAmB,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CAQrF;AAiBD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsC5F;AAED,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAU1E;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CASrH;AAED,iEAAiE;AACjE,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjF;AAID,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
|
package/dist/visualize/index.js
CHANGED
|
@@ -186,4 +186,13 @@ export async function writeMermaid(mmdPath, source) {
|
|
|
186
186
|
await fs.mkdir(path.dirname(path.resolve(mmdPath)), { recursive: true });
|
|
187
187
|
await fs.writeFile(mmdPath, `${source.trim()}\n`, 'utf8');
|
|
188
188
|
}
|
|
189
|
+
// Terminal rendering: Mermaid → Unicode tree, Mermaid → SVG → PNG (no browser),
|
|
190
|
+
// and phone into pi-tui's Kitty/iTerm2 inline-image encoder.
|
|
191
|
+
export * from './ascii.js';
|
|
192
|
+
export * from './svg.js';
|
|
193
|
+
export * from './raster.js';
|
|
194
|
+
export * from './graphics.js';
|
|
195
|
+
export * from './display.js';
|
|
196
|
+
export * from './image.js';
|
|
197
|
+
export * from './transcode.js';
|
|
189
198
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/visualize/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/visualize/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rasterize our generated SVG to PNG for the terminal-image path.
|
|
3
|
+
*
|
|
4
|
+
* `@resvg/resvg-js` is an optional dependency: it is a native module with
|
|
5
|
+
* prebuilt binaries, so it is loaded lazily and the caller falls back to the
|
|
6
|
+
* ASCII renderer when it is unavailable. No browser, no `mmdc`.
|
|
7
|
+
*/
|
|
8
|
+
export interface RasterOptions {
|
|
9
|
+
/** Logical SVG width in px (from `renderFlowchartSvg`). */
|
|
10
|
+
width: number;
|
|
11
|
+
/** Logical SVG height in px. */
|
|
12
|
+
height: number;
|
|
13
|
+
/** Device scale factor (default 2 for crisp text). */
|
|
14
|
+
scale?: number;
|
|
15
|
+
}
|
|
16
|
+
/** True when a PNG rasterizer is installed and importable. */
|
|
17
|
+
export declare function rasterizerAvailable(): Promise<boolean>;
|
|
18
|
+
/**
|
|
19
|
+
* Rasterize SVG text to a PNG buffer, or return undefined when no rasterizer is
|
|
20
|
+
* available (the caller should then use `renderMermaidAscii`).
|
|
21
|
+
*/
|
|
22
|
+
export declare function rasterizeSvg(svg: string, options: RasterOptions): Promise<Buffer | undefined>;
|
|
23
|
+
//# sourceMappingURL=raster.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raster.d.ts","sourceRoot":"","sources":["../../src/visualize/raster.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,aAAa;IAC5B,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAUD,8DAA8D;AAC9D,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAG5D;AAaD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAiBnG"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rasterize our generated SVG to PNG for the terminal-image path.
|
|
3
|
+
*
|
|
4
|
+
* `@resvg/resvg-js` is an optional dependency: it is a native module with
|
|
5
|
+
* prebuilt binaries, so it is loaded lazily and the caller falls back to the
|
|
6
|
+
* ASCII renderer when it is unavailable. No browser, no `mmdc`.
|
|
7
|
+
*/
|
|
8
|
+
/** True when a PNG rasterizer is installed and importable. */
|
|
9
|
+
export async function rasterizerAvailable() {
|
|
10
|
+
const mod = await loadResvg();
|
|
11
|
+
return typeof mod?.Resvg === 'function';
|
|
12
|
+
}
|
|
13
|
+
async function loadResvg() {
|
|
14
|
+
// A variable specifier keeps this file compiling when the optional native
|
|
15
|
+
// dependency is not installed.
|
|
16
|
+
const specifier = '@resvg/resvg-js';
|
|
17
|
+
try {
|
|
18
|
+
return (await import(specifier));
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Rasterize SVG text to a PNG buffer, or return undefined when no rasterizer is
|
|
26
|
+
* available (the caller should then use `renderMermaidAscii`).
|
|
27
|
+
*/
|
|
28
|
+
export async function rasterizeSvg(svg, options) {
|
|
29
|
+
const mod = await loadResvg();
|
|
30
|
+
if (!mod?.Resvg) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
const scale = options.scale ?? 2;
|
|
34
|
+
const width = Math.max(1, Math.round(options.width * scale));
|
|
35
|
+
try {
|
|
36
|
+
const resvg = new mod.Resvg(svg, {
|
|
37
|
+
fitTo: { mode: 'width', value: width },
|
|
38
|
+
background: 'white',
|
|
39
|
+
font: { loadSystemFonts: true },
|
|
40
|
+
});
|
|
41
|
+
return Buffer.from(resvg.render().asPng());
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=raster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raster.js","sourceRoot":"","sources":["../../src/visualize/raster.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmBH,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;IAC9B,OAAO,OAAO,GAAG,EAAE,KAAK,KAAK,UAAU,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,0EAA0E;IAC1E,+BAA+B;IAC/B,MAAM,SAAS,GAAG,iBAAiB,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAgB,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,OAAsB;IACpE,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE;YAC/B,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;YACtC,UAAU,EAAE,OAAO;YACnB,IAAI,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;SAChC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render a parsed Mermaid flowchart as a self-contained SVG — deterministically,
|
|
3
|
+
* with no browser and no layout engine. The SVG is the input to `raster.ts`
|
|
4
|
+
* (SVG → PNG, via `@resvg/resvg-js`) for the terminal-image path, and is also
|
|
5
|
+
* useful on its own (open in a browser, embed in docs).
|
|
6
|
+
*
|
|
7
|
+
* The layout is a simple top-down tree: leaves are placed left-to-right, an
|
|
8
|
+
* internal node is centered over its children, and edges are orthogonal with an
|
|
9
|
+
* arrowhead. Long labels widen the box rather than wrapping.
|
|
10
|
+
*/
|
|
11
|
+
import { type ParsedFlowchart } from './ascii.js';
|
|
12
|
+
export interface FlowchartSvg {
|
|
13
|
+
svg: string;
|
|
14
|
+
width: number;
|
|
15
|
+
height: number;
|
|
16
|
+
/** Number of nodes drawn (0 for an empty/unparsable diagram). */
|
|
17
|
+
nodes: number;
|
|
18
|
+
}
|
|
19
|
+
export interface SvgTheme {
|
|
20
|
+
background: string;
|
|
21
|
+
text: string;
|
|
22
|
+
edge: string;
|
|
23
|
+
edgeLabel: string;
|
|
24
|
+
rectFill: string;
|
|
25
|
+
rectStroke: string;
|
|
26
|
+
decisionFill: string;
|
|
27
|
+
decisionStroke: string;
|
|
28
|
+
roundFill: string;
|
|
29
|
+
roundStroke: string;
|
|
30
|
+
}
|
|
31
|
+
/** Options for the SVG generator. */
|
|
32
|
+
export interface SvgOptions {
|
|
33
|
+
theme?: Partial<SvgTheme>;
|
|
34
|
+
/** Include the `module_doc` title as a caption (default: none). */
|
|
35
|
+
title?: string;
|
|
36
|
+
}
|
|
37
|
+
/** Render a parsed flowchart to SVG text. */
|
|
38
|
+
export declare function renderFlowchartSvg(parsed: ParsedFlowchart, options?: SvgOptions): FlowchartSvg;
|
|
39
|
+
//# sourceMappingURL=svg.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../../src/visualize/svg.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAoD,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpG,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAsDD,qCAAqC;AACrC,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1B,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,6CAA6C;AAC7C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,GAAE,UAAe,GAAG,YAAY,CAuFlG"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render a parsed Mermaid flowchart as a self-contained SVG — deterministically,
|
|
3
|
+
* with no browser and no layout engine. The SVG is the input to `raster.ts`
|
|
4
|
+
* (SVG → PNG, via `@resvg/resvg-js`) for the terminal-image path, and is also
|
|
5
|
+
* useful on its own (open in a browser, embed in docs).
|
|
6
|
+
*
|
|
7
|
+
* The layout is a simple top-down tree: leaves are placed left-to-right, an
|
|
8
|
+
* internal node is centered over its children, and edges are orthogonal with an
|
|
9
|
+
* arrowhead. Long labels widen the box rather than wrapping.
|
|
10
|
+
*/
|
|
11
|
+
import { buildFlowTree } from './ascii.js';
|
|
12
|
+
const THEME = {
|
|
13
|
+
background: '#ffffff',
|
|
14
|
+
text: '#0f172a',
|
|
15
|
+
edge: '#64748b',
|
|
16
|
+
edgeLabel: '#475569',
|
|
17
|
+
rectFill: '#f8fafc',
|
|
18
|
+
rectStroke: '#94a3b8',
|
|
19
|
+
decisionFill: '#eef2ff',
|
|
20
|
+
decisionStroke: '#6366f1',
|
|
21
|
+
roundFill: '#f0fdf4',
|
|
22
|
+
roundStroke: '#16a34a',
|
|
23
|
+
};
|
|
24
|
+
const MARGIN = 28;
|
|
25
|
+
const HGAP = 30;
|
|
26
|
+
const VGAP = 74;
|
|
27
|
+
const BOX_H = 42;
|
|
28
|
+
const ROW_H = BOX_H + VGAP;
|
|
29
|
+
const FONT = 'DejaVu Sans, Liberation Sans, Helvetica, Arial, sans-serif';
|
|
30
|
+
function escapeXml(text) {
|
|
31
|
+
return text
|
|
32
|
+
.replace(/&/g, '&')
|
|
33
|
+
.replace(/</g, '<')
|
|
34
|
+
.replace(/>/g, '>')
|
|
35
|
+
.replace(/"/g, '"')
|
|
36
|
+
.replace(/'/g, ''');
|
|
37
|
+
}
|
|
38
|
+
function boxWidth(node) {
|
|
39
|
+
const base = Math.min(480, Math.max(104, node.label.length * 8.8 + 34));
|
|
40
|
+
return node.shape === 'diamond' ? base + 34 : base;
|
|
41
|
+
}
|
|
42
|
+
function boxHeight(node) {
|
|
43
|
+
return node.shape === 'diamond' ? BOX_H + 16 : BOX_H;
|
|
44
|
+
}
|
|
45
|
+
/** Render a parsed flowchart to SVG text. */
|
|
46
|
+
export function renderFlowchartSvg(parsed, options = {}) {
|
|
47
|
+
const theme = { ...THEME, ...options.theme };
|
|
48
|
+
const roots = buildFlowTree(parsed);
|
|
49
|
+
if (roots.length === 0) {
|
|
50
|
+
const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="200" height="60"><rect width="200" height="60" fill="${theme.background}"/><text x="100" y="34" text-anchor="middle" font-family="${FONT}" font-size="14" fill="${theme.text}">(empty diagram)</text></svg>`;
|
|
51
|
+
return { svg, width: 200, height: 60, nodes: 0 };
|
|
52
|
+
}
|
|
53
|
+
const placed = [];
|
|
54
|
+
const edges = [];
|
|
55
|
+
const titleHeight = options.title ? 34 : 0;
|
|
56
|
+
let cursorX = MARGIN;
|
|
57
|
+
let maxDepth = 0;
|
|
58
|
+
let rightMost = 0;
|
|
59
|
+
const place = (node, depth) => {
|
|
60
|
+
maxDepth = Math.max(maxDepth, depth);
|
|
61
|
+
const w = boxWidth(node);
|
|
62
|
+
const h = boxHeight(node);
|
|
63
|
+
const y = titleHeight + MARGIN + depth * ROW_H;
|
|
64
|
+
if (node.children.length === 0) {
|
|
65
|
+
const x = cursorX;
|
|
66
|
+
cursorX += w + HGAP;
|
|
67
|
+
const p = { node, x, y, w, h };
|
|
68
|
+
placed.push(p);
|
|
69
|
+
rightMost = Math.max(rightMost, x + w);
|
|
70
|
+
return p;
|
|
71
|
+
}
|
|
72
|
+
const children = node.children.map((child) => place(child, depth + 1));
|
|
73
|
+
const first = children[0];
|
|
74
|
+
const last = children[children.length - 1];
|
|
75
|
+
const center = (first.x + first.w / 2 + last.x + last.w / 2) / 2;
|
|
76
|
+
const x = center - w / 2;
|
|
77
|
+
const p = { node, x, y, w, h };
|
|
78
|
+
placed.push(p);
|
|
79
|
+
rightMost = Math.max(rightMost, x + w);
|
|
80
|
+
for (const child of children) {
|
|
81
|
+
edges.push({ from: p, to: child, label: child.node.edgeLabel });
|
|
82
|
+
}
|
|
83
|
+
return p;
|
|
84
|
+
};
|
|
85
|
+
for (const root of roots) {
|
|
86
|
+
place(root, 0);
|
|
87
|
+
}
|
|
88
|
+
const width = Math.max(240, rightMost + MARGIN);
|
|
89
|
+
const height = titleHeight + MARGIN * 2 + (maxDepth + 1) * ROW_H - VGAP;
|
|
90
|
+
const parts = [];
|
|
91
|
+
parts.push(`<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}">`);
|
|
92
|
+
parts.push('<defs>');
|
|
93
|
+
parts.push(`<marker id="dc-arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M 0 0 L 10 5 L 0 10 z" fill="${theme.edge}"/></marker>`);
|
|
94
|
+
parts.push('</defs>');
|
|
95
|
+
parts.push(`<rect width="${width}" height="${height}" fill="${theme.background}"/>`);
|
|
96
|
+
if (options.title) {
|
|
97
|
+
parts.push(`<text x="${MARGIN}" y="24" font-family="${FONT}" font-size="15" font-weight="600" fill="${theme.text}">${escapeXml(options.title)}</text>`);
|
|
98
|
+
}
|
|
99
|
+
// Edges first so nodes sit on top.
|
|
100
|
+
for (const edge of edges) {
|
|
101
|
+
const x1 = edge.from.x + edge.from.w / 2;
|
|
102
|
+
const y1 = edge.from.y + edge.from.h;
|
|
103
|
+
const x2 = edge.to.x + edge.to.w / 2;
|
|
104
|
+
const y2 = edge.to.y;
|
|
105
|
+
const midY = y1 + (y2 - y1) / 2;
|
|
106
|
+
const path = x1 === x2
|
|
107
|
+
? `M ${x1} ${y1} L ${x2} ${y2}`
|
|
108
|
+
: `M ${x1} ${y1} L ${x1} ${midY} L ${x2} ${midY} L ${x2} ${y2}`;
|
|
109
|
+
parts.push(`<path d="${path}" fill="none" stroke="${theme.edge}" stroke-width="1.6" marker-end="url(#dc-arrow)"/>`);
|
|
110
|
+
if (edge.label) {
|
|
111
|
+
const lx = x1 === x2 ? x1 + 8 : (x1 + x2) / 2;
|
|
112
|
+
const ly = midY - 6;
|
|
113
|
+
parts.push(`<text x="${lx}" y="${ly}" text-anchor="middle" font-family="${FONT}" font-size="12" fill="${theme.edgeLabel}">${escapeXml(edge.label)}</text>`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
for (const p of placed) {
|
|
117
|
+
const cx = p.x + p.w / 2;
|
|
118
|
+
const cy = p.y + p.h / 2;
|
|
119
|
+
const shape = shapeElement(p, theme);
|
|
120
|
+
parts.push(shape);
|
|
121
|
+
parts.push(`<text x="${cx}" y="${cy + 5}" text-anchor="middle" font-family="${FONT}" font-size="14" fill="${theme.text}">${escapeXml(p.node.label)}</text>`);
|
|
122
|
+
}
|
|
123
|
+
parts.push('</svg>');
|
|
124
|
+
return { svg: parts.join('\n'), width, height, nodes: placed.length };
|
|
125
|
+
}
|
|
126
|
+
function shapeElement(p, theme) {
|
|
127
|
+
const shape = p.node.shape;
|
|
128
|
+
const common = `stroke-width="1.6"`;
|
|
129
|
+
if (shape === 'diamond') {
|
|
130
|
+
const cx = p.x + p.w / 2;
|
|
131
|
+
const cy = p.y + p.h / 2;
|
|
132
|
+
const points = [
|
|
133
|
+
`${cx},${p.y}`,
|
|
134
|
+
`${p.x + p.w},${cy}`,
|
|
135
|
+
`${cx},${p.y + p.h}`,
|
|
136
|
+
`${p.x},${cy}`,
|
|
137
|
+
].join(' ');
|
|
138
|
+
return `<polygon points="${points}" fill="${theme.decisionFill}" stroke="${theme.decisionStroke}" ${common}/>`;
|
|
139
|
+
}
|
|
140
|
+
if (shape === 'circle') {
|
|
141
|
+
return `<ellipse cx="${p.x + p.w / 2}" cy="${p.y + p.h / 2}" rx="${p.w / 2}" ry="${p.h / 2}" fill="${theme.roundFill}" stroke="${theme.roundStroke}" ${common}/>`;
|
|
142
|
+
}
|
|
143
|
+
if (shape === 'round' || shape === 'stadium') {
|
|
144
|
+
return `<rect x="${p.x}" y="${p.y}" width="${p.w}" height="${p.h}" rx="${p.h / 2}" fill="${theme.roundFill}" stroke="${theme.roundStroke}" ${common}/>`;
|
|
145
|
+
}
|
|
146
|
+
return `<rect x="${p.x}" y="${p.y}" width="${p.w}" height="${p.h}" rx="8" fill="${theme.rectFill}" stroke="${theme.rectStroke}" ${common}/>`;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=svg.js.map
|