@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 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
+ [![pi coding agent](https://img.shields.io/badge/pi-coding%20agent-6f6bff?logo=terminal&logoColor=white)](https://pi.dev/)
4
+ [![npm version](https://img.shields.io/npm/v/pi-mermaid.svg)](https://www.npmjs.com/package/pi-mermaid)
5
+ [![license](https://img.shields.io/npm/l/pi-mermaid.svg)](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`.
@@ -0,0 +1,3 @@
1
+ import type { ExtensionAPI } from "@wayofmono/wo-coding-agent";
2
+ export default function (pi: ExtensionAPI): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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
+ }