deepclause-sdk 0.0.89 → 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 +481 -941
- package/dist/agent.d.ts +19 -2
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +75 -21
- package/dist/agent.js.map +1 -1
- package/dist/cli/config.d.ts +385 -178
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +161 -188
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/index.d.ts +3 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +85 -411
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/login.d.ts +29 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/login.js +184 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/readline.d.ts +6 -0
- package/dist/cli/readline.d.ts.map +1 -0
- package/dist/cli/readline.js +15 -0
- package/dist/cli/readline.js.map +1 -0
- package/dist/cli/repl-bin.d.ts +9 -0
- package/dist/cli/repl-bin.d.ts.map +1 -0
- package/dist/cli/repl-bin.js +16 -0
- package/dist/cli/repl-bin.js.map +1 -0
- package/dist/cli/repl.d.ts +216 -0
- package/dist/cli/repl.d.ts.map +1 -0
- package/dist/cli/repl.js +1392 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli/run.d.ts +17 -18
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +202 -183
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/set-backend.d.ts +53 -0
- package/dist/cli/set-backend.d.ts.map +1 -0
- package/dist/cli/set-backend.js +259 -0
- package/dist/cli/set-backend.js.map +1 -0
- package/dist/cli/visualize.d.ts +42 -0
- package/dist/cli/visualize.d.ts.map +1 -0
- package/dist/cli/visualize.js +150 -0
- package/dist/cli/visualize.js.map +1 -0
- package/dist/compiler.d.ts +5 -52
- package/dist/compiler.d.ts.map +1 -1
- package/dist/compiler.js +4 -768
- package/dist/compiler.js.map +1 -1
- package/dist/index.d.ts +27 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -2
- package/dist/index.js.map +1 -1
- package/dist/prolog/bridge.d.ts +5 -1
- package/dist/prolog/bridge.d.ts.map +1 -1
- package/dist/prolog/bridge.js +10 -1
- package/dist/prolog/bridge.js.map +1 -1
- package/dist/prolog-src/deepclause_analysis.pl +10 -2
- package/dist/prolog-src/deepclause_mi.pl +2440 -49
- package/dist/repl/agent.d.ts +90 -0
- package/dist/repl/agent.d.ts.map +1 -0
- package/dist/repl/agent.js +410 -0
- package/dist/repl/agent.js.map +1 -0
- package/dist/repl/auth.d.ts +45 -0
- package/dist/repl/auth.d.ts.map +1 -0
- package/dist/repl/auth.js +116 -0
- package/dist/repl/auth.js.map +1 -0
- package/dist/repl/backend.d.ts +321 -0
- package/dist/repl/backend.d.ts.map +1 -0
- package/dist/repl/backend.js +415 -0
- package/dist/repl/backend.js.map +1 -0
- package/dist/repl/compaction.d.ts +122 -0
- package/dist/repl/compaction.d.ts.map +1 -0
- package/dist/repl/compaction.js +318 -0
- package/dist/repl/compaction.js.map +1 -0
- package/dist/repl/export.d.ts +30 -0
- package/dist/repl/export.d.ts.map +1 -0
- package/dist/repl/export.js +23 -0
- package/dist/repl/export.js.map +1 -0
- package/dist/repl/frames.d.ts +21 -0
- package/dist/repl/frames.d.ts.map +1 -0
- package/dist/repl/frames.js +79 -0
- package/dist/repl/frames.js.map +1 -0
- package/dist/repl/harness-tools.d.ts +99 -0
- package/dist/repl/harness-tools.d.ts.map +1 -0
- package/dist/repl/harness-tools.js +192 -0
- package/dist/repl/harness-tools.js.map +1 -0
- package/dist/repl/highlight.d.ts +30 -0
- package/dist/repl/highlight.d.ts.map +1 -0
- package/dist/repl/highlight.js +285 -0
- package/dist/repl/highlight.js.map +1 -0
- package/dist/repl/history.d.ts +234 -0
- package/dist/repl/history.d.ts.map +1 -0
- package/dist/repl/history.js +661 -0
- package/dist/repl/history.js.map +1 -0
- 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 +130 -0
- package/dist/repl/index.d.ts.map +1 -0
- package/dist/repl/index.js +112 -0
- package/dist/repl/index.js.map +1 -0
- package/dist/repl/judge.d.ts +51 -0
- package/dist/repl/judge.d.ts.map +1 -0
- package/dist/repl/judge.js +58 -0
- package/dist/repl/judge.js.map +1 -0
- package/dist/repl/markdown.d.ts +25 -0
- package/dist/repl/markdown.d.ts.map +1 -0
- package/dist/repl/markdown.js +103 -0
- package/dist/repl/markdown.js.map +1 -0
- 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/picker.d.ts +34 -0
- package/dist/repl/picker.d.ts.map +1 -0
- package/dist/repl/picker.js +81 -0
- package/dist/repl/picker.js.map +1 -0
- package/dist/repl/project-context.d.ts +16 -0
- package/dist/repl/project-context.d.ts.map +1 -0
- package/dist/repl/project-context.js +23 -0
- package/dist/repl/project-context.js.map +1 -0
- package/dist/repl/render.d.ts +187 -0
- package/dist/repl/render.d.ts.map +1 -0
- package/dist/repl/render.js +808 -0
- package/dist/repl/render.js.map +1 -0
- package/dist/repl/session.d.ts +424 -0
- package/dist/repl/session.d.ts.map +1 -0
- package/dist/repl/session.js +1473 -0
- package/dist/repl/session.js.map +1 -0
- package/dist/repl/status.d.ts +100 -0
- package/dist/repl/status.d.ts.map +1 -0
- package/dist/repl/status.js +218 -0
- package/dist/repl/status.js.map +1 -0
- package/dist/repl/tools.d.ts +53 -0
- package/dist/repl/tools.d.ts.map +1 -0
- package/dist/repl/tools.js +307 -0
- package/dist/repl/tools.js.map +1 -0
- package/dist/repl/toolset.d.ts +32 -0
- package/dist/repl/toolset.d.ts.map +1 -0
- package/dist/repl/toolset.js +82 -0
- package/dist/repl/toolset.js.map +1 -0
- package/dist/repl/tui/editor.d.ts +17 -0
- package/dist/repl/tui/editor.d.ts.map +1 -0
- package/dist/repl/tui/editor.js +39 -0
- package/dist/repl/tui/editor.js.map +1 -0
- package/dist/repl/tui/status-bar.d.ts +26 -0
- package/dist/repl/tui/status-bar.d.ts.map +1 -0
- package/dist/repl/tui/status-bar.js +47 -0
- package/dist/repl/tui/status-bar.js.map +1 -0
- package/dist/repl/tui/theme.d.ts +30 -0
- package/dist/repl/tui/theme.d.ts.map +1 -0
- package/dist/repl/tui/theme.js +81 -0
- package/dist/repl/tui/theme.js.map +1 -0
- package/dist/repl/tui/transcript.d.ts +41 -0
- package/dist/repl/tui/transcript.d.ts.map +1 -0
- package/dist/repl/tui/transcript.js +139 -0
- package/dist/repl/tui/transcript.js.map +1 -0
- package/dist/runner.d.ts +143 -13
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +532 -290
- package/dist/runner.js.map +1 -1
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +0 -32
- package/dist/sdk.js.map +1 -1
- package/dist/system/assets/docs/AGENT_PROMPT.md +1447 -0
- package/dist/system/assets/docs/DML_AUTHORING.md +195 -0
- package/dist/system/assets/docs/DML_REFERENCE.md +344 -72
- package/dist/system/assets/docs/HARNESS_EXAMPLES.md +172 -0
- package/dist/system/assets/docs/HARNESS_PATTERNS.md +562 -0
- package/dist/system/assets/docs/META_PROMPT.md +68 -0
- package/dist/system/assets/docs/PROLOG_SNIPPETS.md +117 -0
- package/dist/system/assets/index.d.ts +9 -17
- package/dist/system/assets/index.d.ts.map +1 -1
- package/dist/system/assets/index.js +26 -85
- package/dist/system/assets/index.js.map +1 -1
- package/dist/system/runtime/agentvm-manager.d.ts +9 -2
- package/dist/system/runtime/agentvm-manager.d.ts.map +1 -1
- package/dist/system/runtime/agentvm-manager.js +70 -44
- package/dist/system/runtime/agentvm-manager.js.map +1 -1
- package/dist/system/runtime/media.d.ts +23 -0
- package/dist/system/runtime/media.d.ts.map +1 -0
- package/dist/system/runtime/media.js +55 -0
- package/dist/system/runtime/media.js.map +1 -0
- package/dist/system/runtime/shell-limits.d.ts +21 -0
- package/dist/system/runtime/shell-limits.d.ts.map +1 -0
- package/dist/system/runtime/shell-limits.js +39 -0
- package/dist/system/runtime/shell-limits.js.map +1 -0
- package/dist/system/runtime/shell-manager.d.ts +8 -3
- package/dist/system/runtime/shell-manager.d.ts.map +1 -1
- package/dist/system/runtime/shell-manager.js +56 -39
- package/dist/system/runtime/shell-manager.js.map +1 -1
- package/dist/system/runtime/shell-tool-events.js +5 -0
- package/dist/system/runtime/shell-tool-events.js.map +1 -1
- package/dist/system/runtime/token-usage.d.ts +2 -0
- package/dist/system/runtime/token-usage.d.ts.map +1 -1
- package/dist/system/runtime/token-usage.js +7 -0
- package/dist/system/runtime/token-usage.js.map +1 -1
- package/dist/tools.d.ts +3 -21
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +14 -168
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +136 -119
- package/dist/types.d.ts.map +1 -1
- package/dist/validate.d.ts +19 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +338 -0
- package/dist/validate.js.map +1 -0
- 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 +59 -0
- package/dist/visualize/index.d.ts.map +1 -0
- package/dist/visualize/index.js +198 -0
- package/dist/visualize/index.js.map +1 -0
- 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 +19 -15
- package/src/prolog-src/deepclause_analysis.pl +10 -2
- package/src/prolog-src/deepclause_mi.pl +2440 -49
- package/dist/cli/commands.d.ts +0 -42
- package/dist/cli/commands.d.ts.map +0 -1
- package/dist/cli/commands.js +0 -246
- package/dist/cli/commands.js.map +0 -1
- package/dist/cli/compile.d.ts +0 -99
- package/dist/cli/compile.d.ts.map +0 -1
- package/dist/cli/compile.js +0 -363
- package/dist/cli/compile.js.map +0 -1
- package/dist/cli/default-skills.d.ts +0 -10
- package/dist/cli/default-skills.d.ts.map +0 -1
- package/dist/cli/default-skills.js +0 -206
- package/dist/cli/default-skills.js.map +0 -1
- package/dist/cli/interactive.d.ts +0 -2
- package/dist/cli/interactive.d.ts.map +0 -1
- package/dist/cli/interactive.js +0 -20
- package/dist/cli/interactive.js.map +0 -1
- package/dist/cli/mcp.d.ts +0 -56
- package/dist/cli/mcp.d.ts.map +0 -1
- package/dist/cli/mcp.js +0 -138
- package/dist/cli/mcp.js.map +0 -1
- package/dist/cli/prompt.d.ts +0 -2
- package/dist/cli/prompt.d.ts.map +0 -1
- package/dist/cli/prompt.js +0 -2
- package/dist/cli/prompt.js.map +0 -1
- package/dist/cli/search.d.ts +0 -19
- package/dist/cli/search.d.ts.map +0 -1
- package/dist/cli/search.js +0 -189
- package/dist/cli/search.js.map +0 -1
- package/dist/cli/tool-args.d.ts +0 -2
- package/dist/cli/tool-args.d.ts.map +0 -1
- package/dist/cli/tool-args.js +0 -39
- package/dist/cli/tool-args.js.map +0 -1
- package/dist/cli/tools.d.ts +0 -36
- package/dist/cli/tools.d.ts.map +0 -1
- package/dist/cli/tools.js +0 -229
- package/dist/cli/tools.js.map +0 -1
- package/dist/cli/tui/index.d.ts +0 -22
- package/dist/cli/tui/index.d.ts.map +0 -1
- package/dist/cli/tui/index.js +0 -29
- package/dist/cli/tui/index.js.map +0 -1
- package/dist/cli/tui.d.ts +0 -167
- package/dist/cli/tui.d.ts.map +0 -1
- package/dist/cli/tui.js +0 -5228
- package/dist/cli/tui.js.map +0 -1
- package/dist/compiler_prompt.d.ts +0 -20
- package/dist/compiler_prompt.d.ts.map +0 -1
- package/dist/compiler_prompt.js +0 -870
- package/dist/compiler_prompt.js.map +0 -1
- package/dist/deepclause-cli.skill +0 -0
- package/dist/prolog-src/deepclause_mi.pl.bak +0 -570
- package/dist/system/assets/docs/CONDUCTOR_PROMPT.md +0 -105
- package/dist/system/assets/docs/DML_COMPILER_PROMPT.md +0 -700
- package/dist/system/assets/docs/TUI.md +0 -150
- package/dist/system/assets/recipes/deepclause-coding-workflow/SKILL.md +0 -100
- package/dist/system/assets/skills/conductor.dml +0 -76
- package/dist/system/assets/skills/deep-planner.dml +0 -412
- package/dist/system/assets/skills/plan.dml +0 -429
- package/dist/system/assets/skills/security-planner.dml +0 -337
- package/dist/system/assets/skills/skill-creator.dml +0 -187
- package/dist/system/runtime/catalog-recipes.d.ts +0 -24
- package/dist/system/runtime/catalog-recipes.d.ts.map +0 -1
- package/dist/system/runtime/catalog-recipes.js +0 -273
- package/dist/system/runtime/catalog-recipes.js.map +0 -1
- package/dist/system/runtime/catalog-skills.d.ts +0 -50
- package/dist/system/runtime/catalog-skills.d.ts.map +0 -1
- package/dist/system/runtime/catalog-skills.js +0 -152
- package/dist/system/runtime/catalog-skills.js.map +0 -1
- package/dist/system/runtime/conductor.d.ts +0 -105
- package/dist/system/runtime/conductor.d.ts.map +0 -1
- package/dist/system/runtime/conductor.js +0 -732
- package/dist/system/runtime/conductor.js.map +0 -1
- package/dist/system/runtime/console-capture.d.ts +0 -9
- package/dist/system/runtime/console-capture.d.ts.map +0 -1
- package/dist/system/runtime/console-capture.js +0 -67
- package/dist/system/runtime/console-capture.js.map +0 -1
- package/dist/system/runtime/dml-executor.d.ts +0 -52
- package/dist/system/runtime/dml-executor.d.ts.map +0 -1
- package/dist/system/runtime/dml-executor.js +0 -203
- package/dist/system/runtime/dml-executor.js.map +0 -1
- package/dist/system/runtime/runtime-tools.d.ts +0 -31
- package/dist/system/runtime/runtime-tools.d.ts.map +0 -1
- package/dist/system/runtime/runtime-tools.js +0 -312
- package/dist/system/runtime/runtime-tools.js.map +0 -1
- package/dist/system/runtime/skill-creator.d.ts +0 -38
- package/dist/system/runtime/skill-creator.d.ts.map +0 -1
- package/dist/system/runtime/skill-creator.js +0 -763
- package/dist/system/runtime/skill-creator.js.map +0 -1
- package/src/prolog-src/deepclause_mi.pl.bak +0 -570
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ascii.js","sourceRoot":"","sources":["../../src/visualize/ascii.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared "diagram → terminal image" step.
|
|
3
|
+
*
|
|
4
|
+
* Both `/viz` (user-typed) and the authoring agent's `visualize` tool use this,
|
|
5
|
+
* so a diagram is painted the same way everywhere: resolve the terminal's image
|
|
6
|
+
* protocol, rasterize the SVG (no browser), and encode an inline image. Returns
|
|
7
|
+
* undefined when the terminal has no image support or no rasterizer is
|
|
8
|
+
* installed, so the caller can fall back to the ASCII tree.
|
|
9
|
+
*/
|
|
10
|
+
import { type GraphicsMode } from './graphics.js';
|
|
11
|
+
export interface DiagramImageSource {
|
|
12
|
+
svg: string;
|
|
13
|
+
width: number;
|
|
14
|
+
height: number;
|
|
15
|
+
}
|
|
16
|
+
export interface DiagramImageOptions {
|
|
17
|
+
/** `auto` (default) or a forced protocol; `ascii`/`off` disable the image. */
|
|
18
|
+
graphics?: GraphicsMode;
|
|
19
|
+
maxWidthCells?: number;
|
|
20
|
+
maxHeightCells?: number;
|
|
21
|
+
}
|
|
22
|
+
/** Encode a diagram as inline terminal-image lines, or undefined. */
|
|
23
|
+
export declare function renderDiagramImage(source: DiagramImageSource, options?: DiagramImageOptions): Promise<string[] | undefined>;
|
|
24
|
+
//# sourceMappingURL=display.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/visualize/display.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAgD,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAEhG,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qEAAqE;AACrE,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,CAe/B"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared "diagram → terminal image" step.
|
|
3
|
+
*
|
|
4
|
+
* Both `/viz` (user-typed) and the authoring agent's `visualize` tool use this,
|
|
5
|
+
* so a diagram is painted the same way everywhere: resolve the terminal's image
|
|
6
|
+
* protocol, rasterize the SVG (no browser), and encode an inline image. Returns
|
|
7
|
+
* undefined when the terminal has no image support or no rasterizer is
|
|
8
|
+
* installed, so the caller can fall back to the ASCII tree.
|
|
9
|
+
*/
|
|
10
|
+
import { rasterizeSvg } from './raster.js';
|
|
11
|
+
import { renderTerminalImage, resolveGraphicsProtocol } from './graphics.js';
|
|
12
|
+
/** Encode a diagram as inline terminal-image lines, or undefined. */
|
|
13
|
+
export async function renderDiagramImage(source, options = {}) {
|
|
14
|
+
const protocol = resolveGraphicsProtocol(options.graphics ?? 'auto');
|
|
15
|
+
if (!protocol) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
const png = await rasterizeSvg(source.svg, { width: source.width, height: source.height });
|
|
19
|
+
if (!png) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
const image = renderTerminalImage(png, {
|
|
23
|
+
protocol,
|
|
24
|
+
maxWidthCells: options.maxWidthCells ?? 80,
|
|
25
|
+
maxHeightCells: options.maxHeightCells,
|
|
26
|
+
});
|
|
27
|
+
return image?.lines;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=display.js.map
|
|
@@ -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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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `deepclause visualize` — turn a harness (its `listing`, including `doc/2` and
|
|
3
|
+
* `module_doc/1`) into a Mermaid diagram.
|
|
4
|
+
*
|
|
5
|
+
* Two granularities, mirroring sop2harness:
|
|
6
|
+
* - `presentation`: a general-audience overview (inputs, steps, answer).
|
|
7
|
+
* - `spec`: engineering detail (decisions, thresholds, task/exec calls,
|
|
8
|
+
* branches, fallbacks).
|
|
9
|
+
*
|
|
10
|
+
* The Mermaid source is always the deliverable; PNG/SVG rendering is best
|
|
11
|
+
* effort via `@mermaid-js/mermaid-cli` (`mmdc`) when it is available.
|
|
12
|
+
*/
|
|
13
|
+
export type DiagramMode = 'presentation' | 'spec';
|
|
14
|
+
export interface DiagramPromptInput {
|
|
15
|
+
/** Entry predicate, e.g. `router/2`. */
|
|
16
|
+
entry: string;
|
|
17
|
+
mode: DiagramMode;
|
|
18
|
+
/** The harness `listing` text (source + `doc/2` annotations + manifest). */
|
|
19
|
+
listing: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Build the diagram-generation prompt. The model only sees the harness listing
|
|
23
|
+
* (source + docs) and the entry point, and must return Mermaid only.
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildDiagramPrompt(input: DiagramPromptInput): string;
|
|
26
|
+
/** Extract Mermaid source from a model reply (strips fences and leading prose). */
|
|
27
|
+
export declare function extractMermaid(text: string): string;
|
|
28
|
+
/** Light structural validation (same spirit as sop2harness). */
|
|
29
|
+
export declare function validateMermaid(source: string): string[];
|
|
30
|
+
/** A mermaid renderer command, if one is available. */
|
|
31
|
+
export declare function findMermaidRenderer(): {
|
|
32
|
+
command: string;
|
|
33
|
+
args: string[];
|
|
34
|
+
} | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* Render a `.mmd` file to an image. Returns the renderer used, or throws with a
|
|
37
|
+
* helpful message when no renderer is available.
|
|
38
|
+
*/
|
|
39
|
+
export declare function renderMermaidFile(mmdPath: string, outputPath: string): Promise<string>;
|
|
40
|
+
/** Split `name/arity` (or `name`) into a predicate name and arity. */
|
|
41
|
+
export declare function parseEntry(entry: string): {
|
|
42
|
+
name: string;
|
|
43
|
+
arity?: number;
|
|
44
|
+
};
|
|
45
|
+
/** Resolve the `.mmd` path and the optional image path from `--output`. */
|
|
46
|
+
export declare function resolveOutputPaths(output: string | undefined, entry: string): {
|
|
47
|
+
mmdPath: string;
|
|
48
|
+
imagePath?: string;
|
|
49
|
+
};
|
|
50
|
+
/** Write the Mermaid source (creating directories as needed). */
|
|
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';
|
|
59
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +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;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"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `deepclause visualize` — turn a harness (its `listing`, including `doc/2` and
|
|
3
|
+
* `module_doc/1`) into a Mermaid diagram.
|
|
4
|
+
*
|
|
5
|
+
* Two granularities, mirroring sop2harness:
|
|
6
|
+
* - `presentation`: a general-audience overview (inputs, steps, answer).
|
|
7
|
+
* - `spec`: engineering detail (decisions, thresholds, task/exec calls,
|
|
8
|
+
* branches, fallbacks).
|
|
9
|
+
*
|
|
10
|
+
* The Mermaid source is always the deliverable; PNG/SVG rendering is best
|
|
11
|
+
* effort via `@mermaid-js/mermaid-cli` (`mmdc`) when it is available.
|
|
12
|
+
*/
|
|
13
|
+
import { spawnSync } from 'child_process';
|
|
14
|
+
import * as fs from 'fs/promises';
|
|
15
|
+
import * as os from 'os';
|
|
16
|
+
import * as path from 'path';
|
|
17
|
+
const DIAGRAM_TYPE = /^\s*(flowchart|graph|sequenceDiagram|classDiagram|stateDiagram|erDiagram|journey|gantt|pie)\b/i;
|
|
18
|
+
/**
|
|
19
|
+
* Build the diagram-generation prompt. The model only sees the harness listing
|
|
20
|
+
* (source + docs) and the entry point, and must return Mermaid only.
|
|
21
|
+
*/
|
|
22
|
+
export function buildDiagramPrompt(input) {
|
|
23
|
+
const kind = input.mode === 'presentation'
|
|
24
|
+
? [
|
|
25
|
+
'KIND: presentation — a general-audience overview.',
|
|
26
|
+
'- Show the skill name, its inputs, the main steps in order, and the final answer.',
|
|
27
|
+
'- Read like a process a stakeholder could follow. Avoid Prolog syntax and predicate names in labels.',
|
|
28
|
+
].join('\n')
|
|
29
|
+
: [
|
|
30
|
+
'KIND: specification — engineering detail.',
|
|
31
|
+
'- Show every decision (choose/verify/rate/probability, holds), threshold, and rule fact.',
|
|
32
|
+
'- Show task/N and prompt/N model calls (with their typed outputs), exec/2 tool calls, branches,',
|
|
33
|
+
' backtracking, and explicit fallback paths.',
|
|
34
|
+
].join('\n');
|
|
35
|
+
return [
|
|
36
|
+
'You are a technical writer who turns DeepClause (Prolog/DML) agent harnesses into Mermaid diagrams.',
|
|
37
|
+
'',
|
|
38
|
+
`Produce ONE Mermaid diagram for the skill \`${input.entry}\` in the harness below.`,
|
|
39
|
+
'',
|
|
40
|
+
'OUTPUT RULES',
|
|
41
|
+
'- Return ONLY Mermaid source. No prose, no explanation, no ``` code fences.',
|
|
42
|
+
'- The first line must be `flowchart TD` or `flowchart LR`.',
|
|
43
|
+
'- Quote any node label containing spaces or punctuation: A["text"], B["x = 1"].',
|
|
44
|
+
'- Plain flowchart syntax only (nodes, edges, subgraphs). No `classDef`/`style`/`click` directives.',
|
|
45
|
+
'- Keep it readable: at most about 20 nodes.',
|
|
46
|
+
'',
|
|
47
|
+
'HARNESS SEMANTICS',
|
|
48
|
+
'- task/N, prompt/N: a model call (prompt/N has fresh context).',
|
|
49
|
+
'- exec(Tool(...)): a host tool call (usually bash).',
|
|
50
|
+
'- choose/verify/rate/probability, holds: a semantic judgment (a decision).',
|
|
51
|
+
'- Multiple clauses / `;` / `->`: alternative paths; show the "else"/fallback.',
|
|
52
|
+
'',
|
|
53
|
+
kind,
|
|
54
|
+
'',
|
|
55
|
+
`HARNESS (focus: ${input.entry}; the listing includes each predicate and its doc/2 annotation)`,
|
|
56
|
+
'```',
|
|
57
|
+
input.listing.trim() || '(empty harness)',
|
|
58
|
+
'```',
|
|
59
|
+
].join('\n');
|
|
60
|
+
}
|
|
61
|
+
/** Extract Mermaid source from a model reply (strips fences and leading prose). */
|
|
62
|
+
export function extractMermaid(text) {
|
|
63
|
+
let out = (text ?? '').trim();
|
|
64
|
+
const fence = out.match(/```(?:mermaid)?\s*\n?([\s\S]*?)```/i);
|
|
65
|
+
if (fence) {
|
|
66
|
+
out = fence[1].trim();
|
|
67
|
+
}
|
|
68
|
+
const lines = out.split('\n');
|
|
69
|
+
const start = lines.findIndex((line) => DIAGRAM_TYPE.test(line));
|
|
70
|
+
if (start > 0) {
|
|
71
|
+
out = lines.slice(start).join('\n').trim();
|
|
72
|
+
}
|
|
73
|
+
return out;
|
|
74
|
+
}
|
|
75
|
+
/** Light structural validation (same spirit as sop2harness). */
|
|
76
|
+
export function validateMermaid(source) {
|
|
77
|
+
const issues = [];
|
|
78
|
+
const lines = source.split('\n').map((line) => line.trim()).filter(Boolean);
|
|
79
|
+
if (lines.length === 0) {
|
|
80
|
+
return ['the diagram is empty'];
|
|
81
|
+
}
|
|
82
|
+
const first = lines.find((line) => !line.startsWith('%%'));
|
|
83
|
+
if (!first) {
|
|
84
|
+
issues.push('no diagram body (only comments)');
|
|
85
|
+
}
|
|
86
|
+
else if (!DIAGRAM_TYPE.test(first)) {
|
|
87
|
+
issues.push(`unrecognized diagram type: ${first.split(/\s+/)[0]}`);
|
|
88
|
+
}
|
|
89
|
+
for (const [open, close] of [['{', '}'], ['[', ']'], ['(', ')']]) {
|
|
90
|
+
const opens = (source.match(new RegExp(`\\${open}`, 'g')) ?? []).length;
|
|
91
|
+
const closes = (source.match(new RegExp(`\\${close}`, 'g')) ?? []).length;
|
|
92
|
+
if (opens !== closes) {
|
|
93
|
+
issues.push(`unbalanced ${open}${close} (${opens}/${closes})`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return issues;
|
|
97
|
+
}
|
|
98
|
+
/** A mermaid renderer command, if one is available. */
|
|
99
|
+
export function findMermaidRenderer() {
|
|
100
|
+
const which = process.platform === 'win32' ? 'where' : 'which';
|
|
101
|
+
for (const candidate of ['mmdc', 'mmdc.cmd']) {
|
|
102
|
+
if (spawnSync(which, [candidate], { stdio: 'ignore' }).status === 0) {
|
|
103
|
+
return { command: candidate, args: [] };
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
/** Absolute path to a system Chromium/Chrome, for puppeteer to launch. */
|
|
109
|
+
function findChrome() {
|
|
110
|
+
const which = process.platform === 'win32' ? 'where' : 'which';
|
|
111
|
+
for (const candidate of ['google-chrome', 'chromium', 'chromium-browser', 'chrome']) {
|
|
112
|
+
const result = spawnSync(which, [candidate], { encoding: 'utf8' });
|
|
113
|
+
if (result.status === 0) {
|
|
114
|
+
const first = (result.stdout ?? '').trim().split('\n')[0].trim();
|
|
115
|
+
if (first) {
|
|
116
|
+
return first;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Render a `.mmd` file to an image. Returns the renderer used, or throws with a
|
|
124
|
+
* helpful message when no renderer is available.
|
|
125
|
+
*/
|
|
126
|
+
export async function renderMermaidFile(mmdPath, outputPath) {
|
|
127
|
+
const renderer = findMermaidRenderer();
|
|
128
|
+
const command = renderer ? renderer.command : 'npx';
|
|
129
|
+
const args = renderer ? [...renderer.args] : ['--yes', '@mermaid-js/mermaid-cli'];
|
|
130
|
+
args.push('-i', mmdPath, '-o', outputPath, '-b', 'white');
|
|
131
|
+
const env = { ...process.env };
|
|
132
|
+
if (!env.PUPPETEER_EXECUTABLE_PATH) {
|
|
133
|
+
const chrome = findChrome();
|
|
134
|
+
if (chrome) {
|
|
135
|
+
env.PUPPETEER_EXECUTABLE_PATH = chrome;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Reuse the system browser instead of downloading Chromium for puppeteer.
|
|
139
|
+
if (env.PUPPETEER_EXECUTABLE_PATH && env.PUPPETEER_SKIP_DOWNLOAD == null) {
|
|
140
|
+
env.PUPPETEER_SKIP_DOWNLOAD = 'true';
|
|
141
|
+
}
|
|
142
|
+
// Chrome sandbox flags (mirrors sop2harness's `mmdc -p <config>` usage).
|
|
143
|
+
const configPath = path.join(os.tmpdir(), `deepclause-mermaid-${process.pid}.json`);
|
|
144
|
+
await fs.writeFile(configPath, JSON.stringify({
|
|
145
|
+
args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage'],
|
|
146
|
+
}));
|
|
147
|
+
args.push('-p', configPath);
|
|
148
|
+
try {
|
|
149
|
+
const result = spawnSync(command, args, { env, encoding: 'utf8' });
|
|
150
|
+
if (result.status !== 0) {
|
|
151
|
+
const reason = (result.stderr || result.stdout || '').trim().split('\n').slice(-3).join(' ');
|
|
152
|
+
throw new Error(`Mermaid renderer failed${reason ? `: ${reason}` : ''}. `
|
|
153
|
+
+ 'Install it with `npm i -g @mermaid-js/mermaid-cli` (or use `--output <file>.mmd`).');
|
|
154
|
+
}
|
|
155
|
+
return renderer ? renderer.command : 'npx @mermaid-js/mermaid-cli';
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
await fs.rm(configPath, { force: true });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/** Split `name/arity` (or `name`) into a predicate name and arity. */
|
|
162
|
+
export function parseEntry(entry) {
|
|
163
|
+
const match = entry.trim().match(/^([A-Za-z_][A-Za-z0-9_]*)\s*\/\s*(\d+)$/);
|
|
164
|
+
if (match) {
|
|
165
|
+
return { name: match[1], arity: Number(match[2]) };
|
|
166
|
+
}
|
|
167
|
+
const bare = entry.trim().match(/^([A-Za-z_][A-Za-z0-9_]*)$/);
|
|
168
|
+
if (bare) {
|
|
169
|
+
return { name: bare[1] };
|
|
170
|
+
}
|
|
171
|
+
throw new Error(`invalid entry '${entry}': expected Name/Arity (e.g. router/2)`);
|
|
172
|
+
}
|
|
173
|
+
/** Resolve the `.mmd` path and the optional image path from `--output`. */
|
|
174
|
+
export function resolveOutputPaths(output, entry) {
|
|
175
|
+
const fallback = `${entry.replace(/[^A-Za-z0-9_.-]/g, '_') || 'diagram'}.mmd`;
|
|
176
|
+
const target = output ?? fallback;
|
|
177
|
+
if (target.toLowerCase().endsWith('.mmd')) {
|
|
178
|
+
return { mmdPath: target };
|
|
179
|
+
}
|
|
180
|
+
const ext = path.extname(target);
|
|
181
|
+
const mmdPath = ext ? `${target.slice(0, -ext.length)}.mmd` : `${target}.mmd`;
|
|
182
|
+
return { mmdPath, imagePath: target };
|
|
183
|
+
}
|
|
184
|
+
/** Write the Mermaid source (creating directories as needed). */
|
|
185
|
+
export async function writeMermaid(mmdPath, source) {
|
|
186
|
+
await fs.mkdir(path.dirname(path.resolve(mmdPath)), { recursive: true });
|
|
187
|
+
await fs.writeFile(mmdPath, `${source.trim()}\n`, 'utf8');
|
|
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';
|
|
198
|
+
//# sourceMappingURL=index.js.map
|