@ww-ai-lab/openclaw-office 2026.6.2-beta.4 → 2026.6.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +65 -67
- package/README.md +71 -73
- package/dist/assets/{ActivityHeatmap-CpbyUHuI.js → ActivityHeatmap-BlG6TEIG.js} +1 -1
- package/dist/assets/{CostPieChart-B5trzi6Y.js → CostPieChart-D4o59uFg.js} +1 -1
- package/dist/assets/{MermaidPreview-DVwL74Xq.js → MermaidPreview-Bo4bFeLM.js} +2 -2
- package/dist/assets/{NetworkGraph-z2P9KN4Z.js → NetworkGraph-DAxd70Ot.js} +1 -1
- package/dist/assets/{TokenLineChart-CtdYtM77.js → TokenLineChart-QvGjZ5XD.js} +1 -1
- package/dist/assets/{_baseUniq-Cfyl88t7.js → _baseUniq-DRat-WU9.js} +1 -1
- package/dist/assets/{architectureDiagram-Q4EWVU46-BH4JuRIL.js → architectureDiagram-Q4EWVU46-Dam1wHtP.js} +1 -1
- package/dist/assets/{blockDiagram-DXYQGD6D-hln9zfg2.js → blockDiagram-DXYQGD6D-87SmokPS.js} +1 -1
- package/dist/assets/{c4Diagram-AHTNJAMY-BTTMG0uV.js → c4Diagram-AHTNJAMY-SA74A_zy.js} +1 -1
- package/dist/assets/channel-C_oayA7l.js +1 -0
- package/dist/assets/{chunk-4BX2VUAB-D4m1C-km.js → chunk-4BX2VUAB-CYJz2DSi.js} +1 -1
- package/dist/assets/{chunk-4TB4RGXK-NUtEh5_d.js → chunk-4TB4RGXK-OHlm04OB.js} +1 -1
- package/dist/assets/{chunk-55IACEB6-CS1nCNQv.js → chunk-55IACEB6-DHgQriFa.js} +1 -1
- package/dist/assets/{chunk-EDXVE4YY-Cvv0gmo5.js → chunk-EDXVE4YY-4tou8hIT.js} +1 -1
- package/dist/assets/{chunk-FMBD7UC4-SY8kEFHe.js → chunk-FMBD7UC4-D1mp91VX.js} +1 -1
- package/dist/assets/{chunk-OYMX7WX6-DOihdHEB.js → chunk-OYMX7WX6-VjxJKMyL.js} +1 -1
- package/dist/assets/{chunk-QZHKN3VN-DJbMoSaM.js → chunk-QZHKN3VN-DZ_7FrEE.js} +1 -1
- package/dist/assets/{chunk-YZCP3GAM-BHFePYUW.js → chunk-YZCP3GAM-D8Y0i_ac.js} +1 -1
- package/dist/assets/classDiagram-6PBFFD2Q-CHmtlZlS.js +1 -0
- package/dist/assets/classDiagram-v2-HSJHXN6E-CHmtlZlS.js +1 -0
- package/dist/assets/clone-BH-2mHSm.js +1 -0
- package/dist/assets/{cose-bilkent-S5V4N54A-DTcL_GxP.js → cose-bilkent-S5V4N54A-CZb5xZ4J.js} +1 -1
- package/dist/assets/{dagre-KV5264BT-Cfi_YL3t.js → dagre-KV5264BT-llQbGrkV.js} +1 -1
- package/dist/assets/{diagram-5BDNPKRD-BV8q08QE.js → diagram-5BDNPKRD-CIF7LIcb.js} +1 -1
- package/dist/assets/{diagram-G4DWMVQ6-CDgJFsQl.js → diagram-G4DWMVQ6-BO3HzPNi.js} +1 -1
- package/dist/assets/{diagram-MMDJMWI5-Q3ZEfdCt.js → diagram-MMDJMWI5-B-DwUodZ.js} +1 -1
- package/dist/assets/{diagram-TYMM5635-C2z3B-fD.js → diagram-TYMM5635-B2f50Yex.js} +1 -1
- package/dist/assets/{erDiagram-SMLLAGMA-CjEKcyub.js → erDiagram-SMLLAGMA-fyrMYhbD.js} +1 -1
- package/dist/assets/{flowDiagram-DWJPFMVM-DvGsXBp5.js → flowDiagram-DWJPFMVM-DtBmosa7.js} +1 -1
- package/dist/assets/{ganttDiagram-T4ZO3ILL-3haulWDa.js → ganttDiagram-T4ZO3ILL-CKJV0Qhb.js} +1 -1
- package/dist/assets/{generateCategoricalChart-Iesv4F0v.js → generateCategoricalChart-CReUs1iy.js} +1 -1
- package/dist/assets/{gitGraphDiagram-UUTBAWPF-DI3XEPsp.js → gitGraphDiagram-UUTBAWPF-CTPtT2N-.js} +1 -1
- package/dist/assets/{graph-CR0H-iuK.js → graph-B6mNtAkv.js} +1 -1
- package/dist/assets/index-BM36Njjd.js +648 -0
- package/dist/assets/index-DZw6DpsO.css +1 -0
- package/dist/assets/{infoDiagram-42DDH7IO-BU4iJwo2.js → infoDiagram-42DDH7IO-Dw2RgF5V.js} +1 -1
- package/dist/assets/{ishikawaDiagram-UXIWVN3A-DPcK3o-A.js → ishikawaDiagram-UXIWVN3A-D4S7TTFo.js} +1 -1
- package/dist/assets/{journeyDiagram-VCZTEJTY-DsGoAyHn.js → journeyDiagram-VCZTEJTY-gOHXyvhy.js} +1 -1
- package/dist/assets/{kanban-definition-6JOO6SKY-E_nCTqRL.js → kanban-definition-6JOO6SKY-C_B1kzQ7.js} +1 -1
- package/dist/assets/{layout-BVLVzKLe.js → layout-CUV8e6Hx.js} +1 -1
- package/dist/assets/{mermaid.core-jP0z6xy9.js → mermaid.core-dRlZdQYC.js} +4 -4
- package/dist/assets/{min-DM3H04Br.js → min-BV0gHYGn.js} +1 -1
- package/dist/assets/{mindmap-definition-QFDTVHPH-l-AQ6ipE.js → mindmap-definition-QFDTVHPH-DmOYOkpz.js} +1 -1
- package/dist/assets/{pieDiagram-DEJITSTG-BNmdpIZx.js → pieDiagram-DEJITSTG-DTMN27yG.js} +1 -1
- package/dist/assets/{quadrantDiagram-34T5L4WZ-BbdqEFyh.js → quadrantDiagram-34T5L4WZ-C42bzUym.js} +1 -1
- package/dist/assets/{requirementDiagram-MS252O5E-Ct720Lua.js → requirementDiagram-MS252O5E-DY-KWhL-.js} +1 -1
- package/dist/assets/{sankeyDiagram-XADWPNL6-DpjKmq36.js → sankeyDiagram-XADWPNL6-DjoxCO1x.js} +1 -1
- package/dist/assets/{sequenceDiagram-FGHM5R23-BzvinwHi.js → sequenceDiagram-FGHM5R23-BShjIV0g.js} +1 -1
- package/dist/assets/{stateDiagram-FHFEXIEX-yxEfTB6b.js → stateDiagram-FHFEXIEX-BjVNYfME.js} +1 -1
- package/dist/assets/stateDiagram-v2-QKLJ7IA2-DfrM5x7e.js +1 -0
- package/dist/assets/{timeline-definition-GMOUNBTQ-DOgN4L59.js → timeline-definition-GMOUNBTQ-CjIleoen.js} +1 -1
- package/dist/assets/{vennDiagram-DHZGUBPP-BJ46DJt9.js → vennDiagram-DHZGUBPP-B9QHEahX.js} +1 -1
- package/dist/assets/{wardley-RL74JXVD-DJAOlp-t.js → wardley-RL74JXVD-tGzDRBX-.js} +1 -1
- package/dist/assets/{wardleyDiagram-NUSXRM2D-CBarkW4L.js → wardleyDiagram-NUSXRM2D-Drekvj5q.js} +1 -1
- package/dist/assets/{xychartDiagram-5P7HB3ND-eAxAYPxZ.js → xychartDiagram-5P7HB3ND-DvMnaSfN.js} +1 -1
- package/dist/index.html +2 -2
- package/package.json +1 -1
- package/dist/assets/channel-CHl85yQ2.js +0 -1
- package/dist/assets/classDiagram-6PBFFD2Q-BCZnw_KH.js +0 -1
- package/dist/assets/classDiagram-v2-HSJHXN6E-BCZnw_KH.js +0 -1
- package/dist/assets/clone-BOIkJ9Nz.js +0 -1
- package/dist/assets/index-BjylP9G5.js +0 -648
- package/dist/assets/index-CBGZeKdy.css +0 -1
- package/dist/assets/stateDiagram-v2-QKLJ7IA2-DDxJKi54.js +0 -1
package/README.en.md
CHANGED
|
@@ -8,9 +8,29 @@
|
|
|
8
8
|
|
|
9
9
|
**Core Metaphor:** Agent = Digital Employee | Office = Agent Runtime | Desk = Session | Meeting Pod = Collaboration Context
|
|
10
10
|
|
|
11
|
+
> **OpenClaw Office turns OpenClaw from a chatbot into a full Skills system.**
|
|
12
|
+
> Not just conversations — create, develop, debug, and deploy reusable skills so every Agent can master professional capabilities and collaborate on complex tasks.
|
|
13
|
+
|
|
11
14
|
---
|
|
12
15
|
|
|
13
|
-
##
|
|
16
|
+
## Feature Highlights
|
|
17
|
+
|
|
18
|
+
### ✨ Skill Workbench — Skills Development Platform
|
|
19
|
+
|
|
20
|
+
Skill Workbench is the core differentiator of OpenClaw Office — a full **AI-assisted development environment** that unifies skill creation, editing, flowchart generation, and A2UI input forms, making OpenClaw a truly programmable Skills system:
|
|
21
|
+
|
|
22
|
+
- **Nested three-page routing**: `/skill-workbench` (list) → `/skill-workbench/create` (wizard) → `/skill-workbench/:slug` (detail)
|
|
23
|
+
- **Chat-side-panel driven development**: create and modify Skills through a conversation; file changes are flushed to disk in real time
|
|
24
|
+
- **Automated FLOWCHART.md generation**: a built-in guard skill (`skill-workbench-mermaid-guard`) produces compliant, colored Mermaid flowcharts (single- or multi-chart mode) on demand
|
|
25
|
+
- **Pure-Markdown multi-chart preview**: the flowchart panel renders multiple Mermaid fenced blocks directly through the Markdown pipeline
|
|
26
|
+
- **A2UI visual input forms**: declarative form schema — ` ```a2ui ` fenced blocks inside chat messages are automatically rendered as interactive forms; a dedicated "A2UI Debug" tab on the detail page enables one-click generation, preview, and debugging
|
|
27
|
+
- **Zero-setup default skill install**: on first entry, the embedded server copies bundled default skills from the npm package into `~/.openclaw/workspace/skills/` — no manual install required
|
|
28
|
+
|
|
29
|
+
See the full guide in [SKILL-WORKBENCH.md](./SKILL-WORKBENCH.md).
|
|
30
|
+
|
|
31
|
+

|
|
32
|
+
|
|
33
|
+

|
|
14
34
|
|
|
15
35
|
### Virtual Office
|
|
16
36
|
|
|
@@ -27,25 +47,28 @@
|
|
|
27
47
|
- Dedicated Chat workspace accessible via top navigation (`/#/chat`), with the dock bar retained as a quick-entry surface
|
|
28
48
|
- Session management — create new sessions, switch history, route by Agent, support multi-Agent parallel conversations
|
|
29
49
|
- Real-time streaming — stream AI responses with abort/resend support
|
|
30
|
-
- Persistent chat history — server-side per-day sharded cache
|
|
31
|
-
- Tool call visualization — inline Agent tool call status
|
|
50
|
+
- Persistent chat history — server-side per-day sharded cache, stable across browsers, devices, and refreshes
|
|
51
|
+
- Tool call visualization — inline Agent tool call status, collapsible for detail viewing
|
|
32
52
|
- Slash commands — `/help`, `/new`, `/reset`, `/model`, `/think`, `/export` and more
|
|
33
53
|
- Attachments — support for images and arbitrary file attachments
|
|
34
54
|
- Utilities — search, Markdown export, focus mode, pinned-reference workflows
|
|
55
|
+
- Dynamic form interaction (A2UI) — ` ```a2ui ` fenced blocks in AI responses are automatically rendered as structured forms supporting text, select, file upload and more; submissions are sent back to the Agent as structured messages
|
|
56
|
+
|
|
57
|
+

|
|
35
58
|
|
|
36
59
|
### Console
|
|
37
60
|
|
|
38
61
|
Full system management interface with dedicated pages:
|
|
39
62
|
|
|
40
|
-
| Page
|
|
41
|
-
|
|
|
42
|
-
| **Dashboard**
|
|
43
|
-
| **Agents**
|
|
44
|
-
| **Channels**
|
|
45
|
-
| **Skills**
|
|
46
|
-
| **Skill Workbench** ✨ |
|
|
47
|
-
| **Cron**
|
|
48
|
-
| **Settings**
|
|
63
|
+
| Page | Features |
|
|
64
|
+
| --------------------- | -------------------------------------------------------------------------------------------------------------- |
|
|
65
|
+
| **Dashboard** | Overview stats, alert banners, Channel/Skill overview, quick navigation |
|
|
66
|
+
| **Agents** | Agent list/create/delete, detail tabs (Overview, Channels, Cron, Skills, Tools, Files) |
|
|
67
|
+
| **Channels** | Channel cards, configuration dialogs, stats, WhatsApp QR binding |
|
|
68
|
+
| **Skills** | Skill marketplace, install options, skill detail dialogs |
|
|
69
|
+
| **Skill Workbench** ✨ | Skills development platform (see detailed introduction above) |
|
|
70
|
+
| **Cron** | Scheduled task management and statistics |
|
|
71
|
+
| **Settings** | Provider management (add/edit/model editor), appearance, Gateway, developer, advanced, about, update |
|
|
49
72
|
|
|
50
73
|

|
|
51
74
|
|
|
@@ -61,21 +84,6 @@ Full system management interface with dedicated pages:
|
|
|
61
84
|
|
|
62
85
|
---
|
|
63
86
|
|
|
64
|
-
## New: Skill Workbench (Skills Development Platform)
|
|
65
|
-
|
|
66
|
-
Starting with `2026.5.20`, the console formally ships **Skill Workbench** — a full AI-assisted development environment for Skills:
|
|
67
|
-
|
|
68
|
-
- **Nested three-page routing**: `/skill-workbench` (list), `/skill-workbench/create` (wizard), `/skill-workbench/:slug` (detail)
|
|
69
|
-
- **Chat-side-panel driven development**: create and modify Skills through a conversation; file changes are flushed to disk in real time
|
|
70
|
-
- **Automated FLOWCHART.md generation**: a built-in guard skill (`skill-workbench-mermaid-guard`) produces compliant, colored Mermaid flowcharts (single- or multi-chart mode) on demand
|
|
71
|
-
- **Pure-Markdown multi-chart preview**: the flowchart panel renders multiple Mermaid fenced blocks directly through the Markdown pipeline
|
|
72
|
-
- **A2UI visual input forms** ✨: declarative form schema — `\`\`\`a2ui` fenced blocks inside chat messages are automatically rendered as interactive forms supporting text, select, file upload and more; a dedicated "A2UI Debug" tab on the detail page enables one-click generation, preview, and debugging of `ui.json` forms
|
|
73
|
-
- **Zero-setup default skill install**: on first entry, the embedded server copies bundled default skills from the npm package into `~/.openclaw/workspace/skills/` — no manual install required
|
|
74
|
-
|
|
75
|
-
See the full guide in [SKILL-WORKBENCH.md](./SKILL-WORKBENCH.md).
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
87
|
## Tech Stack
|
|
80
88
|
|
|
81
89
|
| Layer | Technology |
|
|
@@ -95,8 +103,7 @@ See the full guide in [SKILL-WORKBENCH.md](./SKILL-WORKBENCH.md).
|
|
|
95
103
|
## Prerequisites
|
|
96
104
|
|
|
97
105
|
- **Node.js 22+**
|
|
98
|
-
- **
|
|
99
|
-
- **[OpenClaw](https://github.com/openclaw/openclaw)** installed and configured
|
|
106
|
+
- **[OpenClaw](https://github.com/openclaw/openclaw)** installed and running
|
|
100
107
|
|
|
101
108
|
OpenClaw Office is a companion frontend that connects to a running OpenClaw Gateway. It does **not** start or manage the Gateway itself.
|
|
102
109
|
|
|
@@ -115,17 +122,17 @@ npm install -g @ww-ai-lab/openclaw-office
|
|
|
115
122
|
openclaw-office
|
|
116
123
|
```
|
|
117
124
|
|
|
118
|
-
### Gateway
|
|
125
|
+
### Gateway Authentication
|
|
119
126
|
|
|
120
|
-
|
|
127
|
+
After launching, the browser displays the OpenClaw Office **login screen**, where you need to enter your Gateway credentials to authenticate:
|
|
121
128
|
|
|
122
|
-
|
|
129
|
+
1. **Gateway URL** — the Gateway WebSocket address, defaults to `ws://localhost:18789` (pre-filled from the server-injected configuration)
|
|
130
|
+
2. **Access Token** — the Gateway authentication token (found in the OpenClaw config file `~/.openclaw/openclaw.json` under `gateway.auth.token`)
|
|
131
|
+
3. **Password** (optional) — Gateway password if password-based authentication is enabled
|
|
123
132
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
OPENCLAW_GATEWAY_TOKEN=<token> openclaw-office
|
|
128
|
-
```
|
|
133
|
+
Fill in the fields and click **Connect** to enter the system.
|
|
134
|
+
|
|
135
|
+
> **Note:** For a local deployment without authentication enabled, leave the Gateway URL at its default and the Token field empty, then click **Connect** directly.
|
|
129
136
|
|
|
130
137
|
### CLI Options
|
|
131
138
|
|
|
@@ -205,8 +212,6 @@ You can also invoke the PowerShell script directly with custom options:
|
|
|
205
212
|
| `-OfficePort` | Office Server port | `5180` |
|
|
206
213
|
| `-GatewayPort` | Gateway port | `18789` |
|
|
207
214
|
|
|
208
|
-
> **Note:** Runtime logs and PID files are stored in the `.runtime/` directory at the repository root, which is already listed in `.gitignore`.
|
|
209
|
-
|
|
210
215
|
---
|
|
211
216
|
|
|
212
217
|
## Quick Start (from source)
|
|
@@ -217,47 +222,40 @@ You can also invoke the PowerShell script directly with custom options:
|
|
|
217
222
|
pnpm install
|
|
218
223
|
```
|
|
219
224
|
|
|
220
|
-
### 2.
|
|
221
|
-
|
|
222
|
-
Create a `.env.local` file (gitignored) with your Gateway connection details:
|
|
225
|
+
### 2. Start the Gateway
|
|
223
226
|
|
|
224
|
-
|
|
225
|
-
cat > .env.local << 'EOF'
|
|
226
|
-
VITE_GATEWAY_URL=ws://localhost:18789
|
|
227
|
-
VITE_GATEWAY_TOKEN=<your-gateway-token>
|
|
228
|
-
EOF
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
Get your Gateway token:
|
|
232
|
-
|
|
233
|
-
```bash
|
|
234
|
-
openclaw config get gateway.auth.token
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
### 3. Start the Gateway
|
|
238
|
-
|
|
239
|
-
Ensure the OpenClaw Gateway is running on the configured address (default `localhost:18789`). You can start it via:
|
|
227
|
+
Ensure the OpenClaw Gateway is running on the default address (`localhost:18789`). You can start it via:
|
|
240
228
|
|
|
241
229
|
- The OpenClaw macOS app
|
|
242
230
|
- `openclaw gateway run` CLI command
|
|
243
231
|
- Other deployment methods (see [OpenClaw documentation](https://github.com/openclaw/openclaw))
|
|
244
232
|
|
|
245
|
-
|
|
233
|
+
> **Tip:** No need to pre-configure an auth token — you will enter it on the login screen in your browser after launching.
|
|
234
|
+
|
|
235
|
+
### 3. Start the Dev Server
|
|
246
236
|
|
|
247
237
|
```bash
|
|
248
238
|
pnpm dev
|
|
249
239
|
```
|
|
250
240
|
|
|
251
|
-
Open `http://localhost:5180` in your browser.
|
|
241
|
+
Open `http://localhost:5180` in your browser and enter the Gateway Token on the login screen to connect.
|
|
242
|
+
|
|
243
|
+
If you need to connect to a non-default Gateway (e.g., a remote server), create a `.env.local` file (gitignored):
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
cat > .env.local << 'EOF'
|
|
247
|
+
VITE_GATEWAY_URL=ws://192.168.1.100:18789
|
|
248
|
+
EOF
|
|
249
|
+
```
|
|
252
250
|
|
|
253
251
|
### Environment Variables
|
|
254
252
|
|
|
255
|
-
| Variable | Required
|
|
256
|
-
| ----------------------- |
|
|
257
|
-
| `VITE_GATEWAY_URL` | No
|
|
258
|
-
| `VITE_GATEWAY_WS_PATH` | No
|
|
259
|
-
| `VITE_GATEWAY_TOKEN` |
|
|
260
|
-
| `VITE_MOCK` | No
|
|
253
|
+
| Variable | Required | Default | Description |
|
|
254
|
+
| ----------------------- | -------- | ---------------------- | ---------------------------------------------------- |
|
|
255
|
+
| `VITE_GATEWAY_URL` | No | `ws://localhost:18789` | Gateway WebSocket address |
|
|
256
|
+
| `VITE_GATEWAY_WS_PATH` | No | `/gateway-ws` | Browser-side reverse proxy WS path |
|
|
257
|
+
| `VITE_GATEWAY_TOKEN` | No | — | Pre-fill the login form Token (optional; auth happens at login) |
|
|
258
|
+
| `VITE_MOCK` | No | `false` | Enable mock mode (no Gateway needed) |
|
|
261
259
|
|
|
262
260
|
### Mock Mode (No Gateway)
|
|
263
261
|
|
|
@@ -302,7 +300,7 @@ The Gateway broadcasts real-time events (`agent`, `presence`, `health`, `heartbe
|
|
|
302
300
|
### Session Synchronization Strategy
|
|
303
301
|
|
|
304
302
|
- Real-time Agent and SubAgent state, 2D office walking animation, and meeting-zone movement are driven directly by WebSocket `agent` events
|
|
305
|
-
- `sessions.list` is no longer used as a high-frequency real-time driver; it is used for immediate sync after connection and a **60-second** low-frequency reconciliation pass to recover from missed events and reconnect drift
|
|
303
|
+
- `sessions.list` is no longer used as a high-frequency real-time driver; it is used for immediate sync after connection and a **60-second** low-frequency reconciliation pass to recover from missed events and reconnect drift
|
|
306
304
|
- This strategy reduces Gateway CPU pressure and avoids letting high-frequency full-session scans interfere with other RPC probes
|
|
307
305
|
|
|
308
306
|
---
|
package/README.md
CHANGED
|
@@ -4,13 +4,33 @@
|
|
|
4
4
|
|
|
5
5
|
> 将 AI 智能体的协作逻辑具象化为实时的数字孪生办公室。
|
|
6
6
|
|
|
7
|
-
**OpenClaw Office** 是 [OpenClaw](https://github.com/openclaw/openclaw) Multi-Agent
|
|
7
|
+
**OpenClaw Office** 是 [OpenClaw](https://github.com/openclaw/openclaw) Multi-Agent 系统的可视化监控与管理前端。它通过等距投影风格的虚拟办公室场景,实时展示 Agent 的工作状态、协作链路、工具调用和资源消耗,同时提供完整的控制台管理界面和 Chat 对话工作区。
|
|
8
8
|
|
|
9
9
|
**核心隐喻:** Agent = 数字员工 | 办公室 = Agent 运行时 | 工位 = Session | 会议室 = 协作上下文
|
|
10
10
|
|
|
11
|
+
> **OpenClaw Office 让 OpenClaw 从一个聊天机器人进化为一套 Skills 系统。**
|
|
12
|
+
> 不只是对话——而是创建、开发、调试和部署可复用的技能,让每个 Agent 都能掌握专业能力并协同完成复杂任务。
|
|
13
|
+
|
|
11
14
|
---
|
|
12
15
|
|
|
13
|
-
##
|
|
16
|
+
## 功能亮点
|
|
17
|
+
|
|
18
|
+
### ✨ Skill Workbench — Skills 开发平台
|
|
19
|
+
|
|
20
|
+
Skill Workbench 是 OpenClaw Office 的核心差异化功能——把「创建 Skill / 修改 Skill / 生成流程图 / A2UI 输入表单」整合成一个完整的 **AI 协作开发环境**,让 OpenClaw 真正成为一个可编程的 Skills 系统:
|
|
21
|
+
|
|
22
|
+
- **三页面嵌套路由**:`/skill-workbench`(列表)→ `/skill-workbench/create`(创建向导)→ `/skill-workbench/:slug`(详情)
|
|
23
|
+
- **聊天侧边栏驱动开发**:在侧边栏与 AI 对话即可创建、修改 Skill,文件变动实时同步磁盘
|
|
24
|
+
- **FLOWCHART.md 自动生成**:内置 `skill-workbench-mermaid-guard` 守卫技能,一键生成符合规范的彩色 Mermaid 流程图,支持单图与多图模式
|
|
25
|
+
- **纯 Markdown 多图预览**:流程图预览完全走 Markdown 渲染链路,一次渲染多个 Mermaid 代码块
|
|
26
|
+
- **A2UI 可视化输入表单**:声明式表单 Schema,Chat 中的 ` ```a2ui ` 代码块自动渲染为交互式表单,详情页提供「A2UI 调试」选项卡一键生成和预览
|
|
27
|
+
- **默认技能自动安装**:首次进入工作台时,嵌入式服务端自动把 npm 包内置的默认 Skill 拷贝到 `~/.openclaw/workspace/skills/`,无需手工安装
|
|
28
|
+
|
|
29
|
+
详细使用指南见 [SKILL-WORKBENCH.md](./SKILL-WORKBENCH.md)。
|
|
30
|
+
|
|
31
|
+

|
|
32
|
+
|
|
33
|
+

|
|
14
34
|
|
|
15
35
|
### 虚拟办公室
|
|
16
36
|
|
|
@@ -27,25 +47,28 @@
|
|
|
27
47
|
- 顶部导航可直达的独立 Chat 工作区(`/#/chat`),底部停靠栏保留为快捷入口
|
|
28
48
|
- 会话管理 — 创建新会话、切换历史会话、按 Agent 路由,支持多 Agent 并行对话
|
|
29
49
|
- 实时流式转录 — 流式展示 AI 回复,支持中止/重发
|
|
30
|
-
- 聊天历史持久化 —
|
|
31
|
-
- 工具调用可视化 — 在对话流中嵌入 Agent
|
|
50
|
+
- 聊天历史持久化 — 服务端按天分片缓存聊天记录,跨浏览器/设备/刷新稳定可见
|
|
51
|
+
- 工具调用可视化 — 在对话流中嵌入 Agent 工具调用状态,可折叠查看
|
|
32
52
|
- 斜杠命令 — `/help`、`/new`、`/reset`、`/model`、`/think`、`/export` 等快捷指令
|
|
33
53
|
- 附件支持 — 支持图片及任意文件附件
|
|
34
54
|
- 辅助功能 — 搜索、导出 Markdown、专注模式、消息置顶引用
|
|
55
|
+
- 动态表单交互(A2UI)— AI 回复中的 ` ```a2ui ` 代码块自动渲染为结构化表单,支持文本、选择、文件上传等多种字段类型,提交后以结构化消息回发 Agent
|
|
56
|
+
|
|
57
|
+

|
|
35
58
|
|
|
36
59
|
### 控制台
|
|
37
60
|
|
|
38
61
|
完整的系统管理界面:
|
|
39
62
|
|
|
40
|
-
| 页面
|
|
41
|
-
|
|
|
42
|
-
| **Dashboard**
|
|
43
|
-
| **Agents**
|
|
44
|
-
| **Channels**
|
|
45
|
-
| **Skills**
|
|
46
|
-
| **Skill Workbench** ✨ |
|
|
47
|
-
| **Cron**
|
|
48
|
-
| **Settings**
|
|
63
|
+
| 页面 | 功能 |
|
|
64
|
+
| ------------------- | -------------------------------------------------------------------------------------------------------------------- |
|
|
65
|
+
| **Dashboard** | 概览统计卡片、告警横幅、Channel/Skill 概览、快捷导航 |
|
|
66
|
+
| **Agents** | Agent 列表/创建/删除,详情多 Tab(Overview/Channels/Cron/Skills/Tools/Files) |
|
|
67
|
+
| **Channels** | 渠道卡片、配置对话框、统计、WhatsApp QR 绑定流程 |
|
|
68
|
+
| **Skills** | 技能市场、安装选项、技能详情 |
|
|
69
|
+
| **Skill Workbench** ✨ | Skills 开发平台(详见上方介绍) |
|
|
70
|
+
| **Cron** | 定时任务管理和统计 |
|
|
71
|
+
| **Settings** | Provider 管理(添加/编辑/模型编辑器)、外观/Gateway/开发者/高级/关于/更新 |
|
|
49
72
|
|
|
50
73
|

|
|
51
74
|
|
|
@@ -61,21 +84,6 @@
|
|
|
61
84
|
|
|
62
85
|
---
|
|
63
86
|
|
|
64
|
-
## 新特性:Skill Workbench(Skills 开发平台)
|
|
65
|
-
|
|
66
|
-
从 `2026.5.20` 起,控制台正式提供 **Skill Workbench**(Skills 开发平台),把「创建 Skill / 修改 Skill / 生成流程图 / A2UI 输入表单」整合成一个完整的 AI 协作开发环境:
|
|
67
|
-
|
|
68
|
-
- **三页面嵌套路由**:`/skill-workbench` 列表页、`/skill-workbench/create` 创建向导、`/skill-workbench/:slug` 详情页
|
|
69
|
-
- **聊天侧边栏驱动开发**:在侧边栏和 AI 对话即可创建、修改 Skill,文件变动实时同步磁盘
|
|
70
|
-
- **FLOWCHART.md 自动生成**:内置 [`skill-workbench-mermaid-guard`](./SKILL-WORKBENCH.md) 守卫技能,一键生成符合规范的彩色 Mermaid 流程图,支持单图与多图模式
|
|
71
|
-
- **纯 Markdown 多图预览**:流程图预览完全走 Markdown 渲染链路,一次渲染多个 Mermaid 代码块
|
|
72
|
-
- **A2UI 可视化输入表单** ✨:声明式表单 Schema,Chat 中的 `\`\`\`a2ui` 代码块自动渲染为交互式表单,支持文本、选择、文件上传等多种字段类型;详情页新增「A2UI 调试」选项卡,可一键生成、预览和调试 `ui.json` 表单
|
|
73
|
-
- **默认技能自动安装**:首次进入工作台时,嵌入式服务端会自动把 npm 包内置的默认 Skill 拷贝到 `~/.openclaw/workspace/skills/`,无需手工安装
|
|
74
|
-
|
|
75
|
-
详细使用指南见 [SKILL-WORKBENCH.md](./SKILL-WORKBENCH.md)。
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
87
|
## 技术栈
|
|
80
88
|
|
|
81
89
|
| 层 | 技术 |
|
|
@@ -95,10 +103,9 @@
|
|
|
95
103
|
## 前提条件
|
|
96
104
|
|
|
97
105
|
- **Node.js 22+**
|
|
98
|
-
- **
|
|
99
|
-
- **[OpenClaw](https://github.com/openclaw/openclaw)** 已安装并配置
|
|
106
|
+
- **[OpenClaw](https://github.com/openclaw/openclaw)** 已安装并运行
|
|
100
107
|
|
|
101
|
-
OpenClaw Office
|
|
108
|
+
OpenClaw Office 是 OpenClaw 的配套前端,连接到正在运行的 OpenClaw Gateway。它**不会**启动或管理 Gateway 本身。
|
|
102
109
|
|
|
103
110
|
---
|
|
104
111
|
|
|
@@ -115,17 +122,17 @@ npm install -g @ww-ai-lab/openclaw-office
|
|
|
115
122
|
openclaw-office
|
|
116
123
|
```
|
|
117
124
|
|
|
118
|
-
### Gateway
|
|
125
|
+
### Gateway 认证
|
|
119
126
|
|
|
120
|
-
|
|
127
|
+
启动后,浏览器会显示 OpenClaw Office 的**登录界面**,需要你输入 Gateway 连接信息进行认证:
|
|
121
128
|
|
|
122
|
-
|
|
129
|
+
1. **Gateway URL** — Gateway WebSocket 地址,默认 `ws://localhost:18789`(预填自后端注入配置)
|
|
130
|
+
2. **Access Token** — Gateway 认证令牌(从 OpenClaw 配置文件 `~/.openclaw/openclaw.json` 中的 `gateway.auth.token` 字段获取)
|
|
131
|
+
3. **Password**(可选)— Gateway 密码(如果启用了密码认证)
|
|
123
132
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
OPENCLAW_GATEWAY_TOKEN=<token> openclaw-office
|
|
128
|
-
```
|
|
133
|
+
填写后点击「连接」即可进入系统。
|
|
134
|
+
|
|
135
|
+
> **说明:** 本地部署若未启用认证,Gateway URL 保持默认、Token 留空,直接点击「连接」即可。
|
|
129
136
|
|
|
130
137
|
### CLI 参数
|
|
131
138
|
|
|
@@ -143,7 +150,7 @@ OPENCLAW_GATEWAY_TOKEN=<token> openclaw-office
|
|
|
143
150
|
|
|
144
151
|
## 安装为系统服务(后台运行)
|
|
145
152
|
|
|
146
|
-
将 OpenClaw Office
|
|
153
|
+
将 OpenClaw Office 注册为系统服务后,它会在开机/登录时自动启动,无需手动运行命令。支持 macOS(launchd)和 Linux(systemd --user)。
|
|
147
154
|
|
|
148
155
|
### 安装服务
|
|
149
156
|
|
|
@@ -205,8 +212,6 @@ openclaw-office service uninstall # 卸载系统服务
|
|
|
205
212
|
| `-OfficePort` | Office Server 端口 | `5180` |
|
|
206
213
|
| `-GatewayPort` | Gateway 端口 | `18789` |
|
|
207
214
|
|
|
208
|
-
> **提示:** 运行时日志和 PID 文件保存在仓库根目录的 `.runtime/` 目录下,已加入 `.gitignore`。
|
|
209
|
-
|
|
210
215
|
---
|
|
211
216
|
|
|
212
217
|
## 快速开始(从源码)
|
|
@@ -217,47 +222,40 @@ openclaw-office service uninstall # 卸载系统服务
|
|
|
217
222
|
pnpm install
|
|
218
223
|
```
|
|
219
224
|
|
|
220
|
-
### 2.
|
|
221
|
-
|
|
222
|
-
创建 `.env.local` 文件(已在 `.gitignore` 中,不会被提交),填入 Gateway 连接信息:
|
|
223
|
-
|
|
224
|
-
```bash
|
|
225
|
-
cat > .env.local << 'EOF'
|
|
226
|
-
VITE_GATEWAY_URL=ws://localhost:18789
|
|
227
|
-
VITE_GATEWAY_TOKEN=<你的 gateway token>
|
|
228
|
-
EOF
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
获取 Gateway token:
|
|
232
|
-
|
|
233
|
-
```bash
|
|
234
|
-
openclaw config get gateway.auth.token
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
### 3. 启动 Gateway
|
|
225
|
+
### 2. 启动 Gateway
|
|
238
226
|
|
|
239
|
-
确保 OpenClaw Gateway
|
|
227
|
+
确保 OpenClaw Gateway 在默认地址上运行(`localhost:18789`)。可通过以下方式启动:
|
|
240
228
|
|
|
241
229
|
- OpenClaw macOS 应用
|
|
242
230
|
- `openclaw gateway run` CLI 命令
|
|
243
231
|
- 其他部署方式(参见 [OpenClaw 文档](https://github.com/openclaw/openclaw))
|
|
244
232
|
|
|
245
|
-
|
|
233
|
+
> **提示:** 认证 Token 无需提前配置——启动后在浏览器登录界面输入即可。
|
|
234
|
+
|
|
235
|
+
### 3. 启动开发服务器
|
|
246
236
|
|
|
247
237
|
```bash
|
|
248
238
|
pnpm dev
|
|
249
239
|
```
|
|
250
240
|
|
|
251
|
-
在浏览器中打开 `http://localhost:5180
|
|
241
|
+
在浏览器中打开 `http://localhost:5180`,在登录界面输入 Gateway Token 后连接即可进入。
|
|
242
|
+
|
|
243
|
+
如需连接非默认地址的 Gateway(例如远程服务器),创建 `.env.local` 文件(已在 `.gitignore` 中,不会被提交):
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
cat > .env.local << 'EOF'
|
|
247
|
+
VITE_GATEWAY_URL=ws://192.168.1.100:18789
|
|
248
|
+
EOF
|
|
249
|
+
```
|
|
252
250
|
|
|
253
251
|
### 环境变量
|
|
254
252
|
|
|
255
|
-
| 变量 | 必须
|
|
256
|
-
| ----------------------- |
|
|
257
|
-
| `VITE_GATEWAY_URL` | 否
|
|
258
|
-
| `VITE_GATEWAY_WS_PATH` | 否
|
|
259
|
-
| `VITE_GATEWAY_TOKEN` |
|
|
260
|
-
| `VITE_MOCK` | 否
|
|
253
|
+
| 变量 | 必须 | 默认值 | 说明 |
|
|
254
|
+
| ----------------------- | ---- | ---------------------- | ------------------------------------------ |
|
|
255
|
+
| `VITE_GATEWAY_URL` | 否 | `ws://localhost:18789` | Gateway WebSocket 地址 |
|
|
256
|
+
| `VITE_GATEWAY_WS_PATH` | 否 | `/gateway-ws` | 浏览器侧反向代理 WS 路径 |
|
|
257
|
+
| `VITE_GATEWAY_TOKEN` | 否 | — | 预填登录表单的 Token(可选,认证在登录时完成)|
|
|
258
|
+
| `VITE_MOCK` | 否 | `false` | 启用 Mock 模式(不需要 Gateway) |
|
|
261
259
|
|
|
262
260
|
### Mock 模式(无需 Gateway)
|
|
263
261
|
|
|
@@ -302,16 +300,16 @@ Gateway 广播实时事件(`agent`、`presence`、`health`、`heartbeat`)并
|
|
|
302
300
|
### Session 同步策略
|
|
303
301
|
|
|
304
302
|
- Agent 与子 Agent 的实时状态、2D 办公室小人走动和会议区移动效果,默认由 WebSocket `agent` 事件直接驱动
|
|
305
|
-
- `sessions.list` 不再用于高频实时驱动,而是作为连接建立后的立即同步和 **60 秒一次** 的低频 reconciliation,用于修复漏事件、断线恢复后的 session
|
|
303
|
+
- `sessions.list` 不再用于高频实时驱动,而是作为连接建立后的立即同步和 **60 秒一次** 的低频 reconciliation,用于修复漏事件、断线恢复后的 session 漂移
|
|
306
304
|
- 该策略用于降低 Gateway CPU 压力,避免高频全量扫描影响其他 RPC probe
|
|
307
305
|
|
|
308
306
|
---
|
|
309
307
|
|
|
310
|
-
##
|
|
308
|
+
## 联系交流
|
|
311
309
|
|
|
312
|
-
|
|
310
|
+
可以通过邮箱联系我:toxingwang@gmail.com
|
|
313
311
|
|
|
314
|
-
|
|
312
|
+
也欢迎关注公众号:旺哥聊AI
|
|
315
313
|
|
|
316
314
|
---
|
|
317
315
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as H,a as v,r as b,j as r}from"./index-
|
|
1
|
+
import{u as H,a as v,r as b,j as r}from"./index-BM36Njjd.js";const N=10,d=24,x=10,u=14,w=[{max:0,color:"#f3f4f6"},{max:5,color:"#bbf7d0"},{max:10,color:"#4ade80"},{max:1/0,color:"#16a34a"}],D=[{max:0,color:"#1e293b"},{max:5,color:"#14532d"},{max:10,color:"#166534"},{max:1/0,color:"#22c55e"}];function E(c,i){const l=i?D:w;for(const s of l)if(c<=s.max)return s.color;return l[l.length-1].color}function M(c){const i=Date.now(),l=3600*1e3,s=new Map;for(const t of c){const a=t.timestamp,n=(i-a)/l;if(n<0||n>=d)continue;const m=23-Math.min(23,Math.floor(n));let o=s.get(t.agentId);o||(o={name:t.agentName,counts:Array.from({length:d},()=>0)},s.set(t.agentId,o)),m>=0&&m<d&&o.counts[m]++}return Array.from(s.entries()).map(([t,{name:a,counts:n}])=>({agentId:t,agentName:a,counts:n})).toSorted((t,a)=>{const n=t.counts.reduce((o,e)=>o+e,0);return a.counts.reduce((o,e)=>o+e,0)-n}).slice(0,N)}function O(){const{t:c}=H("panels"),i=v(e=>e.eventHistory),s=v(e=>e.theme)==="dark",[t,a]=b.useState(null),n=b.useMemo(()=>M(i),[i]);if(n.length===0)return r.jsx("div",{className:"flex h-48 items-center justify-center text-sm text-gray-500 dark:text-gray-400",children:c("common:empty.noActivityData")});const m=Date.now(),o=3600*1e3;return r.jsxs("div",{className:"relative",children:[r.jsx("svg",{width:d*x+60,height:N*u+24,className:"overflow-visible",children:n.map((e,f)=>r.jsxs("g",{children:[r.jsx("text",{x:0,y:f*u+u/2+4,fontSize:9,fill:s?"#e2e8f0":"#374151",children:e.agentName.length>10?`${e.agentName.slice(0,8)}…`:e.agentName}),e.counts.map((h,g)=>{const L=55+g*x,j=f*u+4,y=m-(d-g)*o,S=y+o,A=`${new Date(y).getHours()}:00-${new Date(S).getHours()}:00`;return r.jsx("rect",{x:L,y:j,width:x-1,height:u-1,fill:E(h,s),onMouseEnter:C=>{const p=C.target.getBoundingClientRect();a({agentName:e.agentName,hour:A,count:h,x:p.left,y:p.top})},onMouseLeave:()=>a(null)},g)})]},e.agentId))}),t&&r.jsxs("div",{className:"fixed z-10 rounded border border-gray-200 bg-white px-2 py-1 text-xs shadow dark:border-gray-700 dark:bg-gray-900 dark:text-gray-200",style:{left:t.x,top:t.y-32},children:[t.agentName," | ",t.hour," | ",t.count," ",c("activityHeatmap.eventsUnit")]})]})}export{O as ActivityHeatmap};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{R as f,g as Ce,r as ve,u as Qe,a as Ae,j as O,b as Xe}from"./index-
|
|
1
|
+
import{R as f,g as Ce,r as ve,u as Qe,a as Ae,j as O,b as Xe}from"./index-BM36Njjd.js";import{c as I,f as x,H as Fe,I as Ye,J as Be,K as et,b as D,T as he,M as T,L as _,N as Ke,e as ye,h as Me,D as tt,C as rt,n as z,q as K,S as nt,A as it,d as at,k as Oe,l as ot,i as M,p as st,u as ct,G as lt,m as ee,j as ut,O as Ve,P as ft,Q as Y,U as Pe,z as pt,V as dt,R as mt,F as vt}from"./generateCategoricalChart-CReUs1iy.js";import"./string-Bl2zznvy.js";import"./band-CquvqAHh.js";import"./init-Dmth1JHB.js";import"./ordinal-DILIJJjt.js";import"./linear-DSkd6W2C.js";import"./defaultLocale-DX6XiGOO.js";import"./time-DXBSQWow.js";var ht=["points","className","baseLinePoints","connectNulls"];function V(){return V=Object.assign?Object.assign.bind():function(r){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var t in n)Object.prototype.hasOwnProperty.call(n,t)&&(r[t]=n[t])}return r},V.apply(this,arguments)}function yt(r,e){if(r==null)return{};var n=gt(r,e),t,i;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(r);for(i=0;i<o.length;i++)t=o[i],!(e.indexOf(t)>=0)&&Object.prototype.propertyIsEnumerable.call(r,t)&&(n[t]=r[t])}return n}function gt(r,e){if(r==null)return{};var n={};for(var t in r)if(Object.prototype.hasOwnProperty.call(r,t)){if(e.indexOf(t)>=0)continue;n[t]=r[t]}return n}function ke(r){return Ot(r)||At(r)||xt(r)||bt()}function bt(){throw new TypeError(`Invalid attempt to spread non-iterable instance.
|
|
2
2
|
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function xt(r,e){if(r){if(typeof r=="string")return fe(r,e);var n=Object.prototype.toString.call(r).slice(8,-1);if(n==="Object"&&r.constructor&&(n=r.constructor.name),n==="Map"||n==="Set")return Array.from(r);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return fe(r,e)}}function At(r){if(typeof Symbol<"u"&&r[Symbol.iterator]!=null||r["@@iterator"]!=null)return Array.from(r)}function Ot(r){if(Array.isArray(r))return fe(r)}function fe(r,e){(e==null||e>r.length)&&(e=r.length);for(var n=0,t=new Array(e);n<e;n++)t[n]=r[n];return t}var je=function(e){return e&&e.x===+e.x&&e.y===+e.y},Pt=function(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],n=[[]];return e.forEach(function(t){je(t)?n[n.length-1].push(t):n[n.length-1].length>0&&n.push([])}),je(e[0])&&n[n.length-1].push(e[0]),n[n.length-1].length<=0&&(n=n.slice(0,-1)),n},U=function(e,n){var t=Pt(e);n&&(t=[t.reduce(function(o,a){return[].concat(ke(o),ke(a))},[])]);var i=t.map(function(o){return o.reduce(function(a,s,l){return"".concat(a).concat(l===0?"M":"L").concat(s.x,",").concat(s.y)},"")}).join("");return t.length===1?"".concat(i,"Z"):i},kt=function(e,n,t){var i=U(e,t);return"".concat(i.slice(-1)==="Z"?i.slice(0,-1):i,"L").concat(U(n.reverse(),t).slice(1))},jt=function(e){var n=e.points,t=e.className,i=e.baseLinePoints,o=e.connectNulls,a=yt(e,ht);if(!n||!n.length)return null;var s=I("recharts-polygon",t);if(i&&i.length){var l=a.stroke&&a.stroke!=="none",c=kt(n,i,o);return f.createElement("g",{className:s},f.createElement("path",V({},x(a,!0),{fill:c.slice(-1)==="Z"?a.fill:"none",stroke:"none",d:c})),l?f.createElement("path",V({},x(a,!0),{fill:"none",d:U(n,o)})):null,l?f.createElement("path",V({},x(a,!0),{fill:"none",d:U(i,o)})):null)}var p=U(n,o);return f.createElement("path",V({},x(a,!0),{fill:p.slice(-1)==="Z"?a.fill:"none",className:s,d:p}))},le,_e;function _t(){if(_e)return le;_e=1;var r=Fe(),e=Ye(),n=Be();function t(i,o){return i&&i.length?r(i,n(o,2),e):void 0}return le=t,le}var wt=_t();const St=Ce(wt);var ue,we;function Tt(){if(we)return ue;we=1;var r=Fe(),e=Be(),n=et();function t(i,o){return i&&i.length?r(i,e(o,2),n):void 0}return ue=t,ue}var Et=Tt();const Rt=Ce(Et);var It=["cx","cy","angle","ticks","axisLine"],$t=["ticks","tick","angle","tickFormatter","stroke"];function W(r){"@babel/helpers - typeof";return W=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},W(r)}function J(){return J=Object.assign?Object.assign.bind():function(r){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var t in n)Object.prototype.hasOwnProperty.call(n,t)&&(r[t]=n[t])}return r},J.apply(this,arguments)}function Se(r,e){var n=Object.keys(r);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(r);e&&(t=t.filter(function(i){return Object.getOwnPropertyDescriptor(r,i).enumerable})),n.push.apply(n,t)}return n}function L(r){for(var e=1;e<arguments.length;e++){var n=arguments[e]!=null?arguments[e]:{};e%2?Se(Object(n),!0).forEach(function(t){ae(r,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(n)):Se(Object(n)).forEach(function(t){Object.defineProperty(r,t,Object.getOwnPropertyDescriptor(n,t))})}return r}function Te(r,e){if(r==null)return{};var n=Lt(r,e),t,i;if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(r);for(i=0;i<o.length;i++)t=o[i],!(e.indexOf(t)>=0)&&Object.prototype.propertyIsEnumerable.call(r,t)&&(n[t]=r[t])}return n}function Lt(r,e){if(r==null)return{};var n={};for(var t in r)if(Object.prototype.hasOwnProperty.call(r,t)){if(e.indexOf(t)>=0)continue;n[t]=r[t]}return n}function Nt(r,e){if(!(r instanceof e))throw new TypeError("Cannot call a class as a function")}function Ee(r,e){for(var n=0;n<e.length;n++){var t=e[n];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(r,ze(t.key),t)}}function Dt(r,e,n){return e&&Ee(r.prototype,e),n&&Ee(r,n),Object.defineProperty(r,"prototype",{writable:!1}),r}function Ct(r,e,n){return e=re(e),Ft(r,qe()?Reflect.construct(e,n||[],re(r).constructor):e.apply(r,n))}function Ft(r,e){if(e&&(W(e)==="object"||typeof e=="function"))return e;if(e!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return Bt(r)}function Bt(r){if(r===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return r}function qe(){try{var r=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(qe=function(){return!!r})()}function re(r){return re=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(n){return n.__proto__||Object.getPrototypeOf(n)},re(r)}function Kt(r,e){if(typeof e!="function"&&e!==null)throw new TypeError("Super expression must either be null or a function");r.prototype=Object.create(e&&e.prototype,{constructor:{value:r,writable:!0,configurable:!0}}),Object.defineProperty(r,"prototype",{writable:!1}),e&&pe(r,e)}function pe(r,e){return pe=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,i){return t.__proto__=i,t},pe(r,e)}function ae(r,e,n){return e=ze(e),e in r?Object.defineProperty(r,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):r[e]=n,r}function ze(r){var e=Mt(r,"string");return W(e)=="symbol"?e:e+""}function Mt(r,e){if(W(r)!="object"||!r)return r;var n=r[Symbol.toPrimitive];if(n!==void 0){var t=n.call(r,e);if(W(t)!="object")return t;throw new TypeError("@@toPrimitive must return a primitive value.")}return(e==="string"?String:Number)(r)}var oe=(function(r){function e(){return Nt(this,e),Ct(this,e,arguments)}return Kt(e,r),Dt(e,[{key:"getTickValueCoord",value:function(t){var i=t.coordinate,o=this.props,a=o.angle,s=o.cx,l=o.cy;return T(s,l,i,a)}},{key:"getTickTextAnchor",value:function(){var t=this.props.orientation,i;switch(t){case"left":i="end";break;case"right":i="start";break;default:i="middle";break}return i}},{key:"getViewBox",value:function(){var t=this.props,i=t.cx,o=t.cy,a=t.angle,s=t.ticks,l=St(s,function(p){return p.coordinate||0}),c=Rt(s,function(p){return p.coordinate||0});return{cx:i,cy:o,startAngle:a,endAngle:a,innerRadius:c.coordinate||0,outerRadius:l.coordinate||0}}},{key:"renderAxisLine",value:function(){var t=this.props,i=t.cx,o=t.cy,a=t.angle,s=t.ticks,l=t.axisLine,c=Te(t,It),p=s.reduce(function(d,u){return[Math.min(d[0],u.coordinate),Math.max(d[1],u.coordinate)]},[1/0,-1/0]),m=T(i,o,p[0],a),y=T(i,o,p[1],a),A=L(L(L({},x(c,!1)),{},{fill:"none"},x(l,!1)),{},{x1:m.x,y1:m.y,x2:y.x,y2:y.y});return f.createElement("line",J({className:"recharts-polar-radius-axis-line"},A))}},{key:"renderTicks",value:function(){var t=this,i=this.props,o=i.ticks,a=i.tick,s=i.angle,l=i.tickFormatter,c=i.stroke,p=Te(i,$t),m=this.getTickTextAnchor(),y=x(p,!1),A=x(a,!1),d=o.map(function(u,h){var g=t.getTickValueCoord(u),b=L(L(L(L({textAnchor:m,transform:"rotate(".concat(90-s,", ").concat(g.x,", ").concat(g.y,")")},y),{},{stroke:"none",fill:c},A),{},{index:h},g),{},{payload:u});return f.createElement(_,J({className:I("recharts-polar-radius-axis-tick",Ke(a)),key:"tick-".concat(u.coordinate)},ye(t.props,u,h)),e.renderTickItem(a,b,l?l(u.value,h):u.value))});return f.createElement(_,{className:"recharts-polar-radius-axis-ticks"},d)}},{key:"render",value:function(){var t=this.props,i=t.ticks,o=t.axisLine,a=t.tick;return!i||!i.length?null:f.createElement(_,{className:I("recharts-polar-radius-axis",this.props.className)},o&&this.renderAxisLine(),a&&this.renderTicks(),Me.renderCallByParent(this.props,this.getViewBox()))}}],[{key:"renderTickItem",value:function(t,i,o){var a;return f.isValidElement(t)?a=f.cloneElement(t,i):D(t)?a=t(i):a=f.createElement(he,J({},i,{className:"recharts-polar-radius-axis-tick-value"}),o),a}}])})(ve.PureComponent);ae(oe,"displayName","PolarRadiusAxis");ae(oe,"axisType","radiusAxis");ae(oe,"defaultProps",{type:"number",radiusAxisId:0,cx:0,cy:0,angle:0,orientation:"right",stroke:"#ccc",axisLine:!0,tick:!0,tickCount:5,allowDataOverflow:!1,scale:"auto",allowDuplicatedCategory:!0});function G(r){"@babel/helpers - typeof";return G=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},G(r)}function C(){return C=Object.assign?Object.assign.bind():function(r){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var t in n)Object.prototype.hasOwnProperty.call(n,t)&&(r[t]=n[t])}return r},C.apply(this,arguments)}function Re(r,e){var n=Object.keys(r);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(r);e&&(t=t.filter(function(i){return Object.getOwnPropertyDescriptor(r,i).enumerable})),n.push.apply(n,t)}return n}function N(r){for(var e=1;e<arguments.length;e++){var n=arguments[e]!=null?arguments[e]:{};e%2?Re(Object(n),!0).forEach(function(t){se(r,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(n)):Re(Object(n)).forEach(function(t){Object.defineProperty(r,t,Object.getOwnPropertyDescriptor(n,t))})}return r}function Vt(r,e){if(!(r instanceof e))throw new TypeError("Cannot call a class as a function")}function Ie(r,e){for(var n=0;n<e.length;n++){var t=e[n];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(r,Ge(t.key),t)}}function qt(r,e,n){return e&&Ie(r.prototype,e),n&&Ie(r,n),Object.defineProperty(r,"prototype",{writable:!1}),r}function zt(r,e,n){return e=ne(e),Wt(r,We()?Reflect.construct(e,n||[],ne(r).constructor):e.apply(r,n))}function Wt(r,e){if(e&&(G(e)==="object"||typeof e=="function"))return e;if(e!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return Gt(r)}function Gt(r){if(r===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return r}function We(){try{var r=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(We=function(){return!!r})()}function ne(r){return ne=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(n){return n.__proto__||Object.getPrototypeOf(n)},ne(r)}function Ht(r,e){if(typeof e!="function"&&e!==null)throw new TypeError("Super expression must either be null or a function");r.prototype=Object.create(e&&e.prototype,{constructor:{value:r,writable:!0,configurable:!0}}),Object.defineProperty(r,"prototype",{writable:!1}),e&&de(r,e)}function de(r,e){return de=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,i){return t.__proto__=i,t},de(r,e)}function se(r,e,n){return e=Ge(e),e in r?Object.defineProperty(r,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):r[e]=n,r}function Ge(r){var e=Zt(r,"string");return G(e)=="symbol"?e:e+""}function Zt(r,e){if(G(r)!="object"||!r)return r;var n=r[Symbol.toPrimitive];if(n!==void 0){var t=n.call(r,e);if(G(t)!="object")return t;throw new TypeError("@@toPrimitive must return a primitive value.")}return(e==="string"?String:Number)(r)}var Ut=Math.PI/180,$e=1e-5,ce=(function(r){function e(){return Vt(this,e),zt(this,e,arguments)}return Ht(e,r),qt(e,[{key:"getTickLineCoord",value:function(t){var i=this.props,o=i.cx,a=i.cy,s=i.radius,l=i.orientation,c=i.tickSize,p=c||8,m=T(o,a,s,t.coordinate),y=T(o,a,s+(l==="inner"?-1:1)*p,t.coordinate);return{x1:m.x,y1:m.y,x2:y.x,y2:y.y}}},{key:"getTickTextAnchor",value:function(t){var i=this.props.orientation,o=Math.cos(-t.coordinate*Ut),a;return o>$e?a=i==="outer"?"start":"end":o<-$e?a=i==="outer"?"end":"start":a="middle",a}},{key:"renderAxisLine",value:function(){var t=this.props,i=t.cx,o=t.cy,a=t.radius,s=t.axisLine,l=t.axisLineType,c=N(N({},x(this.props,!1)),{},{fill:"none"},x(s,!1));if(l==="circle")return f.createElement(tt,C({className:"recharts-polar-angle-axis-line"},c,{cx:i,cy:o,r:a}));var p=this.props.ticks,m=p.map(function(y){return T(i,o,a,y.coordinate)});return f.createElement(jt,C({className:"recharts-polar-angle-axis-line"},c,{points:m}))}},{key:"renderTicks",value:function(){var t=this,i=this.props,o=i.ticks,a=i.tick,s=i.tickLine,l=i.tickFormatter,c=i.stroke,p=x(this.props,!1),m=x(a,!1),y=N(N({},p),{},{fill:"none"},x(s,!1)),A=o.map(function(d,u){var h=t.getTickLineCoord(d),g=t.getTickTextAnchor(d),b=N(N(N({textAnchor:g},p),{},{stroke:"none",fill:c},m),{},{index:u,payload:d,x:h.x2,y:h.y2});return f.createElement(_,C({className:I("recharts-polar-angle-axis-tick",Ke(a)),key:"tick-".concat(d.coordinate)},ye(t.props,d,u)),s&&f.createElement("line",C({className:"recharts-polar-angle-axis-tick-line"},y,h)),a&&e.renderTickItem(a,b,l?l(d.value,u):d.value))});return f.createElement(_,{className:"recharts-polar-angle-axis-ticks"},A)}},{key:"render",value:function(){var t=this.props,i=t.ticks,o=t.radius,a=t.axisLine;return o<=0||!i||!i.length?null:f.createElement(_,{className:I("recharts-polar-angle-axis",this.props.className)},a&&this.renderAxisLine(),this.renderTicks())}}],[{key:"renderTickItem",value:function(t,i,o){var a;return f.isValidElement(t)?a=f.cloneElement(t,i):D(t)?a=t(i):a=f.createElement(he,C({},i,{className:"recharts-polar-angle-axis-tick-value"}),o),a}}])})(ve.PureComponent);se(ce,"displayName","PolarAngleAxis");se(ce,"axisType","angleAxis");se(ce,"defaultProps",{type:"category",angleAxisId:0,scale:"auto",cx:0,cy:0,orientation:"outer",axisLine:!0,tickLine:!0,tickSize:8,tick:!0,hide:!1,allowDuplicatedCategory:!0});var te;function H(r){"@babel/helpers - typeof";return H=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},H(r)}function q(){return q=Object.assign?Object.assign.bind():function(r){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var t in n)Object.prototype.hasOwnProperty.call(n,t)&&(r[t]=n[t])}return r},q.apply(this,arguments)}function Le(r,e){var n=Object.keys(r);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(r);e&&(t=t.filter(function(i){return Object.getOwnPropertyDescriptor(r,i).enumerable})),n.push.apply(n,t)}return n}function v(r){for(var e=1;e<arguments.length;e++){var n=arguments[e]!=null?arguments[e]:{};e%2?Le(Object(n),!0).forEach(function(t){k(r,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(n)):Le(Object(n)).forEach(function(t){Object.defineProperty(r,t,Object.getOwnPropertyDescriptor(n,t))})}return r}function Jt(r,e){if(!(r instanceof e))throw new TypeError("Cannot call a class as a function")}function Ne(r,e){for(var n=0;n<e.length;n++){var t=e[n];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(r,Ze(t.key),t)}}function Qt(r,e,n){return e&&Ne(r.prototype,e),n&&Ne(r,n),Object.defineProperty(r,"prototype",{writable:!1}),r}function Xt(r,e,n){return e=ie(e),Yt(r,He()?Reflect.construct(e,n||[],ie(r).constructor):e.apply(r,n))}function Yt(r,e){if(e&&(H(e)==="object"||typeof e=="function"))return e;if(e!==void 0)throw new TypeError("Derived constructors may only return object or undefined");return er(r)}function er(r){if(r===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return r}function He(){try{var r=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(He=function(){return!!r})()}function ie(r){return ie=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(n){return n.__proto__||Object.getPrototypeOf(n)},ie(r)}function tr(r,e){if(typeof e!="function"&&e!==null)throw new TypeError("Super expression must either be null or a function");r.prototype=Object.create(e&&e.prototype,{constructor:{value:r,writable:!0,configurable:!0}}),Object.defineProperty(r,"prototype",{writable:!1}),e&&me(r,e)}function me(r,e){return me=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,i){return t.__proto__=i,t},me(r,e)}function k(r,e,n){return e=Ze(e),e in r?Object.defineProperty(r,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):r[e]=n,r}function Ze(r){var e=rr(r,"string");return H(e)=="symbol"?e:e+""}function rr(r,e){if(H(r)!="object"||!r)return r;var n=r[Symbol.toPrimitive];if(n!==void 0){var t=n.call(r,e);if(H(t)!="object")return t;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(r)}var E=(function(r){function e(n){var t;return Jt(this,e),t=Xt(this,e,[n]),k(t,"pieRef",null),k(t,"sectorRefs",[]),k(t,"id",ct("recharts-pie-")),k(t,"handleAnimationEnd",function(){var i=t.props.onAnimationEnd;t.setState({isAnimationFinished:!0}),D(i)&&i()}),k(t,"handleAnimationStart",function(){var i=t.props.onAnimationStart;t.setState({isAnimationFinished:!1}),D(i)&&i()}),t.state={isAnimationFinished:!n.isAnimationActive,prevIsAnimationActive:n.isAnimationActive,prevAnimationId:n.animationId,sectorToFocus:0},t}return tr(e,r),Qt(e,[{key:"isActiveIndex",value:function(t){var i=this.props.activeIndex;return Array.isArray(i)?i.indexOf(t)!==-1:t===i}},{key:"hasActiveIndex",value:function(){var t=this.props.activeIndex;return Array.isArray(t)?t.length!==0:t||t===0}},{key:"renderLabels",value:function(t){var i=this.props.isAnimationActive;if(i&&!this.state.isAnimationFinished)return null;var o=this.props,a=o.label,s=o.labelLine,l=o.dataKey,c=o.valueKey,p=x(this.props,!1),m=x(a,!1),y=x(s,!1),A=a&&a.offsetRadius||20,d=t.map(function(u,h){var g=(u.startAngle+u.endAngle)/2,b=T(u.cx,u.cy,u.outerRadius+A,g),j=v(v(v(v({},p),u),{},{stroke:"none"},m),{},{index:h,textAnchor:e.getTextAnchor(b.x,u.cx)},b),F=v(v(v(v({},p),u),{},{fill:"none",stroke:u.fill},y),{},{index:h,points:[T(u.cx,u.cy,u.outerRadius,g),b]}),w=l;return z(l)&&z(c)?w="value":z(l)&&(w=c),f.createElement(_,{key:"label-".concat(u.startAngle,"-").concat(u.endAngle,"-").concat(u.midAngle,"-").concat(h)},s&&e.renderLabelLineItem(s,F,"line"),e.renderLabelItem(a,j,K(u,w)))});return f.createElement(_,{className:"recharts-pie-labels"},d)}},{key:"renderSectorsStatically",value:function(t){var i=this,o=this.props,a=o.activeShape,s=o.blendStroke,l=o.inactiveShape;return t.map(function(c,p){if((c==null?void 0:c.startAngle)===0&&(c==null?void 0:c.endAngle)===0&&t.length!==1)return null;var m=i.isActiveIndex(p),y=l&&i.hasActiveIndex()?l:null,A=m?a:y,d=v(v({},c),{},{stroke:s?c.fill:c.stroke,tabIndex:-1});return f.createElement(_,q({ref:function(h){h&&!i.sectorRefs.includes(h)&&i.sectorRefs.push(h)},tabIndex:-1,className:"recharts-pie-sector"},ye(i.props,c,p),{key:"sector-".concat(c==null?void 0:c.startAngle,"-").concat(c==null?void 0:c.endAngle,"-").concat(c.midAngle,"-").concat(p)}),f.createElement(nt,q({option:A,isActive:m,shapeType:"sector"},d)))})}},{key:"renderSectorsWithAnimation",value:function(){var t=this,i=this.props,o=i.sectors,a=i.isAnimationActive,s=i.animationBegin,l=i.animationDuration,c=i.animationEasing,p=i.animationId,m=this.state,y=m.prevSectors,A=m.prevIsAnimationActive;return f.createElement(it,{begin:s,duration:l,isActive:a,easing:c,from:{t:0},to:{t:1},key:"pie-".concat(p,"-").concat(A),onAnimationStart:this.handleAnimationStart,onAnimationEnd:this.handleAnimationEnd},function(d){var u=d.t,h=[],g=o&&o[0],b=g.startAngle;return o.forEach(function(j,F){var w=y&&y[F],$=F>0?at(j,"paddingAngle",0):0;if(w){var Z=Oe(w.endAngle-w.startAngle,j.endAngle-j.startAngle),P=v(v({},j),{},{startAngle:b+$,endAngle:b+Z(u)+$});h.push(P),b=P.endAngle}else{var B=j.endAngle,S=j.startAngle,Q=Oe(0,B-S),X=Q(u),R=v(v({},j),{},{startAngle:b+$,endAngle:b+X+$});h.push(R),b=R.endAngle}}),f.createElement(_,null,t.renderSectorsStatically(h))})}},{key:"attachKeyboardHandlers",value:function(t){var i=this;t.onkeydown=function(o){if(!o.altKey)switch(o.key){case"ArrowLeft":{var a=++i.state.sectorToFocus%i.sectorRefs.length;i.sectorRefs[a].focus(),i.setState({sectorToFocus:a});break}case"ArrowRight":{var s=--i.state.sectorToFocus<0?i.sectorRefs.length-1:i.state.sectorToFocus%i.sectorRefs.length;i.sectorRefs[s].focus(),i.setState({sectorToFocus:s});break}case"Escape":{i.sectorRefs[i.state.sectorToFocus].blur(),i.setState({sectorToFocus:0});break}}}}},{key:"renderSectors",value:function(){var t=this.props,i=t.sectors,o=t.isAnimationActive,a=this.state.prevSectors;return o&&i&&i.length&&(!a||!ot(a,i))?this.renderSectorsWithAnimation():this.renderSectorsStatically(i)}},{key:"componentDidMount",value:function(){this.pieRef&&this.attachKeyboardHandlers(this.pieRef)}},{key:"render",value:function(){var t=this,i=this.props,o=i.hide,a=i.sectors,s=i.className,l=i.label,c=i.cx,p=i.cy,m=i.innerRadius,y=i.outerRadius,A=i.isAnimationActive,d=this.state.isAnimationFinished;if(o||!a||!a.length||!M(c)||!M(p)||!M(m)||!M(y))return null;var u=I("recharts-pie",s);return f.createElement(_,{tabIndex:this.props.rootTabIndex,className:u,ref:function(g){t.pieRef=g}},this.renderSectors(),l&&this.renderLabels(a),Me.renderCallByParent(this.props,null,!1),(!A||d)&&st.renderCallByParent(this.props,a,!1))}}],[{key:"getDerivedStateFromProps",value:function(t,i){return i.prevIsAnimationActive!==t.isAnimationActive?{prevIsAnimationActive:t.isAnimationActive,prevAnimationId:t.animationId,curSectors:t.sectors,prevSectors:[],isAnimationFinished:!0}:t.isAnimationActive&&t.animationId!==i.prevAnimationId?{prevAnimationId:t.animationId,curSectors:t.sectors,prevSectors:i.curSectors,isAnimationFinished:!0}:t.sectors!==i.curSectors?{curSectors:t.sectors,isAnimationFinished:!0}:null}},{key:"getTextAnchor",value:function(t,i){return t>i?"start":t<i?"end":"middle"}},{key:"renderLabelLineItem",value:function(t,i,o){if(f.isValidElement(t))return f.cloneElement(t,i);if(D(t))return t(i);var a=I("recharts-pie-label-line",typeof t!="boolean"?t.className:"");return f.createElement(rt,q({},i,{key:o,type:"linear",className:a}))}},{key:"renderLabelItem",value:function(t,i,o){if(f.isValidElement(t))return f.cloneElement(t,i);var a=o;if(D(t)&&(a=t(i),f.isValidElement(a)))return a;var s=I("recharts-pie-label-text",typeof t!="boolean"&&!D(t)?t.className:"");return f.createElement(he,q({},i,{alignmentBaseline:"middle",className:s}),a)}}])})(ve.PureComponent);te=E;k(E,"displayName","Pie");k(E,"defaultProps",{stroke:"#fff",fill:"#808080",legendType:"rect",cx:"50%",cy:"50%",startAngle:0,endAngle:360,innerRadius:0,outerRadius:"80%",paddingAngle:0,labelLine:!0,hide:!1,minAngle:0,isAnimationActive:!lt.isSsr,animationBegin:400,animationDuration:1500,animationEasing:"ease",nameKey:"name",blendStroke:!1,rootTabIndex:0});k(E,"parseDeltaAngle",function(r,e){var n=ee(e-r),t=Math.min(Math.abs(e-r),360);return n*t});k(E,"getRealPieData",function(r){var e=r.data,n=r.children,t=x(r,!1),i=ut(n,Ve);return e&&e.length?e.map(function(o,a){return v(v(v({payload:o},t),o),i&&i[a]&&i[a].props)}):i&&i.length?i.map(function(o){return v(v({},t),o.props)}):[]});k(E,"parseCoordinateOfPie",function(r,e){var n=e.top,t=e.left,i=e.width,o=e.height,a=ft(i,o),s=t+Y(r.cx,i,i/2),l=n+Y(r.cy,o,o/2),c=Y(r.innerRadius,a,0),p=Y(r.outerRadius,a,a*.8),m=r.maxRadius||Math.sqrt(i*i+o*o)/2;return{cx:s,cy:l,innerRadius:c,outerRadius:p,maxRadius:m}});k(E,"getComposedData",function(r){var e=r.item,n=r.offset,t=e.type.defaultProps!==void 0?v(v({},e.type.defaultProps),e.props):e.props,i=te.getRealPieData(t);if(!i||!i.length)return null;var o=t.cornerRadius,a=t.startAngle,s=t.endAngle,l=t.paddingAngle,c=t.dataKey,p=t.nameKey,m=t.valueKey,y=t.tooltipType,A=Math.abs(t.minAngle),d=te.parseCoordinateOfPie(t,n),u=te.parseDeltaAngle(a,s),h=Math.abs(u),g=c;z(c)&&z(m)?(Pe(!1,`Use "dataKey" to specify the value of pie,
|
|
3
3
|
the props "valueKey" will be deprecated in 1.1.0`),g="value"):z(c)&&(Pe(!1,`Use "dataKey" to specify the value of pie,
|
|
4
4
|
the props "valueKey" will be deprecated in 1.1.0`),g=m);var b=i.filter(function(P){return K(P,g,0)!==0}).length,j=(h>=360?b:b-1)*l,F=h-b*A-j,w=i.reduce(function(P,B){var S=K(B,g,0);return P+(M(S)?S:0)},0),$;if(w>0){var Z;$=i.map(function(P,B){var S=K(P,g,0),Q=K(P,p,B),X=(M(S)?S:0)/w,R;B?R=Z.endAngle+ee(u)*l*(S!==0?1:0):R=a;var ge=R+ee(u)*((S!==0?A:0)+X*F),be=(R+ge)/2,xe=(d.innerRadius+d.outerRadius)/2,Ue=[{name:Q,value:S,payload:P,dataKey:g,type:y}],Je=T(d.cx,d.cy,xe,be);return Z=v(v(v({percent:X,cornerRadius:o,name:Q,tooltipPayload:Ue,midAngle:be,middleRadius:xe,tooltipPosition:Je},P),d),{},{value:K(P,g),startAngle:R,endAngle:ge,payload:P,paddingAngle:ee(u)*l}),Z})}return v(v({},d),{},{sectors:$,data:i})});var nr=pt({chartName:"PieChart",GraphicalChild:E,validateTooltipEventTypes:["item"],defaultTooltipEventType:"item",legendContent:"children",axisComponents:[{axisType:"angleAxis",AxisComp:ce},{axisType:"radiusAxis",AxisComp:oe}],formatAxisMap:dt,defaultProps:{layout:"centric",startAngle:0,endAngle:360,cx:"50%",cy:"50%",innerRadius:0,outerRadius:"80%"}});function De(r){return r>=100?`$${r.toFixed(0)}`:r>=1?`$${r.toFixed(2)}`:r>=.01?`$${r.toFixed(3)}`:r>0?"<$0.01":"$0"}function dr(){const{t:r}=Qe("panels"),e=Ae(a=>a.agentCosts),n=Ae(a=>a.agents),t=Object.entries(e).filter(([,a])=>a>0),i=t.reduce((a,[,s])=>a+s,0);if(t.length===0)return O.jsx("div",{className:"flex h-20 items-center justify-center text-xs text-gray-400 dark:text-gray-500",children:r("common:empty.noCostData")});const o=t.map(([a,s])=>{var l;return{name:((l=n.get(a))==null?void 0:l.name)??a,agentId:a,value:s,color:Xe(a)}});return O.jsxs("div",{className:"flex flex-col items-center gap-1",children:[O.jsxs("div",{className:"relative aspect-square w-full max-w-[180px]",children:[O.jsx(mt,{width:"100%",height:"100%",children:O.jsxs(nr,{children:[O.jsx(E,{data:o,dataKey:"value",nameKey:"name",cx:"50%",cy:"50%",innerRadius:"55%",outerRadius:"85%",paddingAngle:2,children:o.map((a,s)=>O.jsx(Ve,{fill:a.color},s))}),O.jsx(vt,{formatter:(a,s)=>{const l=typeof a=="number"?a:0,c=i>0?(l/i*100).toFixed(0):"0";return[`${De(l)} (${c}%)`,s]}})]})}),O.jsxs("div",{className:"pointer-events-none absolute inset-0 flex flex-col items-center justify-center",children:[O.jsx("span",{className:"text-sm font-bold text-gray-700 dark:text-gray-300",children:De(i)}),O.jsx("span",{className:"text-[9px] text-gray-400 dark:text-gray-500",children:r("metrics.costLabel")})]})]}),o.length>1&&O.jsx("div",{className:"flex flex-wrap justify-center gap-x-3 gap-y-0.5 px-1",children:o.map(a=>O.jsxs("div",{className:"flex items-center gap-1",children:[O.jsx("span",{className:"inline-block h-2 w-2 shrink-0 rounded-full",style:{backgroundColor:a.color}}),O.jsx("span",{className:"max-w-[80px] truncate text-[10px] text-gray-600 dark:text-gray-400",children:a.name})]},a.agentId))})]})}export{dr as CostPieChart};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/mermaid.core-
|
|
2
|
-
import{r as t,a as w,_ as j,j as i}from"./index-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/mermaid.core-dRlZdQYC.js","assets/index-BM36Njjd.js","assets/index-DZw6DpsO.css","assets/string-Bl2zznvy.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as t,a as w,_ as j,j as i}from"./index-BM36Njjd.js";let g=null,m=null,v=null,h=0,y=Promise.resolve();async function k(){return m||(m=j(()=>import("./mermaid.core-dRlZdQYC.js").then(o=>o.b9),__vite__mapDeps([0,1,2,3])).then(o=>{g=o.default})),await m,g}function _(){const o=t.useRef(null),n=w(a=>a.theme),l=t.useCallback(async a=>{const u=y.then(async()=>{let r="";try{const s=await k(),e=n==="dark"?"dark":"default";v!==e&&(s.initialize({startOnLoad:!1,theme:e,flowchart:{useMaxWidth:!0,htmlLabels:!0},securityLevel:"strict"}),v=e),h+=1,r=`mermaid-render-${h}`,await s.parse(a);const{svg:c}=await s.render(r,a),d=document.getElementById(`d${r}`);return d&&d.remove(),{svg:c,error:null}}catch(s){if(r){const e=document.getElementById(`d${r}`);e&&e.remove()}return{svg:"",error:String(s)}}});return y=u.catch(()=>{}),u},[n]);return{renderRef:o,render:l}}const M=t.memo(function({source:n,className:l}){const{render:a}=_(),[u,r]=t.useState(null),[s,e]=t.useState(""),[c,d]=t.useState(!0),f=t.useCallback(async b=>{d(!0);const{svg:p,error:x}=await a(b);if(x){r(x),e(""),d(!1);return}r(null),e(p),d(!1)},[a]);return t.useEffect(()=>{n.trim()?f(n):(r(null),e(""),d(!1))},[n,f]),u?i.jsxs("div",{className:l,children:[i.jsx("div",{className:"mb-2 rounded bg-red-50 px-3 py-1.5 text-xs text-red-600 dark:bg-red-900/20 dark:text-red-400",children:"Mermaid render error"}),i.jsx("pre",{className:"overflow-x-auto rounded-xl border border-gray-200 bg-gray-50 p-4 text-xs text-gray-800 dark:border-gray-700 dark:bg-gray-950 dark:text-gray-100",children:i.jsx("code",{children:n})})]}):c?i.jsx("div",{className:`flex items-center justify-center py-8 ${l??""}`,children:i.jsx("div",{className:"h-5 w-5 animate-spin rounded-full border-2 border-gray-300 border-t-blue-500"})}):i.jsx("div",{className:`mermaid-preview overflow-x-auto ${l??""}`,dangerouslySetInnerHTML:{__html:s}})});export{M as MermaidPreview};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as S,a as g,r as M,j as d,S as k}from"./index-
|
|
1
|
+
import{u as S,a as g,r as M,j as d,S as k}from"./index-BM36Njjd.js";const y=8,C=24,j=20,p=280;function T(l,n,s,f){const e=new Map,r=l.length;if(r===0)return e;for(let u=0;u<r;u++){const h=2*Math.PI*u/r-Math.PI/2;e.set(l[u].id,{x:n+f*Math.cos(h),y:s+f*Math.sin(h)})}return e}function w(l,n){if(n<=0)return y;const s=Math.min(l/n,1);return y+s*(C-y)}function E(){const{t:l}=S(),n=g(t=>t.agents),s=g(t=>t.links),f=g(t=>t.theme),[e,r]=M.useState(null),u=f==="dark",{topAgents:h,positions:x,maxToolCount:I}=M.useMemo(()=>{const t=Array.from(n.values()).toSorted((i,m)=>m.toolCallCount-i.toolCallCount).slice(0,j),o=Math.max(1,...t.map(i=>i.toolCallCount)),a=Math.min(80,Math.max(40,t.length*8)),c=T(t,p/2,p/2,a);return{topAgents:t,positions:c,maxToolCount:o}},[n]),v=M.useMemo(()=>{if(!e)return new Set;const t=new Set;for(const o of s)(o.sourceId===e||o.targetId===e)&&t.add(`${o.sourceId}-${o.targetId}`);return t},[s,e]);return h.length===0&&s.length===0?d.jsx("div",{className:"flex h-48 items-center justify-center text-sm text-gray-500 dark:text-gray-400",children:l("empty.noRelationData")}):d.jsxs("svg",{width:"100%",height:200,viewBox:`0 0 ${p} ${p}`,className:"overflow-visible",onMouseLeave:()=>r(null),children:[s.filter(t=>x.has(t.sourceId)&&x.has(t.targetId)).map(t=>{const o=x.get(t.sourceId),a=x.get(t.targetId),c=`${t.sourceId}-${t.targetId}`,i=v.has(c),m=Math.max(1,t.strength*3);return d.jsx("line",{x1:o.x,y1:o.y,x2:a.x,y2:a.y,stroke:i?"#3b82f6":"rgba(107,114,128,0.4)",strokeWidth:m},c)}),h.map(t=>{const o=x.get(t.id);if(!o)return null;const a=w(t.toolCallCount,I),c=e===t.id,i=c?1.2:1,m=k[t.status];return d.jsxs("g",{onMouseEnter:()=>r(t.id),onMouseLeave:()=>r(null),children:[d.jsx("circle",{cx:o.x,cy:o.y,r:a*i,fill:m,stroke:c?"#1e40af":"transparent",strokeWidth:2}),d.jsx("text",{x:o.x,y:o.y+a+10,textAnchor:"middle",fontSize:9,fill:u?"#e2e8f0":"#374151",children:t.name.length>8?`${t.name.slice(0,6)}…`:t.name})]},t.id)})]})}export{E as NetworkGraph};
|