maestro-agent 0.0.1 → 0.0.3
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.md +316 -2
- package/bin/maestro.ts +5 -0
- package/dist/maestro +0 -0
- package/dist/web/apple-touch-icon.png +0 -0
- package/dist/web/assets/Connections-BMA04Ycg.js +11 -0
- package/dist/web/assets/GanttView-DXjh0gxg.js +49 -0
- package/dist/web/assets/Home-Ct3Ho0Qt.js +1 -0
- package/dist/web/assets/HooksCrons--0kyVJcR.js +11 -0
- package/dist/web/assets/ProjectDetail-B_IqEpFu.js +1 -0
- package/dist/web/assets/Roles-D1tIQzto.js +24 -0
- package/dist/web/assets/Settings-yts4LUmH.js +11 -0
- package/dist/web/assets/Skills-DbuNLjIV.js +12 -0
- package/dist/web/assets/Wizard-vJol8-Y4.js +11 -0
- package/dist/web/assets/WorkspaceChat-DrsLs4m2.js +56 -0
- package/dist/web/assets/WorkspaceDashboard-B9vgrd2Z.js +6 -0
- package/dist/web/assets/WorkspaceNew-DoNGYHCG.js +1 -0
- package/dist/web/assets/WorkspaceProjects-DDp3mUse.js +6 -0
- package/dist/web/assets/WorkspaceSchedules-BTjmCbYG.js +1 -0
- package/dist/web/assets/WorkspaceTasks-mPU-bhKR.js +41 -0
- package/dist/web/assets/activity-CIA8bIA4.js +6 -0
- package/dist/web/assets/addon-fit-BlxrFPDK.js +1 -0
- package/dist/web/assets/arrow-right-S7ID7nDp.js +6 -0
- package/dist/web/assets/badge-DDTUzWIi.js +1 -0
- package/dist/web/assets/circle-check-B3P1qK0Z.js +6 -0
- package/dist/web/assets/clock-f9aYZox0.js +6 -0
- package/dist/web/assets/index-BRo4Du_s.js +11 -0
- package/dist/web/assets/index-C7kx39S9.js +196 -0
- package/dist/web/assets/index-D6LSdZea.css +1 -0
- package/dist/web/assets/plus-BHnOxbns.js +6 -0
- package/dist/web/assets/refresh-cw-BWX04Hg3.js +6 -0
- package/dist/web/assets/save-BLbb_9xz.js +6 -0
- package/dist/web/assets/sparkles-CDr6Dw1e.js +6 -0
- package/dist/web/assets/trash-2-9-ThEdey.js +6 -0
- package/dist/web/assets/useEventStream-DXt2Hmei.js +1 -0
- package/dist/web/assets/x-DVdKPXXy.js +6 -0
- package/dist/web/assets/xterm-DYP7pi_n.css +32 -0
- package/dist/web/assets/xterm-DlVFs1Kw.js +9 -0
- package/dist/web/favicon-512.png +0 -0
- package/dist/web/favicon.png +0 -0
- package/dist/web/index.html +15 -0
- package/package.json +49 -6
- package/src/api/agents.ts +76 -0
- package/src/api/audit.ts +19 -0
- package/src/api/autopilot.ts +73 -0
- package/src/api/chat.ts +801 -0
- package/src/api/chief.ts +84 -0
- package/src/api/config.ts +39 -0
- package/src/api/gantt.ts +72 -0
- package/src/api/hooks.ts +54 -0
- package/src/api/inbox.ts +125 -0
- package/src/api/lark.ts +32 -0
- package/src/api/memory.ts +37 -0
- package/src/api/ops.ts +89 -0
- package/src/api/projects.ts +105 -0
- package/src/api/roles.ts +123 -0
- package/src/api/runtimes.ts +62 -0
- package/src/api/scheduled-tasks.ts +203 -0
- package/src/api/sessions.ts +479 -0
- package/src/api/skills.ts +386 -0
- package/src/api/tasks.ts +457 -0
- package/src/api/telegram.ts +94 -0
- package/src/api/templates.ts +36 -0
- package/src/api/webhooks.ts +20 -0
- package/src/api/workspaces.ts +150 -0
- package/src/bridges/lark/index.ts +213 -0
- package/src/bridges/telegram/index.ts +273 -0
- package/src/bridges/telegram/polling.ts +185 -0
- package/src/chat/index.ts +86 -0
- package/src/chief/index.ts +461 -0
- package/src/core/cli.ts +333 -0
- package/src/core/db.ts +53 -0
- package/src/core/event-bus.ts +33 -0
- package/src/core/index.ts +6 -0
- package/src/core/migrations.ts +303 -0
- package/src/core/router.ts +69 -0
- package/src/core/schema.sql +232 -0
- package/src/core/server.ts +308 -0
- package/src/core/validate.ts +22 -0
- package/src/discovery/index.ts +194 -0
- package/src/gateway/adapters/telegram.ts +148 -0
- package/src/gateway/index.ts +31 -0
- package/src/gateway/manager.ts +176 -0
- package/src/gateway/types.ts +77 -0
- package/src/inbox/index.ts +500 -0
- package/src/ops/artifact-sync.ts +65 -0
- package/src/ops/autopilot.ts +338 -0
- package/src/ops/gc.ts +252 -0
- package/src/ops/index.ts +226 -0
- package/src/ops/project-serial.ts +52 -0
- package/src/ops/role-dispatch.ts +111 -0
- package/src/ops/runtime-scheduler.ts +447 -0
- package/src/ops/task-blocking.ts +65 -0
- package/src/ops/task-deps.ts +37 -0
- package/src/ops/task-workspace.ts +60 -0
- package/src/roles/index.ts +258 -0
- package/src/roles/prompt-assembler.ts +85 -0
- package/src/roles/workspace-role.ts +155 -0
- package/src/scheduler/index.ts +461 -0
- package/src/session/output-parser.ts +75 -0
- package/src/session/realtime-parser.ts +40 -0
- package/src/skills/builtin.ts +155 -0
- package/src/skills/skill-extractor.ts +452 -0
- package/src/skills/skill-md.ts +282 -0
- package/src/transport/http-api.ts +75 -0
- package/src/transport/index.ts +4 -0
- package/src/transport/local-pty.ts +119 -0
- package/src/transport/ssh.ts +176 -0
- package/src/transport/types.ts +20 -0
- package/src/workflows/index.ts +231 -0
- package/index.js +0 -1
- package/maestro-agent-0.0.1.tgz +0 -0
package/README.md
CHANGED
|
@@ -1,3 +1,317 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Maestro
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> The Conductor for AI Agents — 多智能体编排与执行系统
|
|
4
|
+
|
|
5
|
+
Maestro 是一个本地优先的多 AI Agent 协作平台。它像一个乐团指挥,将多个 AI 编程助手(Claude Code、Codex、Gemini、Kiro、Aider 等)组织成一支协作团队,通过角色分工、任务调度和自动化流水线,让它们协同完成复杂的软件工程任务。
|
|
6
|
+
|
|
7
|
+
## 设计理念
|
|
8
|
+
|
|
9
|
+
### 角色优先,而非 Agent 优先
|
|
10
|
+
|
|
11
|
+
传统的多 Agent 系统直接管理 Agent 实例。Maestro 引入了 **Role(角色)** 作为中间抽象层:
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
Task → Role → Agent → Runtime
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
- **Task** 描述要做什么(需求、验收标准)
|
|
18
|
+
- **Role** 描述谁来做(能力、职责、提示词)
|
|
19
|
+
- **Agent** 是执行者(绑定到某个 Role 的运行实例)
|
|
20
|
+
- **Runtime** 是底层引擎(claude-code、codex、gemini 等 CLI 工具)
|
|
21
|
+
|
|
22
|
+
这意味着你可以定义一个 `engineer` 角色,背后可以是 Claude Code 也可以是 Codex —— 系统根据可用性和能力自动调度。角色"永远在线",Agent 可以来去自如。
|
|
23
|
+
|
|
24
|
+
### 本地运行,零依赖外部服务
|
|
25
|
+
|
|
26
|
+
Maestro Hub 运行在你的开发机上,使用 SQLite 存储,不需要 Docker、Redis 或任何云服务。一个 `maestro start` 就能启动整个系统。
|
|
27
|
+
|
|
28
|
+
### 自动发现,即插即用
|
|
29
|
+
|
|
30
|
+
启动时 Maestro 会扫描 PATH,自动发现已安装的 AI CLI 工具并注册为可用 Runtime。无需手动配置每个 Agent 的连接方式。
|
|
31
|
+
|
|
32
|
+
### 渐进式自动化
|
|
33
|
+
|
|
34
|
+
从手动分配任务开始,逐步开启 Autopilot:
|
|
35
|
+
1. 手动创建任务、手动分配 → 熟悉系统
|
|
36
|
+
2. 开启自动调度 → 系统自动将任务分配给空闲 Agent
|
|
37
|
+
3. 开启 Chief → AI 项目经理自动拆解需求、创建任务、监控进度
|
|
38
|
+
4. 配置 Cron/Hook → 事件驱动的全自动流水线
|
|
39
|
+
|
|
40
|
+
## 核心概念
|
|
41
|
+
|
|
42
|
+
### Workspace(工作区)
|
|
43
|
+
|
|
44
|
+
顶层组织单元,代表一个目标或项目群。包含多个 Project。
|
|
45
|
+
|
|
46
|
+
### Project(项目)
|
|
47
|
+
|
|
48
|
+
属于某个 Workspace,有自己的工作目录和工作流定义。
|
|
49
|
+
|
|
50
|
+
### Task(任务)
|
|
51
|
+
|
|
52
|
+
最小工作单元。具有:
|
|
53
|
+
- 状态流转:`open → claimed → review → done`
|
|
54
|
+
- 优先级(P0-P3)
|
|
55
|
+
- 依赖关系(DAG)
|
|
56
|
+
- 验收标准(`done_when`)
|
|
57
|
+
- 讨论线程
|
|
58
|
+
|
|
59
|
+
### Role(角色)
|
|
60
|
+
|
|
61
|
+
逻辑上的职能定义,用 Markdown 文件描述:
|
|
62
|
+
|
|
63
|
+
```markdown
|
|
64
|
+
---
|
|
65
|
+
name: engineer
|
|
66
|
+
extends: base/agent.md
|
|
67
|
+
capabilities: [code, test, debug, deploy]
|
|
68
|
+
headcount: 3
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
你是一名软件工程师,负责编写、测试和交付代码...
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
内置角色:
|
|
75
|
+
| 角色 | 职责 |
|
|
76
|
+
|------|------|
|
|
77
|
+
| `engineer` | 编码、测试、部署 |
|
|
78
|
+
| `researcher` | 调研、分析、方案设计 |
|
|
79
|
+
| `writer` | 文档、内容创作 |
|
|
80
|
+
| `critic` | Code Review、QA、测试 |
|
|
81
|
+
| `chief` | 自主项目管理(AI PM) |
|
|
82
|
+
|
|
83
|
+
### Agent(代理)
|
|
84
|
+
|
|
85
|
+
绑定到 Role 的执行实例。一个 Role 可以有多个 Agent(水平扩展)。
|
|
86
|
+
|
|
87
|
+
### Runtime(运行时)
|
|
88
|
+
|
|
89
|
+
底层 AI CLI 工具。支持自动发现:
|
|
90
|
+
|
|
91
|
+
| Runtime | CLI |
|
|
92
|
+
|---------|-----|
|
|
93
|
+
| claude-code | `claude` |
|
|
94
|
+
| codex | `codex` |
|
|
95
|
+
| gemini | `gemini` |
|
|
96
|
+
| opencode | `opencode` |
|
|
97
|
+
| aider | `aider` |
|
|
98
|
+
| kiro | `kiro` |
|
|
99
|
+
| cursor | `cursor` |
|
|
100
|
+
| 更多... | 持续扩展 |
|
|
101
|
+
|
|
102
|
+
## 架构概览
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
┌─────────────────────────────────────────────────────┐
|
|
106
|
+
│ Web Dashboard │
|
|
107
|
+
│ (React + Tailwind + xterm.js) │
|
|
108
|
+
└──────────────────────┬──────────────────────────────┘
|
|
109
|
+
│ HTTP / WebSocket
|
|
110
|
+
┌──────────────────────▼──────────────────────────────┐
|
|
111
|
+
│ Hub Server │
|
|
112
|
+
│ ┌─────────┐ ┌──────────┐ ┌───────────┐ ┌───────┐ │
|
|
113
|
+
│ │ REST API│ │ EventBus │ │ Autopilot │ │ Chief │ │
|
|
114
|
+
│ └─────────┘ └──────────┘ └───────────┘ └───────┘ │
|
|
115
|
+
│ ┌──────────────┐ ┌────────────┐ ┌──────────────┐ │
|
|
116
|
+
│ │Role Dispatch │ │ Workflows │ │ Skills │ │
|
|
117
|
+
│ └──────────────┘ └────────────┘ └──────────────┘ │
|
|
118
|
+
│ ┌──────────────────────────────────────────────┐ │
|
|
119
|
+
│ │ SQLite (WAL mode) │ │
|
|
120
|
+
│ └──────────────────────────────────────────────┘ │
|
|
121
|
+
└──────────────────────┬──────────────────────────────┘
|
|
122
|
+
│ Transport (PTY / SSH / HTTP)
|
|
123
|
+
┌──────────────────────▼──────────────────────────────┐
|
|
124
|
+
│ Agent Runtimes │
|
|
125
|
+
│ ┌─────────┐ ┌───────┐ ┌────────┐ ┌─────────────┐ │
|
|
126
|
+
│ │ Claude │ │ Codex │ │ Gemini │ │ OpenCode... │ │
|
|
127
|
+
│ └─────────┘ └───────┘ └────────┘ └─────────────┘ │
|
|
128
|
+
└─────────────────────────────────────────────────────┘
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## 使用方式
|
|
132
|
+
|
|
133
|
+
### CLI 命令
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
maestro init # 初始化 .hub/ 目录
|
|
137
|
+
maestro start # 启动 Hub 服务
|
|
138
|
+
maestro start --daemon # 后台守护进程模式
|
|
139
|
+
maestro start --port 8080 # 指定端口
|
|
140
|
+
maestro stop # 停止守护进程
|
|
141
|
+
maestro doctor # 系统诊断(检查 DB、运行时、角色等)
|
|
142
|
+
maestro inbox # Agent 收件箱操作
|
|
143
|
+
maestro chat # 工作区消息通信
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Web 控制台
|
|
147
|
+
|
|
148
|
+
启动 Hub 后访问 `http://localhost:7423`,提供:
|
|
149
|
+
|
|
150
|
+
- **看板视图** — Kanban 风格的任务面板
|
|
151
|
+
- **甘特图** — 任务时间线与依赖关系可视化
|
|
152
|
+
- **实时终端** — 通过 xterm.js 查看 Agent 的实时输出
|
|
153
|
+
- **聊天面板** — 与 Agent 实时对话,支持 @mention
|
|
154
|
+
- **运行时管理** — 查看和管理已连接的 Agent Runtime
|
|
155
|
+
- **技能库** — 浏览和管理自动提取的可复用技能
|
|
156
|
+
|
|
157
|
+
### API 驱动
|
|
158
|
+
|
|
159
|
+
所有功能都通过 REST API 暴露,方便集成到你自己的工具链:
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
# 创建任务
|
|
163
|
+
curl -X POST http://localhost:7423/api/tasks \
|
|
164
|
+
-H "Content-Type: application/json" \
|
|
165
|
+
-d '{
|
|
166
|
+
"title": "实现用户认证模块",
|
|
167
|
+
"role": "engineer",
|
|
168
|
+
"priority": 1,
|
|
169
|
+
"done_when": "JWT 认证中间件通过所有测试"
|
|
170
|
+
}'
|
|
171
|
+
|
|
172
|
+
# 查看所有 Agent
|
|
173
|
+
curl http://localhost:7423/api/agents
|
|
174
|
+
|
|
175
|
+
# 查看任务状态
|
|
176
|
+
curl http://localhost:7423/api/tasks
|
|
177
|
+
|
|
178
|
+
# WebSocket 事件流
|
|
179
|
+
wscat -c ws://localhost:7423/space/events
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### 实时事件
|
|
183
|
+
|
|
184
|
+
通过 WebSocket 订阅系统事件,支持 glob 模式过滤:
|
|
185
|
+
|
|
186
|
+
```javascript
|
|
187
|
+
const ws = new WebSocket('ws://localhost:7423/space/events');
|
|
188
|
+
ws.send(JSON.stringify({ subscribe: 'task.*' }));
|
|
189
|
+
// 收到: task.created, task.claimed, task.completed ...
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Autopilot(自动驾驶)
|
|
193
|
+
|
|
194
|
+
Autopilot 是 Maestro 的自动化引擎,统一管理:
|
|
195
|
+
|
|
196
|
+
| 功能 | 说明 |
|
|
197
|
+
|------|------|
|
|
198
|
+
| 自动调度 | 将 open 状态的任务自动分配给匹配角色的空闲 Agent |
|
|
199
|
+
| Cron 任务 | 定时触发的自动化操作 |
|
|
200
|
+
| 计划任务 | 按计划自动创建任务实例 |
|
|
201
|
+
| Webhook 路由 | 将外部事件(GitHub、Linear 等)路由到 Hook 处理器 |
|
|
202
|
+
| 技能提取 | 从完成的会话中自动提取可复用的操作模式 |
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
# 通过 API 启动 Autopilot
|
|
206
|
+
curl -X POST http://localhost:7423/api/autopilot/start
|
|
207
|
+
|
|
208
|
+
# 查看状态
|
|
209
|
+
curl http://localhost:7423/api/autopilot/status
|
|
210
|
+
|
|
211
|
+
# 手动触发一次调度
|
|
212
|
+
curl -X POST http://localhost:7423/api/autopilot/tick
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Chief(AI 项目经理)
|
|
216
|
+
|
|
217
|
+
Chief 是一个可选的自主 Agent,充当 AI 项目经理的角色:
|
|
218
|
+
|
|
219
|
+
- 定期审视全局状态(工作区、项目、任务、Agent 负载)
|
|
220
|
+
- 自动拆解高层需求为具体任务
|
|
221
|
+
- 发现阻塞并尝试解决
|
|
222
|
+
- 调整 Agent 编制(扩缩容)
|
|
223
|
+
- 向人类升级无法自主决策的问题
|
|
224
|
+
|
|
225
|
+
Chief 的所有重大决策(创建项目、调整角色)都会发送到 Inbox 等待人类审批,不会擅自行动。
|
|
226
|
+
|
|
227
|
+
配置:
|
|
228
|
+
```bash
|
|
229
|
+
export ANTHROPIC_API_KEY=sk-ant-...
|
|
230
|
+
# 或通过 API 配置
|
|
231
|
+
curl -X PUT http://localhost:7423/api/config \
|
|
232
|
+
-H "Content-Type: application/json" \
|
|
233
|
+
-d '{"chief_model": "claude-sonnet-4-6", "chief_interval_min": 15}'
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## 工作流引擎
|
|
237
|
+
|
|
238
|
+
任务状态流转通过可定制的状态机管理:
|
|
239
|
+
|
|
240
|
+
```
|
|
241
|
+
open → claimed → review → done
|
|
242
|
+
↓ ↓ ↓
|
|
243
|
+
└───────┴────→ blocked
|
|
244
|
+
└───────┴────→ abandoned
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
你可以为不同项目定义不同的工作流:
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
curl -X POST http://localhost:7423/api/workflows \
|
|
251
|
+
-H "Content-Type: application/json" \
|
|
252
|
+
-d '{
|
|
253
|
+
"name": "strict-review",
|
|
254
|
+
"scope": "project",
|
|
255
|
+
"scope_id": "proj_xxx",
|
|
256
|
+
"statuses": ["open", "claimed", "review", "approved", "done"],
|
|
257
|
+
"actions": [
|
|
258
|
+
{"name": "claim", "from": ["open"], "to": "claimed"},
|
|
259
|
+
{"name": "submit", "from": ["claimed"], "to": "review"},
|
|
260
|
+
{"name": "approve", "from": ["review"], "to": "approved", "requires": ["critic"]},
|
|
261
|
+
{"name": "ship", "from": ["approved"], "to": "done"}
|
|
262
|
+
]
|
|
263
|
+
}'
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
## 技能系统
|
|
267
|
+
|
|
268
|
+
Maestro 会从 Agent 的工作会话中自动提取可复用的技能模式,存储为 Markdown 文件:
|
|
269
|
+
|
|
270
|
+
```
|
|
271
|
+
.hub/skills/
|
|
272
|
+
├── deploy-to-production.md
|
|
273
|
+
├── setup-jest-config.md
|
|
274
|
+
└── database-migration.md
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
技能会在后续任务分配时注入到 Agent 的提示词中,让团队的经验得以积累和传承。
|
|
278
|
+
|
|
279
|
+
## 通信集成
|
|
280
|
+
|
|
281
|
+
| 渠道 | 说明 |
|
|
282
|
+
|------|------|
|
|
283
|
+
| Web Chat | 内置工作区聊天 |
|
|
284
|
+
| Telegram | Bot 网关,支持斜杠命令 |
|
|
285
|
+
| Lark/飞书 | Webhook 通知 |
|
|
286
|
+
| Webhook | 通用入站 Webhook(GitHub、Linear 等) |
|
|
287
|
+
|
|
288
|
+
```bash
|
|
289
|
+
# 配置 Telegram Bot
|
|
290
|
+
export MAESTRO_TELEGRAM_BOT_TOKEN=your-bot-token
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
## 传输层
|
|
294
|
+
|
|
295
|
+
Agent 可以通过三种方式连接:
|
|
296
|
+
|
|
297
|
+
| 方式 | 场景 |
|
|
298
|
+
|------|------|
|
|
299
|
+
| `local-pty` | 本地进程(默认,自动发现的 CLI) |
|
|
300
|
+
| `ssh` | 远程开发机上的 Agent |
|
|
301
|
+
| `http-api` | 通过 HTTP API 代理的远程 Agent |
|
|
302
|
+
|
|
303
|
+
## 环境变量
|
|
304
|
+
|
|
305
|
+
| 变量 | 说明 | 默认值 |
|
|
306
|
+
|------|------|--------|
|
|
307
|
+
| `ANTHROPIC_API_KEY` | Chief Agent 的 API Key | — |
|
|
308
|
+
| `MAESTRO_CHIEF_MODEL` | Chief 使用的模型 | `claude-sonnet-4-6` |
|
|
309
|
+
| `MAESTRO_CHIEF_BASE_URL` | 自定义 API 端点 | Anthropic 官方 |
|
|
310
|
+
| `MAESTRO_TELEGRAM_BOT_TOKEN` | Telegram Bot Token | — |
|
|
311
|
+
| `MAESTRO_HUB_URL` | Hub 地址(Agent 侧) | `http://localhost:7423` |
|
|
312
|
+
| `MAESTRO_<RUNTIME>_PATH` | 指定 Runtime CLI 路径 | 自动发现 |
|
|
313
|
+
| `MAESTRO_<RUNTIME>_MODEL` | 指定 Runtime 使用的模型 | Runtime 默认 |
|
|
314
|
+
|
|
315
|
+
## License
|
|
316
|
+
|
|
317
|
+
本项目为私有软件,保留所有权利。未经授权不得复制、修改或分发。
|
package/bin/maestro.ts
ADDED
package/dist/maestro
ADDED
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{q as p,z as a,v as e,a as g,s as y,x as u}from"./index-C7kx39S9.js";import{R as j}from"./refresh-cw-BWX04Hg3.js";import{A as N}from"./activity-CIA8bIA4.js";/**
|
|
2
|
+
* @license lucide-react v1.16.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const k=[["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M17 20v2",key:"1rnc9c"}],["path",{d:"M17 2v2",key:"11trls"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M2 17h2",key:"7oei6x"}],["path",{d:"M2 7h2",key:"asdhe0"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"M20 17h2",key:"1fpfkl"}],["path",{d:"M20 7h2",key:"1o8tra"}],["path",{d:"M7 20v2",key:"4gnj0m"}],["path",{d:"M7 2v2",key:"1i4yhu"}],["rect",{x:"4",y:"4",width:"16",height:"16",rx:"2",key:"1vbyd7"}],["rect",{x:"8",y:"8",width:"8",height:"8",rx:"1",key:"z9xiuo"}]],w=p("cpu",k);/**
|
|
7
|
+
* @license lucide-react v1.16.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const M=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],C=p("search",M);function E(){const[i,v]=a.useState([]),[l,c]=a.useState(!0),[o,r]=a.useState(""),[d,h]=a.useState(null),n=()=>{c(!0),y("/runtimes").then(s=>{v(s),r("")}).catch(s=>r(s.message)).finally(()=>c(!1))};a.useEffect(()=>{n()},[]);const f=s=>{h(s),u(`/runtimes/${s}/healthcheck`,{}).then(()=>n()).catch(t=>r(t.message)).finally(()=>h(null))},b=()=>{u("/runtimes/discover",{}).then(()=>n()).catch(s=>r(s.message))};return e.jsxs("div",{className:"flex flex-col h-full overflow-hidden",children:[e.jsxs("div",{className:"h-[52px] border-b border-[hsl(var(--border))] flex items-center justify-between px-6 shrink-0 bg-[hsl(var(--card))/0.92] backdrop-blur-xl",children:[e.jsx("h1",{className:"text-lg font-semibold tracking-tight",children:"运行时"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("button",{onClick:b,className:"inline-flex items-center gap-1.5 px-3 py-1.5 rounded-md border border-[hsl(var(--border))] bg-[hsl(var(--card))] text-xs font-medium hover:border-[hsl(var(--muted-foreground))] transition-colors",children:[e.jsx(C,{className:"w-3.5 h-3.5"}),"发现"]}),e.jsxs("button",{onClick:n,disabled:l,className:"inline-flex items-center gap-1.5 px-3 py-1.5 rounded-md border border-[hsl(var(--border))] bg-[hsl(var(--card))] text-xs font-medium hover:border-[hsl(var(--muted-foreground))] transition-colors disabled:opacity-50",children:[e.jsx(j,{className:`w-3.5 h-3.5 ${l?"animate-spin":""}`}),"刷新"]})]})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto p-6",children:[o&&e.jsx("div",{className:"mb-4 p-3 rounded-lg bg-[hsl(var(--destructive))/0.08] border border-[hsl(var(--destructive))/0.2] text-sm text-[hsl(var(--destructive))]",children:o}),l?e.jsx("div",{className:"text-center py-12 text-sm text-[hsl(var(--muted-foreground))]",children:"加载中..."}):i.length===0?e.jsxs("div",{className:"text-center py-16 text-[hsl(var(--muted-foreground))]",children:[e.jsx(g,{className:"w-10 h-10 mx-auto mb-3 opacity-40"}),e.jsx("p",{className:"text-sm",children:"暂无运行时"}),e.jsx("p",{className:"text-xs mt-1 opacity-70",children:"点击「发现」来查找本地 Agent 运行时"})]}):e.jsx("div",{className:"space-y-3",children:i.map(s=>{var x;const t=((x=s.waterline)==null?void 0:x.utilization)??0,m=Math.round(t*100);return e.jsxs("div",{className:"bg-[hsl(var(--card))] border border-[hsl(var(--border))] rounded-xl p-4",children:[e.jsxs("div",{className:"flex justify-between items-start",children:[e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx(w,{className:"w-4 h-4 text-[hsl(var(--muted-foreground))]"}),e.jsx("span",{className:"font-medium text-sm",children:s.type||"unknown"}),e.jsx("span",{className:"text-[10px] font-mono px-1.5 py-0.5 rounded bg-[hsl(var(--muted))] text-[hsl(var(--muted-foreground))]",children:s.transport||"—"}),e.jsx("span",{className:`inline-flex items-center px-2 py-0.5 rounded-full text-[10px] font-mono font-medium ${s.status==="healthy"?"pill-success":s.status==="degraded"?"pill-warning":"pill-danger"}`,children:s.status||"unknown"})]}),e.jsxs("div",{className:"text-xs text-[hsl(var(--muted-foreground))] font-mono ml-6",children:[s.cmd&&e.jsx("span",{className:"truncate block max-w-md",children:s.cmd}),e.jsxs("span",{children:["容量: ",s.capacity??"—"]}),s.waterline&&e.jsxs("span",{className:"ml-3",children:["运行中: ",s.waterline.running]})]})]}),e.jsxs("button",{onClick:()=>f(s.id),disabled:d===s.id,className:"inline-flex items-center gap-1.5 px-3 py-1.5 rounded-md border border-[hsl(var(--border))] text-xs font-medium hover:border-[hsl(var(--muted-foreground))] transition-colors disabled:opacity-50 shrink-0",children:[e.jsx(N,{className:`w-3 h-3 ${d===s.id?"animate-pulse":""}`}),d===s.id?"检查中...":"健康检查"]})]}),s.capacity&&s.capacity>0&&e.jsxs("div",{className:"mt-3 ml-6",children:[e.jsxs("div",{className:"flex justify-between text-[11px] text-[hsl(var(--muted-foreground))] mb-1 font-mono",children:[e.jsx("span",{children:"利用率"}),e.jsxs("span",{className:"tabular-nums",children:[m,"%"]})]}),e.jsx("div",{className:"h-1.5 bg-[hsl(var(--muted))] rounded-full overflow-hidden",children:e.jsx("div",{className:`h-full rounded-full transition-all ${t>.8?"bg-[hsl(var(--destructive))]":t>.5?"bg-[hsl(var(--warning))]":"bg-[hsl(var(--success))]"}`,style:{width:`${Math.min(100,m)}%`}})})]})]},s.id)})})]})]})}export{E as default};
|