@wayofmono/wo-mermaid 1.0.0
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/LICENSE +21 -0
- package/README.md +257 -0
- package/SKILL.md +31 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +505 -0
- package/dist/index.js.map +1 -0
- package/package.json +45 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Gurpartap Singh
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
# π§ββοΈ pi-mermaid
|
|
2
|
+
|
|
3
|
+
[](https://pi.dev/)
|
|
4
|
+
[](https://www.npmjs.com/package/pi-mermaid)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
7
|
+
Pi extension that renders Mermaid diagrams as ASCII in the TUI. It uses [Mermaid's parser](https://github.com/mermaid-js/mermaid) for syntax validation and [beautiful-mermaid](https://github.com/lukilabs/beautiful-mermaid) to render the ASCII art.
|
|
8
|
+
|
|
9
|
+
Pi β https://pi.dev/
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
- Renders Mermaid blocks as ASCII diagrams inside Pi's TUI
|
|
13
|
+
- Width-aware rendering: auto-selects tighter padding presets and clips output for narrow terminals
|
|
14
|
+
- Collapsible output with source shown only on expand (ctrl+o)
|
|
15
|
+
- Token efficiently adds parser warnings/errors to LLM context
|
|
16
|
+
- Handles large blocks with safety limits and caching
|
|
17
|
+
|
|
18
|
+
## Demo
|
|
19
|
+
<video controls src="https://raw.githubusercontent.com/Gurpartap/pi-mermaid/refs/heads/main/assets/pi-mermaid.mp4" title="pi-mermaid demo"></video>
|
|
20
|
+
|
|
21
|
+
## Install
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
pi install npm:pi-mermaid
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Or, clone into your Pi extensions directory and enable it:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
git clone https://github.com/Gurpartap/pi-mermaid ~/.pi/agent/extensions/pi-mermaid
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
After installing, enter `/reload` or restart Pi.
|
|
34
|
+
|
|
35
|
+
## Usage
|
|
36
|
+
Use Mermaid fenced blocks in chat:
|
|
37
|
+
|
|
38
|
+
````
|
|
39
|
+
```mermaid
|
|
40
|
+
graph TD
|
|
41
|
+
Start --> End
|
|
42
|
+
```
|
|
43
|
+
````
|
|
44
|
+
|
|
45
|
+
Or render the last assistant message:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
/pi-mermaid
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Examples
|
|
52
|
+
More examples: https://agents.craft.do/mermaid
|
|
53
|
+
|
|
54
|
+
````
|
|
55
|
+
Mermaid (ASCII)
|
|
56
|
+
βββββββββ ββββββββββ ββββββββββββ
|
|
57
|
+
β β β β β β
|
|
58
|
+
β Start ββββββΊβ Choice ββYesβΊβ Do thing β
|
|
59
|
+
β β β β β β
|
|
60
|
+
βββββββββ ββββββ¬ββββ ββββββββββββ
|
|
61
|
+
β
|
|
62
|
+
β
|
|
63
|
+
β
|
|
64
|
+
No
|
|
65
|
+
β
|
|
66
|
+
β ββββββββββββ
|
|
67
|
+
β β β
|
|
68
|
+
ββββββββββΊβ Skip β
|
|
69
|
+
β β
|
|
70
|
+
ββββββββββββ
|
|
71
|
+
|
|
72
|
+
```mermaid
|
|
73
|
+
flowchart LR
|
|
74
|
+
A[Start] --> B{Choice}
|
|
75
|
+
B -->|Yes| C[Do thing]
|
|
76
|
+
B -->|No| D[Skip]
|
|
77
|
+
```
|
|
78
|
+
````
|
|
79
|
+
|
|
80
|
+
````
|
|
81
|
+
Mermaid (ASCII)
|
|
82
|
+
ββββββββ βββββββ βββββββ
|
|
83
|
+
β User β β Web β β API β
|
|
84
|
+
βββββ¬βββ ββββ¬βββ ββββ¬βββ
|
|
85
|
+
β β β
|
|
86
|
+
β Submit form β β
|
|
87
|
+
βββββββββββββββββββΆ β
|
|
88
|
+
β β β
|
|
89
|
+
β β POST /submit β
|
|
90
|
+
β βββββββββββββββββββΆ
|
|
91
|
+
β β β
|
|
92
|
+
β β 201 Created β
|
|
93
|
+
β βββββββββββββββββββ
|
|
94
|
+
β β β
|
|
95
|
+
β Show success β β
|
|
96
|
+
βββββββββββββββββββ β
|
|
97
|
+
β β β
|
|
98
|
+
βββββ΄βββ ββββ΄βββ ββββ΄βββ
|
|
99
|
+
β User β β Web β β API β
|
|
100
|
+
ββββββββ βββββββ βββββββ
|
|
101
|
+
|
|
102
|
+
```mermaid
|
|
103
|
+
sequenceDiagram
|
|
104
|
+
participant U as User
|
|
105
|
+
participant W as Web
|
|
106
|
+
participant API as API
|
|
107
|
+
U->>W: Submit form
|
|
108
|
+
W->>API: POST /submit
|
|
109
|
+
API-->>W: 201 Created
|
|
110
|
+
W-->>U: Show success
|
|
111
|
+
```
|
|
112
|
+
````
|
|
113
|
+
|
|
114
|
+
````
|
|
115
|
+
Mermaid (ASCII)
|
|
116
|
+
ββββββββββ βββββββ ββββββββββββ
|
|
117
|
+
β Client β β API β β Database β
|
|
118
|
+
ββββββ¬ββββ ββββ¬βββ βββββββ¬βββββ
|
|
119
|
+
β β β
|
|
120
|
+
β transfer β β
|
|
121
|
+
βββββββββββββββΆ β
|
|
122
|
+
β β β
|
|
123
|
+
β β txn (debit/credit/log) β
|
|
124
|
+
β βββββββββββββββββββββββββββββΆ
|
|
125
|
+
β β β
|
|
126
|
+
βalt [ok]ββββββββββββββββββββββββββββββββββββββββββ
|
|
127
|
+
β β β β β
|
|
128
|
+
β β β commit β β
|
|
129
|
+
β β βββββββββββββββββββββββββββββΆ β
|
|
130
|
+
β β β β β
|
|
131
|
+
β β 200 β β β
|
|
132
|
+
β βββββββββββββββ β β
|
|
133
|
+
β β β β β
|
|
134
|
+
β[fail]ββββββββββββββββββββββββββββββββββββββββββββ€
|
|
135
|
+
β β β β β
|
|
136
|
+
β β β rollback β β
|
|
137
|
+
β β βββββββββββββββββββββββββββββΆ β
|
|
138
|
+
β β β β β
|
|
139
|
+
β β 400 β β β
|
|
140
|
+
β βββββββββββββββ β β
|
|
141
|
+
β β β β β
|
|
142
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
143
|
+
β β β
|
|
144
|
+
ββββββ΄ββββ ββββ΄βββ βββββββ΄βββββ
|
|
145
|
+
β Client β β API β β Database β
|
|
146
|
+
ββββββββββ βββββββ ββββββββββββ
|
|
147
|
+
|
|
148
|
+
```mermaid
|
|
149
|
+
sequenceDiagram
|
|
150
|
+
participant Client
|
|
151
|
+
participant API
|
|
152
|
+
participant Database
|
|
153
|
+
Client->>API: transfer
|
|
154
|
+
API->>Database: txn (debit/credit/log)
|
|
155
|
+
alt ok
|
|
156
|
+
API->>Database: commit
|
|
157
|
+
API-->>Client: 200
|
|
158
|
+
else fail
|
|
159
|
+
API->>Database: rollback
|
|
160
|
+
API-->>Client: 400
|
|
161
|
+
end
|
|
162
|
+
```
|
|
163
|
+
````
|
|
164
|
+
|
|
165
|
+
````
|
|
166
|
+
Mermaid (ASCII)
|
|
167
|
+
βββββββ βββββββββ ββββββββββββ
|
|
168
|
+
β App β β Cache β β Database β
|
|
169
|
+
ββββ¬βββ βββββ¬ββββ βββββββ¬βββββ
|
|
170
|
+
β β β
|
|
171
|
+
β Get data β β
|
|
172
|
+
βββββββββββββββββββββΆ β
|
|
173
|
+
β β β
|
|
174
|
+
β Cache miss β β
|
|
175
|
+
βββββββββββββββββββββ β
|
|
176
|
+
β β β
|
|
177
|
+
βopt [Cache miss]βββββββββββββββββββββββββ
|
|
178
|
+
β β β β β
|
|
179
|
+
β β Query β β β
|
|
180
|
+
β ββββββββββββββββββββββββββββββββββΆ β
|
|
181
|
+
β β β β β
|
|
182
|
+
β β Resultsβ β β
|
|
183
|
+
β ββββββββββββββββββββββββββββββββββ β
|
|
184
|
+
β β β β β
|
|
185
|
+
β β Store in cache β β β
|
|
186
|
+
β βββββββββββββββββββββΆ β β
|
|
187
|
+
β β β β β
|
|
188
|
+
ββββββββββββββββββββββββββββββββββββββββββ
|
|
189
|
+
β β β
|
|
190
|
+
ββββ΄βββ βββββ΄ββββ βββββββ΄βββββ
|
|
191
|
+
β App β β Cache β β Database β
|
|
192
|
+
βββββββ βββββββββ ββββββββββββ
|
|
193
|
+
|
|
194
|
+
```mermaid
|
|
195
|
+
sequenceDiagram
|
|
196
|
+
participant A as App
|
|
197
|
+
participant C as Cache
|
|
198
|
+
participant DB as Database
|
|
199
|
+
A->>C: Get data
|
|
200
|
+
C-->>A: Cache miss
|
|
201
|
+
opt Cache miss
|
|
202
|
+
A->>DB: Query
|
|
203
|
+
DB-->>A: Results
|
|
204
|
+
A->>C: Store in cache
|
|
205
|
+
end
|
|
206
|
+
```
|
|
207
|
+
````
|
|
208
|
+
|
|
209
|
+
````
|
|
210
|
+
Mermaid (ASCII)
|
|
211
|
+
βββββββββββββββββ
|
|
212
|
+
β Animal β
|
|
213
|
+
βββββββββββββββββ€
|
|
214
|
+
β +name: String β
|
|
215
|
+
βββββββββββββββββ€
|
|
216
|
+
β +eat: void β
|
|
217
|
+
βββββββββββββββββ
|
|
218
|
+
β³
|
|
219
|
+
ββββββββββββββββββββββββ
|
|
220
|
+
β β
|
|
221
|
+
ββββββββββββββββββ βββββββββββββββββββ
|
|
222
|
+
β Dog β β Cat β
|
|
223
|
+
ββββββββββββββββββ€ βββββββββββββββββββ€
|
|
224
|
+
β +breed: String β β +isIndoor: bool β
|
|
225
|
+
ββββββββββββββββββ€ βββββββββββββββββββ€
|
|
226
|
+
β +bark: void β β +meow: void β
|
|
227
|
+
ββββββββββββββββββ βββββββββββββββββββ
|
|
228
|
+
|
|
229
|
+
```mermaid
|
|
230
|
+
classDiagram
|
|
231
|
+
class Animal {
|
|
232
|
+
+String name
|
|
233
|
+
+eat() void
|
|
234
|
+
}
|
|
235
|
+
class Dog {
|
|
236
|
+
+String breed
|
|
237
|
+
+bark() void
|
|
238
|
+
}
|
|
239
|
+
class Cat {
|
|
240
|
+
+bool isIndoor
|
|
241
|
+
+meow() void
|
|
242
|
+
}
|
|
243
|
+
Animal <|-- Dog
|
|
244
|
+
Animal <|-- Cat
|
|
245
|
+
```
|
|
246
|
+
````
|
|
247
|
+
|
|
248
|
+
## Credits
|
|
249
|
+
This extension depends on and is made possible by these projects:
|
|
250
|
+
- [beautiful-mermaid](https://github.com/lukilabs/beautiful-mermaid)
|
|
251
|
+
- [Mermaid](https://github.com/mermaid-js/mermaid)
|
|
252
|
+
- [Pi](https://pi.dev/)
|
|
253
|
+
|
|
254
|
+
Thank you to the maintainers and contributors of these projects.
|
|
255
|
+
|
|
256
|
+
## License
|
|
257
|
+
MIT Β© 2026 Gurpartap Singh (https://x.com/Gurpartap)
|
package/SKILL.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mermaid
|
|
3
|
+
description: Renders Mermaid diagrams as ASCII directly in the terminal TUI. Allows the agent to visualize flows, architectures, and diagrams without leaving the CLI.
|
|
4
|
+
trigger: auto
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Mermaid Diagram Renderer
|
|
8
|
+
|
|
9
|
+
You have the power to visualize complex logic and architecture using Mermaid diagrams.
|
|
10
|
+
|
|
11
|
+
## π Capabilities
|
|
12
|
+
|
|
13
|
+
- **ASCII Rendering**: Renders standard Mermaid syntax (flowcharts, sequence diagrams, etc.) as high-quality ASCII art in the terminal.
|
|
14
|
+
- **Visual Synthesis**: Use this to show the user what you are planning or how the system is structured.
|
|
15
|
+
|
|
16
|
+
## π οΈ Usage
|
|
17
|
+
|
|
18
|
+
Simply include a Mermaid code block in your response:
|
|
19
|
+
|
|
20
|
+
```mermaid
|
|
21
|
+
graph TD
|
|
22
|
+
A[Start] --> B{Process}
|
|
23
|
+
B -- Yes --> C[Success]
|
|
24
|
+
B -- No --> D[Error]
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
The extension will automatically detect these blocks and render them as ASCII for the user.
|
|
28
|
+
|
|
29
|
+
## π Best Practices
|
|
30
|
+
- **Keep it Simple**: ASCII has limited resolution; keep diagrams focused.
|
|
31
|
+
- **Combined with Docs**: Always use this skill when generating architecture documentation via `/skill docs`.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAmD,MAAM,4BAA4B,CAAC;AAuZhH,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,QA4LxC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
import { getMarkdownTheme, keyHint } from "@wayofmono/wo-coding-agent";
|
|
2
|
+
import { Box, Spacer, Text, truncateToWidth, visibleWidth } from "@wayofmono/wo-tui";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
import { renderMermaidAscii } from "beautiful-mermaid";
|
|
5
|
+
const MESSAGE_TYPE = "pi-mermaid";
|
|
6
|
+
const MERMAID_BLOCK_RE = /```mermaid\s*([\s\S]*?)```/gi;
|
|
7
|
+
const ISSUE_LINE_RE = /^\[mermaid:(warning|error)\](?:\[hash:[^\]]+\])?\s*(.*)$/;
|
|
8
|
+
const COLLAPSED_LINES = 10;
|
|
9
|
+
const MAX_BLOCKS = 5;
|
|
10
|
+
const MAX_SOURCE_LINES = 400;
|
|
11
|
+
const MAX_SOURCE_CHARS = 20000;
|
|
12
|
+
const MAX_SEEN_ISSUES = 200;
|
|
13
|
+
const MAX_ASCII_CACHE = 200;
|
|
14
|
+
const ASCII_PRESETS = [
|
|
15
|
+
{ key: "default", paddingX: 5, boxBorderPadding: 1 },
|
|
16
|
+
{ key: "compact", paddingX: 3, boxBorderPadding: 1 },
|
|
17
|
+
{ key: "tight", paddingX: 2, boxBorderPadding: 1 },
|
|
18
|
+
{ key: "squeezed", paddingX: 1, boxBorderPadding: 0 },
|
|
19
|
+
];
|
|
20
|
+
const SUPPORTED_TYPES = new Map([
|
|
21
|
+
["graph", "flowchart"],
|
|
22
|
+
["flowchart", "flowchart"],
|
|
23
|
+
["sequenceDiagram", "sequence"],
|
|
24
|
+
["classDiagram", "class"],
|
|
25
|
+
["erDiagram", "er"],
|
|
26
|
+
["stateDiagram", "state"],
|
|
27
|
+
["stateDiagram-v2", "state"],
|
|
28
|
+
]);
|
|
29
|
+
const SUPPORTED_TYPE_LABEL = "graph/flowchart, sequenceDiagram, classDiagram, erDiagram, stateDiagram(-v2)";
|
|
30
|
+
let mermaidParser = null;
|
|
31
|
+
let mermaidParserError = null;
|
|
32
|
+
let mermaidParserWarned = false;
|
|
33
|
+
const seenIssueKeys = new Map();
|
|
34
|
+
const asciiCache = new Map();
|
|
35
|
+
const asciiLinesCache = new Map();
|
|
36
|
+
function isDomPurifyError(message) {
|
|
37
|
+
return message.includes("DOMPurify.addHook") || message.includes("DOMPurify");
|
|
38
|
+
}
|
|
39
|
+
async function getMermaidParser() {
|
|
40
|
+
if (mermaidParser || mermaidParserError)
|
|
41
|
+
return mermaidParser;
|
|
42
|
+
try {
|
|
43
|
+
const mod = await import("mermaid");
|
|
44
|
+
const api = mod.default ?? mod.mermaidAPI ?? mod;
|
|
45
|
+
if (!api || typeof api.parse !== "function") {
|
|
46
|
+
mermaidParserError = "Mermaid parse API not available";
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
if (typeof api.initialize === "function") {
|
|
50
|
+
try {
|
|
51
|
+
api.initialize({ startOnLoad: false });
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// ignore initialization errors
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
mermaidParser = async (text) => {
|
|
58
|
+
const result = api.parse(text);
|
|
59
|
+
if (result && typeof result.then === "function") {
|
|
60
|
+
await result;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
return mermaidParser;
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
mermaidParserError = error instanceof Error ? error.message : String(error);
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function normalizeMermaidSource(source) {
|
|
71
|
+
return source.replace(/\s+$/g, "");
|
|
72
|
+
}
|
|
73
|
+
function formatIssueLines(issues, hash) {
|
|
74
|
+
if (issues.length === 0)
|
|
75
|
+
return "";
|
|
76
|
+
return issues.map((issue) => `[mermaid:${issue.severity}][hash:${hash}] ${issue.message}`).join("\n");
|
|
77
|
+
}
|
|
78
|
+
function buildContextContent(block, hash, issues, includeSource) {
|
|
79
|
+
const issueLines = formatIssueLines(issues, hash);
|
|
80
|
+
if (!includeSource)
|
|
81
|
+
return issueLines;
|
|
82
|
+
const normalizedBlock = normalizeMermaidSource(block);
|
|
83
|
+
const sourceBlock = `%% mermaid-hash: ${hash}\n${normalizedBlock}`;
|
|
84
|
+
const contextBlock = `\`\`\`mermaid\n${sourceBlock}\n\`\`\``;
|
|
85
|
+
return issueLines ? `${issueLines}\n\n${contextBlock}` : contextBlock;
|
|
86
|
+
}
|
|
87
|
+
function extractText(content) {
|
|
88
|
+
if (typeof content === "string")
|
|
89
|
+
return content;
|
|
90
|
+
if (Array.isArray(content)) {
|
|
91
|
+
return content
|
|
92
|
+
.map((part) => (part && part.type === "text" ? part.text : ""))
|
|
93
|
+
.filter((part) => part.trim().length > 0)
|
|
94
|
+
.join("\n");
|
|
95
|
+
}
|
|
96
|
+
return "";
|
|
97
|
+
}
|
|
98
|
+
function extractMermaidBlocks(text, maxBlocks = Infinity) {
|
|
99
|
+
const blocks = [];
|
|
100
|
+
MERMAID_BLOCK_RE.lastIndex = 0;
|
|
101
|
+
let match = null;
|
|
102
|
+
while ((match = MERMAID_BLOCK_RE.exec(text)) !== null) {
|
|
103
|
+
const code = match[1]?.trim();
|
|
104
|
+
if (code)
|
|
105
|
+
blocks.push(code);
|
|
106
|
+
if (blocks.length >= maxBlocks)
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
return blocks;
|
|
110
|
+
}
|
|
111
|
+
function getMermaidTypeToken(block) {
|
|
112
|
+
const lines = block.split(/\r?\n/);
|
|
113
|
+
for (const line of lines) {
|
|
114
|
+
const trimmed = line.trim();
|
|
115
|
+
if (!trimmed)
|
|
116
|
+
continue;
|
|
117
|
+
if (trimmed.startsWith("%%"))
|
|
118
|
+
continue;
|
|
119
|
+
return trimmed.split(/\s+/)[0] ?? null;
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
function getSupportedMermaidType(block) {
|
|
124
|
+
const token = getMermaidTypeToken(block);
|
|
125
|
+
if (!token)
|
|
126
|
+
return { token, normalized: null };
|
|
127
|
+
return { token, normalized: SUPPORTED_TYPES.get(token) ?? null };
|
|
128
|
+
}
|
|
129
|
+
function hashMermaid(block) {
|
|
130
|
+
return createHash("sha256").update(block).digest("hex").slice(0, 8);
|
|
131
|
+
}
|
|
132
|
+
function getAsciiCacheKey(diagramHash, presetKey) {
|
|
133
|
+
return `${diagramHash}:${presetKey}`;
|
|
134
|
+
}
|
|
135
|
+
function getCachedVariant(key) {
|
|
136
|
+
const cached = asciiCache.get(key);
|
|
137
|
+
if (!cached)
|
|
138
|
+
return null;
|
|
139
|
+
asciiCache.delete(key);
|
|
140
|
+
asciiCache.set(key, cached);
|
|
141
|
+
return cached;
|
|
142
|
+
}
|
|
143
|
+
function setCachedVariant(key, variant) {
|
|
144
|
+
asciiCache.set(key, variant);
|
|
145
|
+
if (asciiCache.size > MAX_ASCII_CACHE) {
|
|
146
|
+
const oldest = asciiCache.keys().next().value;
|
|
147
|
+
if (oldest)
|
|
148
|
+
asciiCache.delete(oldest);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function countAsciiLines(ascii) {
|
|
152
|
+
if (!ascii)
|
|
153
|
+
return 0;
|
|
154
|
+
return ascii.split(/\r?\n/).length;
|
|
155
|
+
}
|
|
156
|
+
function maxAsciiLineWidth(ascii) {
|
|
157
|
+
if (!ascii)
|
|
158
|
+
return 0;
|
|
159
|
+
return ascii.split(/\r?\n/).reduce((max, line) => Math.max(max, visibleWidth(line)), 0);
|
|
160
|
+
}
|
|
161
|
+
function getCachedAsciiLines(ascii) {
|
|
162
|
+
if (!ascii)
|
|
163
|
+
return { lines: [], previewLines: [] };
|
|
164
|
+
const cached = asciiLinesCache.get(ascii);
|
|
165
|
+
if (cached) {
|
|
166
|
+
asciiLinesCache.delete(ascii);
|
|
167
|
+
asciiLinesCache.set(ascii, cached);
|
|
168
|
+
return cached;
|
|
169
|
+
}
|
|
170
|
+
const lines = ascii.split(/\r?\n/);
|
|
171
|
+
const previewLines = lines.length > COLLAPSED_LINES ? lines.slice(0, COLLAPSED_LINES) : lines;
|
|
172
|
+
const entry = { lines, previewLines };
|
|
173
|
+
asciiLinesCache.set(ascii, entry);
|
|
174
|
+
if (asciiLinesCache.size > MAX_ASCII_CACHE) {
|
|
175
|
+
const oldest = asciiLinesCache.keys().next().value;
|
|
176
|
+
if (oldest)
|
|
177
|
+
asciiLinesCache.delete(oldest);
|
|
178
|
+
}
|
|
179
|
+
return entry;
|
|
180
|
+
}
|
|
181
|
+
function renderAsciiVariant(block, diagramHash, preset) {
|
|
182
|
+
const cacheKey = getAsciiCacheKey(diagramHash, preset.key);
|
|
183
|
+
const cached = getCachedVariant(cacheKey);
|
|
184
|
+
if (cached)
|
|
185
|
+
return cached;
|
|
186
|
+
const ascii = renderMermaidAscii(block, {
|
|
187
|
+
paddingX: preset.paddingX,
|
|
188
|
+
boxBorderPadding: preset.boxBorderPadding,
|
|
189
|
+
colorMode: "none",
|
|
190
|
+
}).trimEnd();
|
|
191
|
+
const lineCount = countAsciiLines(ascii);
|
|
192
|
+
const maxLineWidth = maxAsciiLineWidth(ascii);
|
|
193
|
+
getCachedAsciiLines(ascii);
|
|
194
|
+
const variant = { presetKey: preset.key, ascii, lineCount, maxLineWidth };
|
|
195
|
+
setCachedVariant(cacheKey, variant);
|
|
196
|
+
return variant;
|
|
197
|
+
}
|
|
198
|
+
function selectAsciiVariant(width, variants, fallbackAscii, fallbackLineCount) {
|
|
199
|
+
const safeWidth = Math.max(1, width);
|
|
200
|
+
if (variants && variants.length > 0) {
|
|
201
|
+
for (const variant of variants) {
|
|
202
|
+
if (variant.maxLineWidth <= safeWidth) {
|
|
203
|
+
return { ...variant, clipped: false };
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
const tightest = variants[variants.length - 1];
|
|
207
|
+
return { ...tightest, clipped: tightest.maxLineWidth > safeWidth };
|
|
208
|
+
}
|
|
209
|
+
const maxLineWidth = maxAsciiLineWidth(fallbackAscii);
|
|
210
|
+
const lineCount = fallbackLineCount || countAsciiLines(fallbackAscii);
|
|
211
|
+
return { ascii: fallbackAscii, lineCount, maxLineWidth, clipped: maxLineWidth > safeWidth };
|
|
212
|
+
}
|
|
213
|
+
function splitIssuesFromContent(text) {
|
|
214
|
+
if (!text)
|
|
215
|
+
return { ascii: "", issues: [] };
|
|
216
|
+
const lines = text.split(/\r?\n/);
|
|
217
|
+
const issues = [];
|
|
218
|
+
let current = null;
|
|
219
|
+
let i = 0;
|
|
220
|
+
let inIssues = false;
|
|
221
|
+
while (i < lines.length) {
|
|
222
|
+
const line = lines[i];
|
|
223
|
+
const match = line.match(ISSUE_LINE_RE);
|
|
224
|
+
if (match) {
|
|
225
|
+
inIssues = true;
|
|
226
|
+
if (current)
|
|
227
|
+
issues.push(current);
|
|
228
|
+
current = { severity: match[1], message: match[2] };
|
|
229
|
+
i++;
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
if (inIssues) {
|
|
233
|
+
if (line.trim() === "") {
|
|
234
|
+
if (current)
|
|
235
|
+
issues.push(current);
|
|
236
|
+
i++;
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
if (current) {
|
|
240
|
+
current = { ...current, message: `${current.message}\n${line}` };
|
|
241
|
+
}
|
|
242
|
+
i++;
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
if (current && !issues.includes(current))
|
|
248
|
+
issues.push(current);
|
|
249
|
+
const ascii = lines.slice(i).join("\n");
|
|
250
|
+
if (issues.length > 0)
|
|
251
|
+
return { ascii, issues };
|
|
252
|
+
return { ascii: ascii || text, issues };
|
|
253
|
+
}
|
|
254
|
+
function getLastAssistantText(entries) {
|
|
255
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
256
|
+
const entry = entries[i];
|
|
257
|
+
if (entry.type !== "message")
|
|
258
|
+
continue;
|
|
259
|
+
if (entry.message.role !== "assistant")
|
|
260
|
+
continue;
|
|
261
|
+
const text = extractText(entry.message.content);
|
|
262
|
+
if (text.trim())
|
|
263
|
+
return text;
|
|
264
|
+
}
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
async function processBlock(block, blockIndex, blockLabel, parser, warnParserUnavailable) {
|
|
268
|
+
const issues = [];
|
|
269
|
+
const notifications = [];
|
|
270
|
+
const diagramHash = hashMermaid(block);
|
|
271
|
+
const addIssue = (severity, message) => {
|
|
272
|
+
notifications.push({ message, type: severity === "error" ? "error" : "warning" });
|
|
273
|
+
const key = `${diagramHash}:${severity}:${message}`;
|
|
274
|
+
if (seenIssueKeys.has(key))
|
|
275
|
+
return;
|
|
276
|
+
seenIssueKeys.set(key, true);
|
|
277
|
+
if (seenIssueKeys.size > MAX_SEEN_ISSUES) {
|
|
278
|
+
const oldest = seenIssueKeys.keys().next().value;
|
|
279
|
+
if (oldest)
|
|
280
|
+
seenIssueKeys.delete(oldest);
|
|
281
|
+
}
|
|
282
|
+
issues.push({ severity, message });
|
|
283
|
+
};
|
|
284
|
+
let parserFailed = false;
|
|
285
|
+
if (parser) {
|
|
286
|
+
try {
|
|
287
|
+
await parser(block);
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
291
|
+
if (isDomPurifyError(errorMessage)) {
|
|
292
|
+
warnParserUnavailable(errorMessage);
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
parserFailed = true;
|
|
296
|
+
const message = `Mermaid parse error${blockLabel}: ${errorMessage}`;
|
|
297
|
+
addIssue("error", message);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
let ascii = "";
|
|
302
|
+
let lineCount = 0;
|
|
303
|
+
let variants;
|
|
304
|
+
if (parserFailed) {
|
|
305
|
+
ascii = "[parse failed]";
|
|
306
|
+
lineCount = 1;
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
try {
|
|
310
|
+
variants = [];
|
|
311
|
+
for (const preset of ASCII_PRESETS) {
|
|
312
|
+
try {
|
|
313
|
+
variants.push(renderAsciiVariant(block, diagramHash, preset));
|
|
314
|
+
}
|
|
315
|
+
catch (error) {
|
|
316
|
+
if (preset.key === "squeezed")
|
|
317
|
+
continue;
|
|
318
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
319
|
+
const message = `Mermaid render failed${blockLabel} (${preset.key}): ${errorMessage}`;
|
|
320
|
+
notifications.push({ message, type: "warning" });
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
if (variants.length === 0) {
|
|
324
|
+
throw new Error("No ASCII variants rendered");
|
|
325
|
+
}
|
|
326
|
+
ascii = variants[0].ascii;
|
|
327
|
+
lineCount = variants[0].lineCount;
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
331
|
+
const message = `Mermaid render failed${blockLabel}: ${errorMessage}`;
|
|
332
|
+
addIssue("error", message);
|
|
333
|
+
ascii = "[render failed]";
|
|
334
|
+
lineCount = 1;
|
|
335
|
+
variants = undefined;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return {
|
|
339
|
+
diagramHash,
|
|
340
|
+
details: {
|
|
341
|
+
source: block,
|
|
342
|
+
index: blockIndex,
|
|
343
|
+
ascii,
|
|
344
|
+
lineCount,
|
|
345
|
+
variants: variants && variants.length > 0 ? variants : undefined,
|
|
346
|
+
issues: issues.length > 0 ? issues : undefined,
|
|
347
|
+
},
|
|
348
|
+
issues,
|
|
349
|
+
notifications,
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
export default function (pi) {
|
|
353
|
+
const renderMermaidMessage = (message, { expanded }, theme) => {
|
|
354
|
+
const details = message.details;
|
|
355
|
+
const contentText = extractText(message.content);
|
|
356
|
+
const fallback = splitIssuesFromContent(contentText);
|
|
357
|
+
const fallbackAscii = details?.ascii ?? fallback.ascii;
|
|
358
|
+
const fallbackLineCount = details?.lineCount ?? countAsciiLines(fallbackAscii);
|
|
359
|
+
const variants = details?.variants;
|
|
360
|
+
const asciiComponent = {
|
|
361
|
+
render: (width) => {
|
|
362
|
+
const contentWidth = Math.max(1, width);
|
|
363
|
+
const label = theme.fg("customMessageLabel", theme.bold("Mermaid (ASCII)"));
|
|
364
|
+
const selection = selectAsciiVariant(contentWidth, variants, fallbackAscii, fallbackLineCount);
|
|
365
|
+
const asciiLines = getCachedAsciiLines(selection.ascii);
|
|
366
|
+
const hasOverflow = selection.lineCount > COLLAPSED_LINES;
|
|
367
|
+
const isExpanded = expanded || !hasOverflow;
|
|
368
|
+
const visibleLines = isExpanded ? asciiLines.lines : asciiLines.previewLines;
|
|
369
|
+
const needsClip = selection.maxLineWidth > contentWidth;
|
|
370
|
+
const clipAsciiLine = needsClip
|
|
371
|
+
? (line) => truncateToWidth(line, contentWidth, "")
|
|
372
|
+
: (line) => line;
|
|
373
|
+
const lines = [];
|
|
374
|
+
lines.push(truncateToWidth(label, contentWidth));
|
|
375
|
+
for (const line of visibleLines) {
|
|
376
|
+
lines.push(clipAsciiLine(line));
|
|
377
|
+
}
|
|
378
|
+
if (hasOverflow && !isExpanded) {
|
|
379
|
+
const remainingLines = selection.lineCount - COLLAPSED_LINES;
|
|
380
|
+
const hintText = `... (${remainingLines} more lines, ${keyHint("app.tools.expand", "to expand")})`;
|
|
381
|
+
lines.push(truncateToWidth(theme.fg("muted", hintText), contentWidth));
|
|
382
|
+
}
|
|
383
|
+
if (selection.clipped) {
|
|
384
|
+
const hintText = "... (clipped to fit width; widen terminal to view full diagram)";
|
|
385
|
+
lines.push(truncateToWidth(theme.fg("muted", hintText), contentWidth));
|
|
386
|
+
}
|
|
387
|
+
return lines;
|
|
388
|
+
},
|
|
389
|
+
invalidate: () => { },
|
|
390
|
+
};
|
|
391
|
+
const box = new Box(1, 1, (t) => theme.bg("customMessageBg", t));
|
|
392
|
+
box.addChild(asciiComponent);
|
|
393
|
+
if (expanded && details?.source) {
|
|
394
|
+
box.addChild(new Spacer(1));
|
|
395
|
+
const markdownTheme = getMarkdownTheme();
|
|
396
|
+
const indent = markdownTheme.codeBlockIndent ?? " ";
|
|
397
|
+
const normalizedSource = normalizeMermaidSource(details.source);
|
|
398
|
+
const highlighted = markdownTheme.highlightCode?.(normalizedSource, "mermaid");
|
|
399
|
+
const codeLines = highlighted ?? normalizedSource.split("\n").map((line) => markdownTheme.codeBlock(line));
|
|
400
|
+
const renderedLines = [
|
|
401
|
+
markdownTheme.codeBlockBorder("```mermaid"),
|
|
402
|
+
...codeLines.map((line) => `${indent}${line}`),
|
|
403
|
+
markdownTheme.codeBlockBorder("```"),
|
|
404
|
+
].join("\n");
|
|
405
|
+
box.addChild(new Text(renderedLines, 0, 0));
|
|
406
|
+
}
|
|
407
|
+
return box;
|
|
408
|
+
};
|
|
409
|
+
pi.registerMessageRenderer(MESSAGE_TYPE, renderMermaidMessage);
|
|
410
|
+
const renderBlocks = async (blocks, ctx, options = {}) => {
|
|
411
|
+
const notify = (message, type) => {
|
|
412
|
+
if (ctx.hasUI)
|
|
413
|
+
ctx.ui.notify(message, type);
|
|
414
|
+
};
|
|
415
|
+
const warnParserUnavailable = (errorMessage) => {
|
|
416
|
+
if (!ctx.hasUI || mermaidParserWarned)
|
|
417
|
+
return;
|
|
418
|
+
const suffixSource = errorMessage ?? mermaidParserError;
|
|
419
|
+
const suffix = suffixSource ? ` (${suffixSource})` : "";
|
|
420
|
+
notify(`Mermaid parser validation isnβt usable right now${suffix}. Will try again next time; rendering anyway.`, "warning");
|
|
421
|
+
mermaidParserWarned = true;
|
|
422
|
+
};
|
|
423
|
+
let parser = await getMermaidParser();
|
|
424
|
+
if (!parser)
|
|
425
|
+
warnParserUnavailable();
|
|
426
|
+
if (blocks.length > MAX_BLOCKS) {
|
|
427
|
+
notify(`Found ${blocks.length} mermaid blocks, rendering first ${MAX_BLOCKS}.`, "warning");
|
|
428
|
+
}
|
|
429
|
+
for (const [index, block] of blocks.slice(0, MAX_BLOCKS).entries()) {
|
|
430
|
+
const blockIndex = index + 1;
|
|
431
|
+
const blockLabel = blocks.length > 1 ? ` (block ${blockIndex})` : "";
|
|
432
|
+
const sourceLines = block.split(/\r?\n/);
|
|
433
|
+
if (sourceLines.length > MAX_SOURCE_LINES || block.length > MAX_SOURCE_CHARS) {
|
|
434
|
+
notify(`Mermaid block ${blockIndex} too large (${sourceLines.length} lines, ${block.length} chars).`, "warning");
|
|
435
|
+
continue;
|
|
436
|
+
}
|
|
437
|
+
const { token, normalized } = getSupportedMermaidType(block);
|
|
438
|
+
if (!normalized) {
|
|
439
|
+
const typeLabel = token ?? "unknown";
|
|
440
|
+
notify(`pi-mermaid can't render type "${typeLabel}"${blockLabel}. Supported: ${SUPPORTED_TYPE_LABEL}.`, "info");
|
|
441
|
+
continue;
|
|
442
|
+
}
|
|
443
|
+
const { diagramHash, details, issues, notifications } = await processBlock(block, blockIndex, blockLabel, parser, warnParserUnavailable);
|
|
444
|
+
const includeSource = options.includeSourceInContext ?? true;
|
|
445
|
+
const contextContent = buildContextContent(block, diagramHash, issues, includeSource);
|
|
446
|
+
pi.sendMessage({
|
|
447
|
+
customType: MESSAGE_TYPE,
|
|
448
|
+
content: contextContent,
|
|
449
|
+
display: true,
|
|
450
|
+
details,
|
|
451
|
+
});
|
|
452
|
+
for (const notification of notifications) {
|
|
453
|
+
notify(notification.message, notification.type);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
};
|
|
457
|
+
pi.on("input", async (event, ctx) => {
|
|
458
|
+
if (event.source === "extension")
|
|
459
|
+
return { action: "continue" };
|
|
460
|
+
const text = typeof event.text === "string" ? event.text : "";
|
|
461
|
+
if (!text)
|
|
462
|
+
return { action: "continue" };
|
|
463
|
+
const blocks = extractMermaidBlocks(text, MAX_BLOCKS + 1);
|
|
464
|
+
if (blocks.length === 0)
|
|
465
|
+
return { action: "continue" };
|
|
466
|
+
await renderBlocks(blocks, ctx, { includeSourceInContext: blocks.length > 1 });
|
|
467
|
+
return { action: "continue" };
|
|
468
|
+
});
|
|
469
|
+
pi.on("agent_end", async (event, ctx) => {
|
|
470
|
+
let assistantText = "";
|
|
471
|
+
for (let i = event.messages.length - 1; i >= 0; i--) {
|
|
472
|
+
const msg = event.messages[i];
|
|
473
|
+
if (msg.role !== "assistant")
|
|
474
|
+
continue;
|
|
475
|
+
assistantText = extractText(msg.content);
|
|
476
|
+
if (assistantText.trim())
|
|
477
|
+
break;
|
|
478
|
+
}
|
|
479
|
+
if (!assistantText)
|
|
480
|
+
return;
|
|
481
|
+
const blocks = extractMermaidBlocks(assistantText, MAX_BLOCKS + 1);
|
|
482
|
+
if (blocks.length === 0)
|
|
483
|
+
return;
|
|
484
|
+
await renderBlocks(blocks, ctx, { includeSourceInContext: blocks.length > 1 });
|
|
485
|
+
});
|
|
486
|
+
pi.registerCommand("pi-mermaid", {
|
|
487
|
+
description: "Render mermaid in last assistant message as ASCII",
|
|
488
|
+
handler: async (_args, ctx) => {
|
|
489
|
+
const lastAssistant = getLastAssistantText(ctx.sessionManager.getBranch());
|
|
490
|
+
if (!lastAssistant) {
|
|
491
|
+
if (ctx.hasUI)
|
|
492
|
+
ctx.ui.notify("No assistant message found", "warning");
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
const blocks = extractMermaidBlocks(lastAssistant, MAX_BLOCKS + 1);
|
|
496
|
+
if (blocks.length === 0) {
|
|
497
|
+
if (ctx.hasUI)
|
|
498
|
+
ctx.ui.notify("No mermaid blocks found", "warning");
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
await renderBlocks(blocks, ctx, { includeSourceInContext: true });
|
|
502
|
+
},
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@wayofmono/wo-mermaid",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "π§ββοΈ WayOfMono extension that renders Mermaid diagrams as ASCII in the TUI",
|
|
5
|
+
"author": "WayOfMono",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "dist/index.js",
|
|
9
|
+
"types": "dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md",
|
|
19
|
+
"SKILL.md",
|
|
20
|
+
"package.json"
|
|
21
|
+
],
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"beautiful-mermaid": "^1.0.0",
|
|
24
|
+
"mermaid": "^11.0.0"
|
|
25
|
+
},
|
|
26
|
+
"peerDependencies": {
|
|
27
|
+
"@wayofmono/wo-coding-agent": "1.0.0",
|
|
28
|
+
"@wayofmono/wo-tui": "1.0.0"
|
|
29
|
+
},
|
|
30
|
+
"pi": {
|
|
31
|
+
"extensions": [
|
|
32
|
+
"./dist/index.js"
|
|
33
|
+
],
|
|
34
|
+
"skills": [
|
|
35
|
+
"SKILL.md"
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/node": "^25.8.0",
|
|
40
|
+
"typescript": "^6.0.3"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"build": "tsc"
|
|
44
|
+
}
|
|
45
|
+
}
|