@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.
Files changed (66) hide show
  1. package/README.en.md +65 -67
  2. package/README.md +71 -73
  3. package/dist/assets/{ActivityHeatmap-CpbyUHuI.js → ActivityHeatmap-BlG6TEIG.js} +1 -1
  4. package/dist/assets/{CostPieChart-B5trzi6Y.js → CostPieChart-D4o59uFg.js} +1 -1
  5. package/dist/assets/{MermaidPreview-DVwL74Xq.js → MermaidPreview-Bo4bFeLM.js} +2 -2
  6. package/dist/assets/{NetworkGraph-z2P9KN4Z.js → NetworkGraph-DAxd70Ot.js} +1 -1
  7. package/dist/assets/{TokenLineChart-CtdYtM77.js → TokenLineChart-QvGjZ5XD.js} +1 -1
  8. package/dist/assets/{_baseUniq-Cfyl88t7.js → _baseUniq-DRat-WU9.js} +1 -1
  9. package/dist/assets/{architectureDiagram-Q4EWVU46-BH4JuRIL.js → architectureDiagram-Q4EWVU46-Dam1wHtP.js} +1 -1
  10. package/dist/assets/{blockDiagram-DXYQGD6D-hln9zfg2.js → blockDiagram-DXYQGD6D-87SmokPS.js} +1 -1
  11. package/dist/assets/{c4Diagram-AHTNJAMY-BTTMG0uV.js → c4Diagram-AHTNJAMY-SA74A_zy.js} +1 -1
  12. package/dist/assets/channel-C_oayA7l.js +1 -0
  13. package/dist/assets/{chunk-4BX2VUAB-D4m1C-km.js → chunk-4BX2VUAB-CYJz2DSi.js} +1 -1
  14. package/dist/assets/{chunk-4TB4RGXK-NUtEh5_d.js → chunk-4TB4RGXK-OHlm04OB.js} +1 -1
  15. package/dist/assets/{chunk-55IACEB6-CS1nCNQv.js → chunk-55IACEB6-DHgQriFa.js} +1 -1
  16. package/dist/assets/{chunk-EDXVE4YY-Cvv0gmo5.js → chunk-EDXVE4YY-4tou8hIT.js} +1 -1
  17. package/dist/assets/{chunk-FMBD7UC4-SY8kEFHe.js → chunk-FMBD7UC4-D1mp91VX.js} +1 -1
  18. package/dist/assets/{chunk-OYMX7WX6-DOihdHEB.js → chunk-OYMX7WX6-VjxJKMyL.js} +1 -1
  19. package/dist/assets/{chunk-QZHKN3VN-DJbMoSaM.js → chunk-QZHKN3VN-DZ_7FrEE.js} +1 -1
  20. package/dist/assets/{chunk-YZCP3GAM-BHFePYUW.js → chunk-YZCP3GAM-D8Y0i_ac.js} +1 -1
  21. package/dist/assets/classDiagram-6PBFFD2Q-CHmtlZlS.js +1 -0
  22. package/dist/assets/classDiagram-v2-HSJHXN6E-CHmtlZlS.js +1 -0
  23. package/dist/assets/clone-BH-2mHSm.js +1 -0
  24. package/dist/assets/{cose-bilkent-S5V4N54A-DTcL_GxP.js → cose-bilkent-S5V4N54A-CZb5xZ4J.js} +1 -1
  25. package/dist/assets/{dagre-KV5264BT-Cfi_YL3t.js → dagre-KV5264BT-llQbGrkV.js} +1 -1
  26. package/dist/assets/{diagram-5BDNPKRD-BV8q08QE.js → diagram-5BDNPKRD-CIF7LIcb.js} +1 -1
  27. package/dist/assets/{diagram-G4DWMVQ6-CDgJFsQl.js → diagram-G4DWMVQ6-BO3HzPNi.js} +1 -1
  28. package/dist/assets/{diagram-MMDJMWI5-Q3ZEfdCt.js → diagram-MMDJMWI5-B-DwUodZ.js} +1 -1
  29. package/dist/assets/{diagram-TYMM5635-C2z3B-fD.js → diagram-TYMM5635-B2f50Yex.js} +1 -1
  30. package/dist/assets/{erDiagram-SMLLAGMA-CjEKcyub.js → erDiagram-SMLLAGMA-fyrMYhbD.js} +1 -1
  31. package/dist/assets/{flowDiagram-DWJPFMVM-DvGsXBp5.js → flowDiagram-DWJPFMVM-DtBmosa7.js} +1 -1
  32. package/dist/assets/{ganttDiagram-T4ZO3ILL-3haulWDa.js → ganttDiagram-T4ZO3ILL-CKJV0Qhb.js} +1 -1
  33. package/dist/assets/{generateCategoricalChart-Iesv4F0v.js → generateCategoricalChart-CReUs1iy.js} +1 -1
  34. package/dist/assets/{gitGraphDiagram-UUTBAWPF-DI3XEPsp.js → gitGraphDiagram-UUTBAWPF-CTPtT2N-.js} +1 -1
  35. package/dist/assets/{graph-CR0H-iuK.js → graph-B6mNtAkv.js} +1 -1
  36. package/dist/assets/index-BM36Njjd.js +648 -0
  37. package/dist/assets/index-DZw6DpsO.css +1 -0
  38. package/dist/assets/{infoDiagram-42DDH7IO-BU4iJwo2.js → infoDiagram-42DDH7IO-Dw2RgF5V.js} +1 -1
  39. package/dist/assets/{ishikawaDiagram-UXIWVN3A-DPcK3o-A.js → ishikawaDiagram-UXIWVN3A-D4S7TTFo.js} +1 -1
  40. package/dist/assets/{journeyDiagram-VCZTEJTY-DsGoAyHn.js → journeyDiagram-VCZTEJTY-gOHXyvhy.js} +1 -1
  41. package/dist/assets/{kanban-definition-6JOO6SKY-E_nCTqRL.js → kanban-definition-6JOO6SKY-C_B1kzQ7.js} +1 -1
  42. package/dist/assets/{layout-BVLVzKLe.js → layout-CUV8e6Hx.js} +1 -1
  43. package/dist/assets/{mermaid.core-jP0z6xy9.js → mermaid.core-dRlZdQYC.js} +4 -4
  44. package/dist/assets/{min-DM3H04Br.js → min-BV0gHYGn.js} +1 -1
  45. package/dist/assets/{mindmap-definition-QFDTVHPH-l-AQ6ipE.js → mindmap-definition-QFDTVHPH-DmOYOkpz.js} +1 -1
  46. package/dist/assets/{pieDiagram-DEJITSTG-BNmdpIZx.js → pieDiagram-DEJITSTG-DTMN27yG.js} +1 -1
  47. package/dist/assets/{quadrantDiagram-34T5L4WZ-BbdqEFyh.js → quadrantDiagram-34T5L4WZ-C42bzUym.js} +1 -1
  48. package/dist/assets/{requirementDiagram-MS252O5E-Ct720Lua.js → requirementDiagram-MS252O5E-DY-KWhL-.js} +1 -1
  49. package/dist/assets/{sankeyDiagram-XADWPNL6-DpjKmq36.js → sankeyDiagram-XADWPNL6-DjoxCO1x.js} +1 -1
  50. package/dist/assets/{sequenceDiagram-FGHM5R23-BzvinwHi.js → sequenceDiagram-FGHM5R23-BShjIV0g.js} +1 -1
  51. package/dist/assets/{stateDiagram-FHFEXIEX-yxEfTB6b.js → stateDiagram-FHFEXIEX-BjVNYfME.js} +1 -1
  52. package/dist/assets/stateDiagram-v2-QKLJ7IA2-DfrM5x7e.js +1 -0
  53. package/dist/assets/{timeline-definition-GMOUNBTQ-DOgN4L59.js → timeline-definition-GMOUNBTQ-CjIleoen.js} +1 -1
  54. package/dist/assets/{vennDiagram-DHZGUBPP-BJ46DJt9.js → vennDiagram-DHZGUBPP-B9QHEahX.js} +1 -1
  55. package/dist/assets/{wardley-RL74JXVD-DJAOlp-t.js → wardley-RL74JXVD-tGzDRBX-.js} +1 -1
  56. package/dist/assets/{wardleyDiagram-NUSXRM2D-CBarkW4L.js → wardleyDiagram-NUSXRM2D-Drekvj5q.js} +1 -1
  57. package/dist/assets/{xychartDiagram-5P7HB3ND-eAxAYPxZ.js → xychartDiagram-5P7HB3ND-DvMnaSfN.js} +1 -1
  58. package/dist/index.html +2 -2
  59. package/package.json +1 -1
  60. package/dist/assets/channel-CHl85yQ2.js +0 -1
  61. package/dist/assets/classDiagram-6PBFFD2Q-BCZnw_KH.js +0 -1
  62. package/dist/assets/classDiagram-v2-HSJHXN6E-BCZnw_KH.js +0 -1
  63. package/dist/assets/clone-BOIkJ9Nz.js +0 -1
  64. package/dist/assets/index-BjylP9G5.js +0 -648
  65. package/dist/assets/index-CBGZeKdy.css +0 -1
  66. 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
- ## Features
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
+ ![Workflow](./assets/Workflow.png)
32
+
33
+ ![A2UI](./assets/A2UI.png)
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 (`~/.openclaw/office-cache/chat/`), stable across browsers, devices, and refreshes
31
- - Tool call visualization — inline Agent tool call status (calling/completed), collapsible for detail viewing
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
+ ![chat-a2ui](./assets/chat-a2ui.png)
35
58
 
36
59
  ### Console
37
60
 
38
61
  Full system management interface with dedicated pages:
39
62
 
40
- | Page | Features |
41
- | ------------- | -------------------------------------------------------------------------------------------------------------- |
42
- | **Dashboard** | Overview stats, alert banners, Channel/Skill overview, quick navigation |
43
- | **Agents** | Agent list/create/delete, detail tabs (Overview, Channels, Cron, Skills, Tools, Files) |
44
- | **Channels** | Channel cards, configuration dialogs, stats, WhatsApp QR binding |
45
- | **Skills** | Skill marketplace, install options, skill detail dialogs |
46
- | **Skill Workbench** ✨ | **Skills development platform** — nested routes (list / create / detail), AI-assisted creation and editing via side chat, automated FLOWCHART.md generation with pure-Markdown multi-chart preview |
47
- | **Cron** | Scheduled task management and statistics |
48
- | **Settings** | Provider management (add/edit/model editor), appearance, Gateway, developer, advanced, about, update |
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
  ![console-dashboard](./assets/console-dashboard.png)
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
- - **pnpm** (package manager)
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 Token Auto-Detection
125
+ ### Gateway Authentication
119
126
 
120
- If [OpenClaw](https://github.com/openclaw/openclaw) is installed locally, the Gateway auth token is **automatically detected** from `~/.openclaw/openclaw.json` no manual configuration needed.
127
+ After launching, the browser displays the OpenClaw Office **login screen**, where you need to enter your Gateway credentials to authenticate:
121
128
 
122
- You can also provide the token explicitly:
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
- ```bash
125
- openclaw-office --token <your-gateway-token>
126
- # or via environment variable
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. Configure Gateway Connection
221
-
222
- Create a `.env.local` file (gitignored) with your Gateway connection details:
225
+ ### 2. Start the Gateway
223
226
 
224
- ```bash
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
- ### 4. Start the Dev Server
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 | Default | Description |
256
- | ----------------------- | ------------------------------------- | ---------------------- | ------------------------------------ |
257
- | `VITE_GATEWAY_URL` | No | `ws://localhost:18789` | Gateway WebSocket address |
258
- | `VITE_GATEWAY_WS_PATH` | No | `/gateway-ws` | Browser-side reverse proxy WS path |
259
- | `VITE_GATEWAY_TOKEN` | Yes (when connecting to real Gateway) | — | Gateway auth token |
260
- | `VITE_MOCK` | No | `false` | Enable mock mode (no Gateway needed) |
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, while reusing the same response for token aggregation
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 系统的可视化监控与管理前端。它通过等距投影(Isometric)风格的虚拟办公室场景,实时展示 Agent 的工作状态、协作链路、工具调用和资源消耗,同时提供完整的控制台管理界面和 Chat 对话工作区。
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
+ ![Workflow](./assets/Workflow.png)
32
+
33
+ ![A2UI](./assets/A2UI.png)
14
34
 
15
35
  ### 虚拟办公室
16
36
 
@@ -27,25 +47,28 @@
27
47
  - 顶部导航可直达的独立 Chat 工作区(`/#/chat`),底部停靠栏保留为快捷入口
28
48
  - 会话管理 — 创建新会话、切换历史会话、按 Agent 路由,支持多 Agent 并行对话
29
49
  - 实时流式转录 — 流式展示 AI 回复,支持中止/重发
30
- - 聊天历史持久化 — 服务端按天分片缓存聊天记录(`~/.openclaw/office-cache/chat/`),跨浏览器/设备/刷新稳定可见
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
+ ![chat-a2ui](./assets/chat-a2ui.png)
35
58
 
36
59
  ### 控制台
37
60
 
38
61
  完整的系统管理界面:
39
62
 
40
- | 页面 | 功能 |
41
- | ------------- | -------------------------------------------------------------------------------------------------------------------- |
42
- | **Dashboard** | 概览统计卡片、告警横幅、Channel/Skill 概览、快捷导航 |
43
- | **Agents** | Agent 列表/创建/删除,详情多 Tab(Overview/Channels/Cron/Skills/Tools/Files) |
44
- | **Channels** | 渠道卡片、配置对话框、统计、WhatsApp QR 绑定流程 |
45
- | **Skills** | 技能市场、安装选项、技能详情 |
46
- | **Skill Workbench** ✨ | **Skills 开发平台** — 三页面(列表 / 创建 / 详情)嵌套路由,聊天侧边栏驱动 AI 协作创建和修改 Skill,FLOWCHART.md 自动生成并提供纯 Markdown 多图预览 |
47
- | **Cron** | 定时任务管理和统计 |
48
- | **Settings** | Provider 管理(添加/编辑/模型编辑器)、外观/Gateway/开发者/高级/关于/更新 |
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
  ![console-dashboard](./assets/console-dashboard.png)
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
- - **pnpm**(包管理器)
99
- - **[OpenClaw](https://github.com/openclaw/openclaw)** 已安装并配置
106
+ - **[OpenClaw](https://github.com/openclaw/openclaw)** 已安装并运行
100
107
 
101
- OpenClaw Office 是一个配套前端,连接到正在运行的 OpenClaw Gateway。它**不会**启动或管理 Gateway
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 Token 自动检测
125
+ ### Gateway 认证
119
126
 
120
- 如果本地已安装 [OpenClaw](https://github.com/openclaw/openclaw),Gateway 认证 token 会从 `~/.openclaw/openclaw.json` **自动读取**,无需手动配置。
127
+ 启动后,浏览器会显示 OpenClaw Office 的**登录界面**,需要你输入 Gateway 连接信息进行认证:
121
128
 
122
- 也可以手动指定 token:
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
- ```bash
125
- openclaw-office --token <你的-gateway-token>
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 注册为系统服务后,它会在开机 / 登录时自动启动,无需手动运行命令。支持 macOS(launchd)和 Linux(systemd --user)。
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. 配置 Gateway 连接
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 在配置的地址上运行(默认 `localhost:18789`)。可通过以下方式启动:
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
- ### 4. 启动开发服务器
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` | 否 | `ws://localhost:18789` | Gateway WebSocket 地址 |
258
- | `VITE_GATEWAY_WS_PATH` | 否 | `/gateway-ws` | 浏览器侧反向代理 WS 路径 |
259
- | `VITE_GATEWAY_TOKEN` | 是(连接真实 Gateway 时) | — | Gateway 认证 token |
260
- | `VITE_MOCK` | 否 | `false` | 启用 Mock 模式(不需要 Gateway) |
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 漂移,并复用同一响应构建 token 统计
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
- <img src="./assets/weixin.png" alt="微信养虾技术交流群二维码" width="300" />
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-BjylP9G5.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
+ 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-BjylP9G5.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-Iesv4F0v.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.
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-jP0z6xy9.js","assets/index-BjylP9G5.js","assets/index-CBGZeKdy.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-BjylP9G5.js";let g=null,m=null,v=null,h=0,y=Promise.resolve();async function k(){return m||(m=j(()=>import("./mermaid.core-jP0z6xy9.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
+ 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-BjylP9G5.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};
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};