paseo-plugin-chat-view 0.0.0-stage → 0.1.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/LICENSE.compact-agent-activity +21 -0
- package/LICENSE.mermaid +21 -0
- package/README.md +428 -2
- package/README_zh.md +429 -0
- package/client/activity/Activity.test.ts +220 -0
- package/client/activity/Activity.tsx +784 -0
- package/client/activity/detail/detail.test.ts +102 -0
- package/client/activity/detail/dispatch.tsx +94 -0
- package/client/activity/detail/file.tsx +93 -0
- package/client/activity/detail/index.tsx +39 -0
- package/client/activity/detail/parts.tsx +221 -0
- package/client/activity/detail/search.tsx +59 -0
- package/client/activity/detail/terminal.tsx +53 -0
- package/client/activity/detail/texts.tsx +42 -0
- package/client/activity/disclosure.ts +49 -0
- package/client/activity/dom.test.ts +52 -0
- package/client/activity/dom.ts +138 -0
- package/client/activity/group-store.test.ts +126 -0
- package/client/activity/group-store.ts +265 -0
- package/client/activity/highlight.test.ts +116 -0
- package/client/activity/highlight.ts +418 -0
- package/client/activity/history.test.ts +602 -0
- package/client/activity/history.ts +239 -0
- package/client/activity/index.ts +74 -0
- package/client/activity/latest-marker.test.ts +41 -0
- package/client/activity/latest-marker.ts +70 -0
- package/client/activity/styles.ts +535 -0
- package/client/activity/tools/child-agent.tsx +308 -0
- package/client/activity/tools/exa.tsx +99 -0
- package/client/activity/tools/github.tsx +501 -0
- package/client/activity/tools/list.tsx +102 -0
- package/client/activity/tools/lists.test.ts +193 -0
- package/client/activity/tools/paseo/agent.tsx +384 -0
- package/client/activity/tools/paseo/browser.tsx +322 -0
- package/client/activity/tools/paseo/index.tsx +79 -0
- package/client/activity/tools/paseo/parts.tsx +133 -0
- package/client/activity/tools/paseo/provider.tsx +220 -0
- package/client/activity/tools/paseo/schedule.tsx +246 -0
- package/client/activity/tools/paseo/speak.tsx +20 -0
- package/client/activity/tools/paseo/terminal.tsx +214 -0
- package/client/activity/tools/paseo/workspace.tsx +162 -0
- package/client/activity/tools/shared.tsx +431 -0
- package/client/activity/transform.test.ts +28 -0
- package/client/activity/transform.ts +43 -0
- package/client/agent-pills.ts +56 -0
- package/client/dom.ts +75 -0
- package/client/enhance/controller.ts +111 -0
- package/client/enhance/dom.test.ts +28 -0
- package/client/enhance/dom.ts +101 -0
- package/client/enhance/index.ts +95 -0
- package/client/enhance/pill.tsx +19 -0
- package/client/enhance/state.ts +58 -0
- package/client/feature.ts +22 -0
- package/client/features.test.ts +149 -0
- package/client/features.ts +83 -0
- package/client/locale.ts +45 -0
- package/client/mermaid/diagram.tsx +438 -0
- package/client/mermaid/index.ts +27 -0
- package/client/mermaid/item.tsx +28 -0
- package/client/mermaid/markdown.tsx +217 -0
- package/client/mermaid/registration.ts +32 -0
- package/client/mermaid/toolbar.tsx +175 -0
- package/client/mermaid/viewer.tsx +314 -0
- package/client/readonly/dom.test.ts +66 -0
- package/client/readonly/dom.ts +32 -0
- package/client/readonly/index.ts +27 -0
- package/client/registration.test.ts +243 -0
- package/client/settings.tsx +438 -0
- package/client/sticky/StickyBar.tsx +144 -0
- package/client/sticky/dom.test.ts +230 -0
- package/client/sticky/dom.ts +517 -0
- package/client/sticky/index.ts +38 -0
- package/client/sticky/pill.tsx +70 -0
- package/client/timeline-pager.test.ts +121 -0
- package/client/timeline-pager.ts +123 -0
- package/index.client.tsx +44 -0
- package/index.server.ts +12 -0
- package/package.json +42 -4
- package/paseo-plugin.json +6 -0
- package/server/enhance/index.ts +63 -0
- package/server/enhance/manifest.ts +176 -0
- package/server/enhance/probe.test.ts +215 -0
- package/server/enhance/probe.ts +118 -0
- package/server/enhance/provider.ts +149 -0
- package/shared/activity/child-agent.test.ts +27 -0
- package/shared/activity/child-agent.ts +26 -0
- package/shared/activity/diff.test.ts +74 -0
- package/shared/activity/diff.ts +207 -0
- package/shared/activity/exa.test.ts +66 -0
- package/shared/activity/exa.ts +183 -0
- package/shared/activity/file-kind.test.ts +13 -0
- package/shared/activity/file-kind.ts +112 -0
- package/shared/activity/github.test.ts +56 -0
- package/shared/activity/github.ts +174 -0
- package/shared/activity/palette.test.ts +26 -0
- package/shared/activity/palette.ts +106 -0
- package/shared/activity/parse.test.ts +39 -0
- package/shared/activity/parse.ts +115 -0
- package/shared/activity/paseo-tools.test.ts +163 -0
- package/shared/activity/paseo-tools.ts +497 -0
- package/shared/activity/text.test.ts +85 -0
- package/shared/activity/text.ts +202 -0
- package/shared/activity/timeline.test.ts +26 -0
- package/shared/activity/timeline.ts +108 -0
- package/shared/activity/tool-presentation.test.ts +154 -0
- package/shared/activity/tool-presentation.ts +352 -0
- package/shared/enhance/contract.ts +105 -0
- package/shared/enhance/decide.ts +97 -0
- package/shared/enhance/enhance.test.ts +188 -0
- package/shared/enhance/failure.ts +40 -0
- package/shared/enhance/index.ts +8 -0
- package/shared/enhance/normalize.ts +16 -0
- package/shared/enhance/parse.ts +79 -0
- package/shared/enhance/policy.ts +48 -0
- package/shared/enhance/prompt.ts +134 -0
- package/shared/enhance/run.ts +84 -0
- package/shared/i18n.test.ts +81 -0
- package/shared/i18n.ts +300 -0
- package/shared/mermaid/flowchart.test.ts +169 -0
- package/shared/mermaid/flowchart.ts +271 -0
- package/shared/mermaid/layout.test.ts +305 -0
- package/shared/mermaid/layout.ts +496 -0
- package/shared/mermaid/parse.test.ts +110 -0
- package/shared/mermaid/parse.ts +193 -0
- package/shared/mermaid/segment.test.ts +55 -0
- package/shared/mermaid/segment.ts +95 -0
- package/shared/mermaid/sequence.test.ts +68 -0
- package/shared/mermaid/sequence.ts +130 -0
- package/shared/mermaid/transform.test.ts +52 -0
- package/shared/mermaid/transform.ts +45 -0
- package/shared/mermaid/zoom.test.ts +134 -0
- package/shared/mermaid/zoom.ts +114 -0
- package/shared/settings.ts +41 -0
- package/shared/sticky/history.test.ts +91 -0
- package/shared/sticky/history.ts +86 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 lyhu
|
|
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.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Matt Cowger
|
|
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/LICENSE.mermaid
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 dutchakdev
|
|
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
CHANGED
|
@@ -1,3 +1,429 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Paseo Plugin: chat-view
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[English](README.md) | [简体中文](README_zh.md)
|
|
4
|
+
|
|
5
|
+
> A Paseo interface enhancement plugin focused on reading and debugging efficiency in long conversations: **smart sticky questions for the current turn**, **compact aggregation of reasoning and tool calls**, and **interactive Mermaid diagram rendering**.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Table of Contents
|
|
10
|
+
|
|
11
|
+
- [Core Features](#core-features)
|
|
12
|
+
- [Platform Support & Compatibility Matrix](#platform-support--compatibility-matrix)
|
|
13
|
+
- [Host Configuration Prerequisites](#host-configuration-prerequisites)
|
|
14
|
+
- [Quick Start](#quick-start)
|
|
15
|
+
- [Installation & Loading](#installation--loading)
|
|
16
|
+
- [Maintenance Commands](#maintenance-commands)
|
|
17
|
+
- [Feature Details](#feature-details)
|
|
18
|
+
- [1. Sticky Questions](#1-sticky-questions)
|
|
19
|
+
- [2. Compact Activity](#2-compact-activity)
|
|
20
|
+
- [3. Interactive Mermaid Diagrams](#3-interactive-mermaid-diagrams)
|
|
21
|
+
- [4. Prompt Enhancement](#4-prompt-enhancement)
|
|
22
|
+
- [Plugin Settings Guide](#plugin-settings-guide)
|
|
23
|
+
- [Architecture & Technical Boundaries](#architecture--technical-boundaries)
|
|
24
|
+
- [Project Structure](#project-structure)
|
|
25
|
+
- [Local Development & Testing](#local-development--testing)
|
|
26
|
+
- [Credits & Licenses](#credits--licenses)
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Core Features
|
|
31
|
+
|
|
32
|
+
| Feature | Description | Highlights |
|
|
33
|
+
| :------------------------ | :-------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------ |
|
|
34
|
+
| 📌 **Sticky Questions** | Pins the current turn's user question to the top of the viewport while scrolling through a long conversation. | 100ms viewport debounce, native visual inheritance, default 3-line auto fold, one-click full-text copy. |
|
|
35
|
+
| ⚡ **Compact Activity** | Shows a single-line activity summary by default (compact-agent-activity Folded mode); a click expands thoughts and tool details inline. | Smooth reasoning text, click-to-expand command output, code diffs, first-frame syntax highlighting. |
|
|
36
|
+
| 📊 **Mermaid Diagrams** | Built-in Mermaid parser and renderer that turns diagram code blocks into high-quality visual charts. | 25%–400% free zoom, fit-to-width, seamless source/diagram toggle, full-screen preview. |
|
|
37
|
+
| ✨ **Prompt Enhancement** | Rewrites a vague composer request into an executable prompt complete with goal / scope / constraints / acceptance, and writes it back. | One-click enhance, project-environment aware, click again to undo to the original text. |
|
|
38
|
+
|
|
39
|
+
> [!NOTE]
|
|
40
|
+
> **Design philosophy**: zero backend intrusion and strictly built on the public Paseo SDK; user questions and ordinary assistant answers keep Paseo's native fork and copy functionality in full.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Platform Support & Compatibility Matrix
|
|
45
|
+
|
|
46
|
+
| Platform / Runtime | Sticky Questions | Compact Activity | Mermaid Diagrams | Experience details |
|
|
47
|
+
| :-------------------------------- | :--------------: | :--------------: | :--------------: | :----------------------------------------------------------------------------------------- |
|
|
48
|
+
| **Desktop (Electron / Desktop)** | ✅ Supported | ✅ Supported | ✅ Supported | DOM-level line spacing tightening, image size constraints (max 440 × 320). |
|
|
49
|
+
| **Web browser** | ✅ Supported | ✅ Supported | ✅ Supported | Full viewport observation and DOM interaction. |
|
|
50
|
+
| **Native mobile (iOS / Android)** | ⏸️ Not supported | ✅ Supported | ✅ Supported\* | Built on standard React Native; no DOM line-spacing tuning (on-device validation pending). |
|
|
51
|
+
|
|
52
|
+
> [!WARNING]
|
|
53
|
+
> **Plugin conflict notice**:
|
|
54
|
+
> Do not enable this plugin together with `compact-agent-activity`, `reasoning-display`, or the standalone `paseo-plugin-mermaid`, otherwise multiple timeline transformers may conflict with or overwrite each other.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Host Configuration Prerequisites
|
|
59
|
+
|
|
60
|
+
For compact activity to parse full tool-call arguments and results, change the Paseo host setting:
|
|
61
|
+
|
|
62
|
+
> [!IMPORTANT]
|
|
63
|
+
> In the Paseo host settings, set **Tool call detail** to **Detailed**.<br>
|
|
64
|
+
> _If it is set to `Overview`, the host merges tool entries before the plugin takes over, so compact activity details cannot be collected correctly._
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Quick Start
|
|
69
|
+
|
|
70
|
+
### Installation & Loading
|
|
71
|
+
|
|
72
|
+
This plugin is a local source package, installed directly through the Paseo CLI:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# 1. Install the plugin locally (current directory or an absolute plugin path)
|
|
76
|
+
paseo plugin install .
|
|
77
|
+
# Or: paseo plugin install /path/to/paseo-plugin-chat-view
|
|
78
|
+
|
|
79
|
+
# 2. Check install and runtime status
|
|
80
|
+
paseo plugin ls chat-view
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Once installed, open or refresh any agent conversation window for it to take effect.
|
|
84
|
+
|
|
85
|
+
### Maintenance Commands
|
|
86
|
+
|
|
87
|
+
- **Hot-reload the plugin** (takes effect immediately after source changes; **never restart the host daemon on port 6767**):
|
|
88
|
+
```bash
|
|
89
|
+
paseo plugin reload chat-view
|
|
90
|
+
```
|
|
91
|
+
- **List plugins**:
|
|
92
|
+
```bash
|
|
93
|
+
paseo plugin ls
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Feature Details
|
|
99
|
+
|
|
100
|
+
### 1. Sticky Questions
|
|
101
|
+
|
|
102
|
+
While reading a long assistant response, you can see the question for the current context at any time without scrolling back up.
|
|
103
|
+
|
|
104
|
+
```text
|
|
105
|
+
+--------------------------------------------------------------+
|
|
106
|
+
| [User question excerpt (up to 3 lines)...] [More... / 📋] | <- Sticky bar (same width as the message body)
|
|
107
|
+
+--------------------------------------------------------------+
|
|
108
|
+
| (Assistant answer for this turn / tool execution keeps scrolling...) |
|
|
109
|
+
| ... |
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
- **Lifecycle and controls**:
|
|
113
|
+
- Settings provide a per-host master switch for sticky questions, enabled by default. Disabling it also removes the composer pill of the same name; re-enabling restores it. The pill can temporarily turn sticky questions off or back on for a single conversation, with the master switch taking precedence.
|
|
114
|
+
- Sticky behavior is driven by mounting the toggle component and is independent of assistant-response render cycles.
|
|
115
|
+
- **Trigger and switching rules**:
|
|
116
|
+
- Triggers when the turn's user question scrolls **completely out of the top of the viewport**.
|
|
117
|
+
- If **any pixel** of the question body remains in the viewport, the sticky bar hides immediately.
|
|
118
|
+
- Scrolling into the next turn switches to that turn's question; scrolling back up restores the previous one.
|
|
119
|
+
- A **~100ms absence confirmation** eliminates flicker during virtual-list repaints or boundary scrolling.
|
|
120
|
+
- The rule is the same at the very bottom of a conversation: the bar stays pinned only once the question has left the viewport.
|
|
121
|
+
- **Visual style and adaptation**:
|
|
122
|
+
- The sticky bar aligns exactly with the message body width and fully inherits the native user bubble's background color, corner radius, padding, and font, adapting seamlessly to light and dark themes.
|
|
123
|
+
- **Adaptive folding**: shows at most 3 lines by default and offers a "More…" action for the rest; once expanded it scrolls independently inside the area and can be collapsed with "Show less". Switching turns resets it to the collapsed state.
|
|
124
|
+
- **Lossless full-text copy**: a copy icon embedded at the bar's bottom-right copies the complete question text of that turn (including the hidden part); it highlights slightly on hover and switches to a check mark for about 1.8 seconds after copying.
|
|
125
|
+
|
|
126
|
+
### 2. Compact Activity
|
|
127
|
+
|
|
128
|
+
Activity rendering is migrated from the Folded / Detailed modes of [cnaron/compact-agent-activity](https://github.com/cnaron/compact-agent-activity), with source baseline `4866482961c4c43a2f5f102fd63eadff85e15ef2`. Folded (the default) shows a single-line summary from the start of an activity and does not switch to "duration" or second-level command grouping when it finishes; expanding shows the reasoning text and tool details directly. Detailed keeps the upstream per-item cards, status icons, output, diffs, and structured tool details. Old Codex settings are migrated to Folded on read, while the color theme and feature toggle are preserved. User questions and ordinary assistant answers keep native Markdown, copy, and fork behavior.
|
|
129
|
+
|
|
130
|
+
The migration keeps the upstream summary, fonts, colors, detail tree, and whole-row click interaction, adapted for stability against the public SDK and virtual lists: history is isolated per connection and per agent, streaming activity rows keep their identity, expand selection survives a row remount, and syntax highlighting is produced on the first frame; on subscription resume, cached state is kept until a history epoch change is confirmed. When the first history read has not completed or cannot be matched, a collapsed single-item summary is shown instead of flashing the whole detail block. DOM handling lives only in each feature domain's own `dom.ts`; spacing and image sizing use declarative CSS rather than walking and adjusting activity node margins after mount.
|
|
131
|
+
|
|
132
|
+
Dense chains of thought and tool calls during agent execution are condensed from a waterfall into a highly compact information capsule:
|
|
133
|
+
|
|
134
|
+
```text
|
|
135
|
+
Thought · Ran 17 commands · Edited 1 file [▼ click to expand details]
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
- **Aggregated summary and detail expansion**:
|
|
139
|
+
- Consecutive reasoning and tool operations collapse into a single summary line;
|
|
140
|
+
- One click expands the full panel in place: structured reasoning, commands and output terminal, syntax highlighting, file diffs, error stacks, and sub-agent dispatch details.
|
|
141
|
+
- **Natural message boundary isolation**:
|
|
142
|
+
- As soon as an assistant text answer, a user question, or any other visible node appears, the current activity group is sealed; details never aggregate across messages out of place.
|
|
143
|
+
- **High performance and isolation**:
|
|
144
|
+
- Isolated by both Paseo session connection and agent instance;
|
|
145
|
+
- History is loaded forward on demand through the public timeline API; if the connection is not ready or a fetch is in flight, it degrades to per-item details automatically;
|
|
146
|
+
- Streaming activity **history reads** use a **100ms aggregation window** to merge high-frequency requests; rendering is not delayed—instead, row identity keeps rows stable while streaming grows and folded content stays out of the render path, avoiding extra reflow. Very long output (over 12,000 characters) degrades to plain text to avoid re-tokenizing everything on every frame.
|
|
147
|
+
- When reasoning text keeps growing, the current folded group is preserved; when the virtual list recycles activity rows, loaded groups are kept and the subscription is paused, then reused directly on remount, reducing scroll jitter from row-height changes.
|
|
148
|
+
- Groups are preserved while the subscription resumes; identical history content does not rebuild groups or notify rendering. Forward pagination starts only after the first history read completes, avoiding duplicate requests.
|
|
149
|
+
- **Desktop and Web micro-adjustments**:
|
|
150
|
+
- Tightens conversation message and paragraph spacing (assistant message vertical padding reduced to 4px, paragraph spacing tuned to a professional 8px with trailing double whitespace removed automatically; lists, code blocks, and quotes packed in a golden-ratio rhythm);
|
|
151
|
+
- Compresses the outer spacing of folded activity rows and the gap to questions, improving the information density and readability of consecutive reasoning and tool output;
|
|
152
|
+
- Constrains inline images to a maximum of 440 × 320 to keep streaming layouts tidy (full-screen image viewing on click is unaffected).
|
|
153
|
+
|
|
154
|
+
### 3. Interactive Mermaid Diagrams
|
|
155
|
+
|
|
156
|
+
Fully adopts the rendering implementation of upstream [paseo-plugin-mermaid](https://github.com/dutchakdev/paseo-plugin-mermaid) 0.2.0, natively empowering agents to output visual diagrams.
|
|
157
|
+
|
|
158
|
+
- **Dynamic interaction controls**:
|
|
159
|
+
- Automatically intercepts and converts ````mermaid` code blocks in assistant answers;
|
|
160
|
+
- Presents diagrams progressively while streaming;
|
|
161
|
+
- Built-in toolbar: **25%–400% free zoom**, **fit to width**, **full-screen preview**, and **one-click diagram / source switching**.
|
|
162
|
+
- **Supported syntax**:
|
|
163
|
+
- **Fully supported**: `flowchart` / `graph` (all of `TD`, `TB`, `BT`, `LR`, `RL`, including **top-level subgraph cluster boxes**) and `sequenceDiagram` (common node shapes, connector arrows, text labels, participants, actors, inline notes, etc.).
|
|
164
|
+
- **Not yet supported**: nested subgraphs (folded into the enclosing cluster box), `style` / `classDef` custom styles, and other uncommon diagram types.
|
|
165
|
+
- **Graceful degradation**: on a parse error or unsupported syntax, it falls back to showing the original source with a helpful error hint.
|
|
166
|
+
- **Takeover behavior**:
|
|
167
|
+
- The plugin only takes over **assistant answers that contain a Mermaid code block**;
|
|
168
|
+
- Such a message is rendered with the upstream lightweight Markdown engine (headings, paragraphs, lists, **tables with alignment and inline emphasis in cells**, code blocks, quotes, etc.) and **no longer offers Paseo's native fork and copy buttons** (plain-text answers are completely unaffected).
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
### 4. Prompt Enhancement
|
|
173
|
+
|
|
174
|
+
Automatically rewrites a vague composer request (say, "add caching") into an executable prompt covering **goal, scope, constraints, and acceptance**, enriched with the real tech stack and verification commands of the current project.
|
|
175
|
+
|
|
176
|
+
- **Two entry points**:
|
|
177
|
+
- **composer track pill** (all platforms): the "Enhance" button on the plugin track above the input box, next to "Sticky questions";
|
|
178
|
+
- **`/enhance <original prompt>`** (all platforms): since the host does not expose a draft read/write API, native clients and the command line use this entry point.
|
|
179
|
+
- **Click again to undo**: after writing back, the button becomes an undo icon; clicking it restores the pre-enhancement text. Enhanced results are tagged with `origin` and are never enhanced twice.
|
|
180
|
+
- **Environment awareness**: the server read-only collects project manifest files (`package.json` / `Cargo.toml` / `go.mod`, etc.), script commands, dependency frameworks, tsconfig strict, changed Git files, and docs such as `README` / `AGENTS` / `CLAUDE`, and injects them into the prompt as context. **Acceptance criteria may only reference commands that actually exist in the repository**; when nothing can be detected, it falls back to manually checkable observations.
|
|
181
|
+
- **Judge first**: if the original text is already a clear, executable instruction it is returned as is (`applied=false`), with no paraphrasing for its own sake. The same applies when the original already exceeds 200 characters—an enhancement could never be shorter than what the user wrote.
|
|
182
|
+
- **200-character limit**: the rewritten body is hard-capped at 200 characters, one line per element, each stating only the conclusion. The cap is independent of the original length, so short requests are not compressed into fragments.
|
|
183
|
+
- **Visible failures**: model timeouts, endpoint errors, and missing keys all surface the reason through a host toast and keep the original text; nothing fails silently.
|
|
184
|
+
|
|
185
|
+
> [!NOTE]
|
|
186
|
+
> Prompt enhancement uses its own model endpoint (configured in settings) and does not go through the Paseo host account, so it produces no host conversation record and **sends only the text plus the environment profile summary above—never source file contents**.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Plugin Settings Guide
|
|
191
|
+
|
|
192
|
+
Open preferences from the Paseo client menu to configure the plugin:
|
|
193
|
+
|
|
194
|
+
**Path**: `Settings` → `Plugins` → `chat-view` → `Feature Settings`
|
|
195
|
+
|
|
196
|
+
| Setting | Options | Description |
|
|
197
|
+
| :-------------------------------------------- | :---------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
198
|
+
| **Mermaid Diagrams** | Enabled (default) / Disabled | Controls plugin rendering; disabling restores Paseo's native message and diagram display. |
|
|
199
|
+
| **Compact Activity (compact-agent-activity)** | Enabled (default) / Disabled | Controls reasoning and tool-call enhancement; disabling restores the native timeline. |
|
|
200
|
+
| **Sticky Questions** | Enabled (default) / Disabled | Controls sticky questions for all conversations; disabling removes them immediately. Desktop and Web only. |
|
|
201
|
+
| **Lock Sent Messages** | Enabled (default) / Disabled | Hides "Revert to this message" after sending so content cannot be rewritten; desktop and Web only. |
|
|
202
|
+
| **Prompt Enhancement** | Enabled (default off) / Disabled | Controls the enhance button next to the input box and the `/enhance` command; a model endpoint must be configured first. |
|
|
203
|
+
| **API URL / API Key / Model** | Text | Any OpenAI Chat Completions compatible endpoint; the key is stored in host settings (0600). |
|
|
204
|
+
| **Test Connection** | Button | Sends one minimal request with the current configuration to verify URL, key, and model; shows latency and the actual endpoint. |
|
|
205
|
+
| **Display Mode** | `Folded` (default) / `Detailed` | Chooses the upstream aggregated summary or per-item details; old Codex settings migrate to Folded. |
|
|
206
|
+
| **Color Theme** | `Vivid` / `Soft` / `High contrast` | Fits different terminal aesthetics and high-contrast accessibility needs. |
|
|
207
|
+
| **UI Language** | `简体中文` (default) / `English` / `Auto` | Language of the plugin's own text: settings page, sticky bar, pills and buttons, and the messages the enhancement flow reports. It is not the language the model answers in — that follows your request. `Auto` follows the browser language and falls back to Chinese on native. |
|
|
208
|
+
|
|
209
|
+
_Note: settings are persisted per host. Existing display mode and color theme configuration is preserved. The settings page and open conversations update immediately; timeline switches in other clients sync within about 2 seconds, with no need to restart the daemon. While compact activity is disabled, its display mode and color theme options cannot be changed; the language choice is never disabled, and changing it relabels the settings page, the sticky bar and the composer pills at once._
|
|
210
|
+
|
|
211
|
+
_Text fields (API URL / key / model) are written about 300ms after you stop typing and immediately when you leave the field; the host treats a content hash as the revision and rejects writes based on a stale revision, so submitting keystroke by keystroke would race with the round trip and drop characters (see `DraftField` in `client/settings.tsx`)._
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## Architecture & Technical Boundaries
|
|
216
|
+
|
|
217
|
+
1. **Public SDK only**
|
|
218
|
+
- The production plugin depends entirely on `@getpaseo/client`, `@getpaseo/plugin`, and `@getpaseo/protocol` (per the 0.10.3 spec). It does not import host private source and does not intrude on the Paseo daemon.
|
|
219
|
+
2. **Isolated DOM enhancement boundary**
|
|
220
|
+
- Host 0.10.3 does not yet expose a native conversation overlay API. Sticky behavior injects DOM enhancements into the native scroll area through `client/sticky/dom.ts` and matches turns precisely via timeline message IDs.
|
|
221
|
+
- All DOM access is strictly confined to Web / desktop environments; native mobile runs purely on React Native with no DOM pollution.
|
|
222
|
+
- DOM knowledge is private per feature domain: sticky, compact activity, and prompt enhancement each own a `dom.ts` invisible to the others; only the minimal DOM type declarations they use are shared in `client/dom.ts`.
|
|
223
|
+
3. **Read-only session boundary**
|
|
224
|
+
- Archived read-only conversations do not mount the composer sticky controller, so the sticky bar is currently not shown there.
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Project Structure
|
|
229
|
+
|
|
230
|
+
### Dual-axis layout: the outer axis is set by the host, the inner axis by feature
|
|
231
|
+
|
|
232
|
+
The host compiler assigns every module in the plugin's import graph to a location; only code inside the three directories below (or the two root entry files) is compiled. Anything else fails with `Plugin modules belong in client/, server/, or shared/`:
|
|
233
|
+
|
|
234
|
+
| Directory | Side | What is allowed |
|
|
235
|
+
| --------- | ------ | ------------------------------------------------------------------------------------------- |
|
|
236
|
+
| `client/` | Client | React, React Native, hooks, styles, DOM work, callbacks |
|
|
237
|
+
| `server/` | Server | Node APIs, filesystem and process access, credentials, handlers |
|
|
238
|
+
| `shared/` | Both | Zod contracts and pure values; **must not** reference React components, hooks, or Node APIs |
|
|
239
|
+
|
|
240
|
+
The project therefore uses a **dual-axis** structure: the outer axis is decided by the host, the inner axis (feature domains) by this project. The four domains are `sticky` (sticky questions), `activity` (compact activity), `mermaid` (diagram rendering), and `enhance` (prompt enhancement); each has a directory of the same name under every runtime layer that needs it.
|
|
241
|
+
|
|
242
|
+
```text
|
|
243
|
+
chat-view/
|
|
244
|
+
├── paseo-plugin.json Host manifest (strictly validated)
|
|
245
|
+
├── index.client.tsx Fixed entry: registration wiring only
|
|
246
|
+
├── index.server.ts Fixed entry: registers settings and the provider
|
|
247
|
+
│
|
|
248
|
+
├── client/ ── Client runtime
|
|
249
|
+
│ ├── features.ts Subscribes to host settings and agent updates, distributes toggles and agents to domains
|
|
250
|
+
│ ├── settings.tsx Settings page: the four domains' toggles and the language choice
|
|
251
|
+
│ ├── locale.ts The live plugin language; its only writer is createFeatureController.apply
|
|
252
|
+
│ ├── feature.ts Interface between domains and the assembler
|
|
253
|
+
│ ├── agent-pills.ts Mounts and reclaims composer pills per agent
|
|
254
|
+
│ ├── timeline-pager.ts Forward pagination over the host timeline handle
|
|
255
|
+
│ ├── dom.ts Minimal DOM type declarations shared by the domains
|
|
256
|
+
│ │
|
|
257
|
+
│ ├── sticky/ ── Sticky questions
|
|
258
|
+
│ │ ├── index.ts createStickyDomain
|
|
259
|
+
│ │ ├── StickyBar.tsx useStickyMessage mounts the sticky bar
|
|
260
|
+
│ │ ├── pill.tsx createStickyPill and toggle state
|
|
261
|
+
│ │ └── dom.ts Scroll container detection and sticky bar injection
|
|
262
|
+
│ │
|
|
263
|
+
│ ├── readonly/ ── Lock sent messages
|
|
264
|
+
│ │ ├── index.ts createReadonlyDomain (no React state, no agent wiring)
|
|
265
|
+
│ │ └── dom.ts The stylesheet that hides the host's rewind control
|
|
266
|
+
│ │
|
|
267
|
+
│ ├── activity/ ── Compact activity
|
|
268
|
+
│ │ ├── index.ts createActivityDomain
|
|
269
|
+
│ │ ├── Activity.tsx Timeline row rendering (folded group / detail panel)
|
|
270
|
+
│ │ ├── styles.ts Palette and style derivation (no inbound edges; never depend on it in reverse)
|
|
271
|
+
│ │ ├── history.ts History forward pagination
|
|
272
|
+
│ │ ├── group-store.ts Folded group store
|
|
273
|
+
│ │ ├── disclosure.ts Expand / collapse state
|
|
274
|
+
│ │ ├── transform.ts Timeline transformer
|
|
275
|
+
│ │ ├── highlight.ts First-frame syntax highlighting
|
|
276
|
+
│ │ ├── latest-marker.ts Deferred notifications for the "latest item" marker
|
|
277
|
+
│ │ ├── dom.ts Scoped stylesheets and scroll positioning
|
|
278
|
+
│ │ ├── detail/ Collapsed-row bodies, one module per detail type
|
|
279
|
+
│ │ │ ├── index.tsx DetailBody dispatch
|
|
280
|
+
│ │ │ ├── parts.tsx Labels, path rows, highlighted code, diff blocks
|
|
281
|
+
│ │ │ ├── file.tsx read / write / edit
|
|
282
|
+
│ │ │ ├── search.tsx search / fetch
|
|
283
|
+
│ │ │ ├── terminal.tsx shell / worktree setup
|
|
284
|
+
│ │ │ ├── texts.tsx sub-agent / plain text / plan
|
|
285
|
+
│ │ │ └── dispatch.tsx Unknown-detail fallback
|
|
286
|
+
│ │ └── tools/ Tool detail panels (fourth layer)
|
|
287
|
+
│ │ ├── shared.tsx Display building blocks and value helpers reused across tool families
|
|
288
|
+
│ │ ├── list.tsx Shared list-row rendering
|
|
289
|
+
│ │ ├── exa.tsx Exa search tool family
|
|
290
|
+
│ │ ├── github.tsx GitHub tool family
|
|
291
|
+
│ │ ├── child-agent.tsx Sub-agent dispatch
|
|
292
|
+
│ │ └── paseo/ Paseo tool family, one module per tool group
|
|
293
|
+
│ │ (index · parts · agent · browser · provider · schedule · speak · terminal · workspace)
|
|
294
|
+
│ │
|
|
295
|
+
│ ├── mermaid/ ── Mermaid diagrams
|
|
296
|
+
│ │ ├── index.ts createMermaidDomain
|
|
297
|
+
│ │ ├── registration.ts Host renderer and transformer registration
|
|
298
|
+
│ │ ├── item.tsx Timeline item
|
|
299
|
+
│ │ ├── markdown.tsx Lightweight Markdown rendering
|
|
300
|
+
│ │ ├── diagram.tsx Diagram drawing
|
|
301
|
+
│ │ ├── viewer.tsx Full-screen preview
|
|
302
|
+
│ │ └── toolbar.tsx Zoom / fit width / source toggle
|
|
303
|
+
│ │
|
|
304
|
+
│ └── enhance/ ── Prompt enhancement
|
|
305
|
+
│ ├── index.ts createEnhanceDomain
|
|
306
|
+
│ ├── controller.ts Enhancement flow orchestration
|
|
307
|
+
│ ├── state.ts Enhancement state across conversations
|
|
308
|
+
│ ├── pill.tsx Composer track button
|
|
309
|
+
│ └── dom.ts Input detection and button injection
|
|
310
|
+
│
|
|
311
|
+
├── server/ ── Server runtime (Node needed by the enhance domain only)
|
|
312
|
+
│ └── enhance/
|
|
313
|
+
│ ├── index.ts registerEnhance
|
|
314
|
+
│ ├── provider.ts Model endpoint calls
|
|
315
|
+
│ ├── probe.ts Repository environment probing
|
|
316
|
+
│ └── manifest.ts Manifest file reading
|
|
317
|
+
│
|
|
318
|
+
└── shared/ ── Shared by both sides
|
|
319
|
+
├── settings.ts Host-level settings contract (shared by four domains; the host accepts only a single contract, so splitting it would turn one write into cross-module coordination—hence not split)
|
|
320
|
+
├── i18n.ts Message catalogue for both languages, `t()` interpolation, and the `localeSchema` the enhancement RPC sends
|
|
321
|
+
├── sticky/history.ts PromptHistory turn data
|
|
322
|
+
├── activity/
|
|
323
|
+
│ ├── palette.ts Theme tokens → the shared ActivityPalette
|
|
324
|
+
│ ├── tool-presentation.ts Timeline item → title, icon, category, summary
|
|
325
|
+
│ ├── text.ts Text budgets, lenient JSON formatting, value to text
|
|
326
|
+
│ ├── diff.ts Line diffs and +/- statistics
|
|
327
|
+
│ ├── file-kind.ts Path → language, file icon
|
|
328
|
+
│ ├── paseo-tools.ts Paseo tool name → category
|
|
329
|
+
│ ├── timeline.ts Renderer kind and schema
|
|
330
|
+
│ ├── parse.ts Markdown parsing of reasoning bodies
|
|
331
|
+
│ ├── child-agent.ts Sub-agent timeline contract
|
|
332
|
+
│ ├── github.ts GitHub tool metadata
|
|
333
|
+
│ └── exa.ts Exa search tool metadata
|
|
334
|
+
├── mermaid/ parse · segment · flowchart · sequence
|
|
335
|
+
│ layout · zoom · transform
|
|
336
|
+
└── enhance/ contract · decide · parse · policy
|
|
337
|
+
normalize · prompt · run
|
|
338
|
+
failure (typed provider failure, worded per locale)
|
|
339
|
+
index (barrel)
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### Naming conventions
|
|
343
|
+
|
|
344
|
+
- Directory and module file names are always `kebab-case`; a domain's main component file uses `PascalCase` (`Activity.tsx`, `StickyBar.tsx`).
|
|
345
|
+
- Each domain's exit point is `index.ts`, exposing only that domain's public surface.
|
|
346
|
+
- Files with the same name in different feature domains are disambiguated by directory (each domain has its own `dom.ts` / `index.ts` / `parse.ts`); this is a deliberate consistent shape, not a conflict.
|
|
347
|
+
- When the parsing and rendering layers share a name, the parsing layer is always `parse.ts` (`shared/*/parse.ts`) while the rendering layer keeps the domain name (`client/mermaid/markdown.tsx`).
|
|
348
|
+
- Tests live next to the implementation as pairs named `<module-under-test>.test.ts`; test files are always `.ts`, consistent with `exclude` in `tsconfig.json`.
|
|
349
|
+
|
|
350
|
+
### Change discipline
|
|
351
|
+
|
|
352
|
+
- **New features**: create the matching feature directory under `client/` `server/` `shared/`, export the implementation from that domain's `index.ts`, then add `create*Domain` to the domain list in `client/features.ts`. The assembler needs to know nothing about a domain's internals; a domain with a composer pill additionally implements `registerAgent` / `unregisterAgent` on `FeatureDomain`, with the assembler forwarding agent adds and removes.
|
|
353
|
+
- **DOM-related changes** may only go in the matching domain's `dom.ts`; when adding a DOM capability, extend the type declarations in `client/dom.ts` rather than scattering selectors elsewhere.
|
|
354
|
+
- **Do not** put code outside `client/` `server/` `shared/` and the two root entry files—the host compiler rejects it. Before adding a top-level directory, confirm it will not enter the import graph.
|
|
355
|
+
- `client/activity/styles.ts` must keep no inbound edges (depending on nothing else in the domain except types), otherwise the `Activity ↔ tools/*` cycle comes back.
|
|
356
|
+
- **User-facing text** lives in the catalogue in `shared/i18n.ts` (one entry per language) and is read through `t(locale, key)` in React or `tr(key)` outside it; `client/locale.ts` holds the running language and only `apply()` in `client/features.ts` writes it. `shared/i18n.test.ts` fails on a key no source file uses, so drop the entries you stop using.
|
|
357
|
+
- **The model's own text stays out of the catalogue**: the enhancement system prompt and the policy table are deliberately fixed Chinese, and the activity domain's field labels are deliberately English.
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
## Local Development & Testing
|
|
362
|
+
|
|
363
|
+
> For the in-depth development guide and architectural constraints, see [AGENTS.md](./AGENTS.md).
|
|
364
|
+
> The original requirement archive (`PRD.md`) is no longer in the working tree; retrieve it from git history when needed: `git show fb6d53f:PRD.md`.
|
|
365
|
+
|
|
366
|
+
### Setup and static checks
|
|
367
|
+
|
|
368
|
+
```bash
|
|
369
|
+
# Install dependencies
|
|
370
|
+
npm ci
|
|
371
|
+
|
|
372
|
+
# TypeScript type check
|
|
373
|
+
npm run typecheck
|
|
374
|
+
|
|
375
|
+
# Lint (oxlint)
|
|
376
|
+
npm run lint
|
|
377
|
+
|
|
378
|
+
# Format check (oxfmt)
|
|
379
|
+
npm run format:check
|
|
380
|
+
|
|
381
|
+
# Auto format
|
|
382
|
+
npm run format
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
### Running unit tests
|
|
386
|
+
|
|
387
|
+
Following the minimal-necessary principle, run only the targeted suites affected by your change:
|
|
388
|
+
|
|
389
|
+
```bash
|
|
390
|
+
# 1. Verify sticky questions and history turn logic
|
|
391
|
+
npm test -- shared/sticky/history.test.ts --run --bail=1
|
|
392
|
+
|
|
393
|
+
# 2. Verify the compact activity transformer, state store, and registration flow
|
|
394
|
+
npm test -- client/registration.test.ts client/activity --run --bail=1
|
|
395
|
+
|
|
396
|
+
# 3. Verify Mermaid syntax parsing and diagram transforms
|
|
397
|
+
npm test -- shared/mermaid --run --bail=1
|
|
398
|
+
|
|
399
|
+
# 4. Verify feature toggles and scroll flicker regressions
|
|
400
|
+
npm test -- client/features.test.ts client/sticky/dom.test.ts client/activity/dom.test.ts client/enhance/dom.test.ts --run --bail=1
|
|
401
|
+
|
|
402
|
+
# 5. Verify prompt enhancement core logic and environment probing
|
|
403
|
+
npm test -- shared/enhance server/enhance --run --bail=1
|
|
404
|
+
|
|
405
|
+
# 6. Verify the message catalogue and the language switch
|
|
406
|
+
npm test -- shared/i18n.test.ts --run --bail=1
|
|
407
|
+
|
|
408
|
+
# 7. Verify read-only sent messages and timeline paging
|
|
409
|
+
npm test -- client/readonly client/timeline-pager.test.ts --run --bail=1
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
> [!TIP]
|
|
413
|
+
> `client/registration.test.ts` invokes the host's real Paseo compiler. The default source path is the sibling directory `../paseo`; if yours differs, override it with an environment variable:<br>
|
|
414
|
+
> `PASEO_SOURCE_DIR=/path/to/paseo npm test -- client/registration.test.ts --run --bail=1`
|
|
415
|
+
|
|
416
|
+
---
|
|
417
|
+
|
|
418
|
+
## Credits & Licenses
|
|
419
|
+
|
|
420
|
+
This project incorporates and builds on the core work of the following open-source projects:
|
|
421
|
+
|
|
422
|
+
- **[beautiful-chat](https://github.com/ABorakati/beautiful-chat)**
|
|
423
|
+
- Informed the scroll container detection and DOM-injection sticky architecture.
|
|
424
|
+
- **[compact-agent-activity](https://github.com/cnaron/compact-agent-activity)**
|
|
425
|
+
- The compact activity summary computation, color palette, and detail panel rendering are deeply based on this project.
|
|
426
|
+
- Copyright Matt Cowger, MIT licensed; see [LICENSE.compact-agent-activity](./LICENSE.compact-agent-activity) for the full notice.
|
|
427
|
+
- **[paseo-plugin-mermaid](https://github.com/dutchakdev/paseo-plugin-mermaid)**
|
|
428
|
+
- Adopts its 0.2.0 (commit `95cf07db794f6be3e121a41a7e774e3fdde3ccf5`) cross-platform diagram parsing and rendering modules.
|
|
429
|
+
- Copyright dutchakdev, MIT licensed; see [LICENSE.mermaid](./LICENSE.mermaid) for the full notice.
|