aios-management-web 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.json +21 -0
- package/README.md +257 -0
- package/data/management-console.db +0 -0
- package/data/management-console.db-shm +0 -0
- package/data/management-console.db-wal +0 -0
- package/dist/assets/index-CV_wjCAG.js +464 -0
- package/dist/assets/index-DfMPB0eV.css +1 -0
- package/dist/index.html +13 -0
- package/docs/spec.md +199 -0
- package/index.html +12 -0
- package/package.json +37 -0
- package/scripts/reset-kernel.js +59 -0
- package/scripts/reset-password.js +22 -0
- package/server/fakes.js +57 -0
- package/server/index.js +21 -0
- package/server/src/api/middleware/auth.js +29 -0
- package/server/src/api/middleware/internal.js +44 -0
- package/server/src/api/routes/index.js +677 -0
- package/server/src/app.js +90 -0
- package/server/src/background/index.js +106 -0
- package/server/src/background/protocol.js +15 -0
- package/server/src/config/env.js +90 -0
- package/server/src/db/index.js +501 -0
- package/server/src/infra/mqtt/management-rpc-client.js +213 -0
- package/server/src/infra/providers/hzg-provider-client.js +39 -0
- package/server/src/infra/s3/object-storage.js +97 -0
- package/server/src/services/agent-quota.js +54 -0
- package/server/src/services/agent-service.js +696 -0
- package/server/src/services/agent-status-sync-service.js +132 -0
- package/server/src/services/audit-log-service.js +39 -0
- package/server/src/services/auth-service.js +153 -0
- package/server/src/services/catalog-sync-service.js +712 -0
- package/server/src/services/external-service.js +308 -0
- package/server/src/services/kernel-reset-service.js +86 -0
- package/server/src/services/portal-service.js +555 -0
- package/server/src/services/system-service.js +580 -0
- package/server/src/services/topic-ping-service.js +282 -0
- package/server/src/utils/errors.js +36 -0
- package/server/src/utils/security.js +22 -0
- package/server/test/agent-service-alignment.test.js +316 -0
- package/server/test/agent-service-create.test.js +662 -0
- package/server/test/agent-status-sync-service.test.js +167 -0
- package/server/test/agent-update-audit.test.js +63 -0
- package/server/test/auth-middleware.test.js +71 -0
- package/server/test/background-services.test.js +160 -0
- package/server/test/catalog-sync-service.test.js +920 -0
- package/server/test/db-reset-migration.test.js +123 -0
- package/server/test/env-config.test.js +68 -0
- package/server/test/external-service.test.js +380 -0
- package/server/test/hzg-provider-client.test.js +50 -0
- package/server/test/internal-auth-middleware.test.js +66 -0
- package/server/test/kernel-reset-service.test.js +112 -0
- package/server/test/management-rpc-client.test.js +105 -0
- package/server/test/portal-service-access-tokens.test.js +121 -0
- package/server/test/portal-service-alignment.test.js +318 -0
- package/server/test/portal-service-management-logs.test.js +114 -0
- package/server/test/reset-kernel-cli.test.js +23 -0
- package/server/test/service-api-auth-middleware.test.js +59 -0
- package/server/test/system-service-alignment.test.js +265 -0
- package/server/test/topic-ping-service.test.js +182 -0
- package/server/test/usage-refresh-audit-route.test.js +82 -0
- package/src/App.jsx +1 -0
- package/src/api.js +1 -0
- package/src/app/App.jsx +346 -0
- package/src/app/api-client.js +112 -0
- package/src/components/AppShell.jsx +117 -0
- package/src/components/CardTitleWithReload.jsx +20 -0
- package/src/components/DeleteActionButton.jsx +31 -0
- package/src/main.jsx +14 -0
- package/src/pages/AgentsPage.jsx +647 -0
- package/src/pages/AiosUsersPage.jsx +151 -0
- package/src/pages/DashboardPage.jsx +72 -0
- package/src/pages/LoginPage.jsx +41 -0
- package/src/pages/SettingsPage.jsx +431 -0
- package/src/pages/SkillsPage.jsx +175 -0
- package/src/pages/SystemLogsPage.jsx +349 -0
- package/src/pages/SystemsPage.jsx +498 -0
- package/src/pages/TemplatesPage.jsx +207 -0
- package/src/pages/UserManagementPage.jsx +25 -0
- package/src/pages/UsersPage.jsx +192 -0
- package/src/pages/system-logs/SystemLogsTabs.jsx +362 -0
- package/src/styles.css +222 -0
- package/src/utils/format.js +63 -0
- package/test/.reports/fast-2026-05-25T08-32-39-420Z.json +299 -0
- package/test/integration/common.js +208 -0
- package/test/integration/fast.js +135 -0
- package/test/integration/full.js +306 -0
- package/test/run-browser-e2e.js +212 -0
- package/test/run-jasmine.js +21 -0
- package/test/setup.js +1 -0
- package/vite.config.js +12 -0
package/.env.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"AIOS_MQTT_CHANNEL_BROKER": "mqtt://172.16.12.2:1883",
|
|
3
|
+
"AIOS_MQTT_CHANNEL_USERNAME": "huozige",
|
|
4
|
+
"AIOS_MQTT_CHANNEL_PASSWORD": "xA123456",
|
|
5
|
+
"AIOS_APP_INVOKE_INBOUND_TOPIC": "aios-dev1/app-invoke/inbound",
|
|
6
|
+
"AIOS_APP_INVOKE_OUTBOUND_TOPIC": "aios-dev1/app-invoke/outbound",
|
|
7
|
+
"AIOS_ADMIN_INBOUND_TOPIC": "aios-dev1/admin/inbound",
|
|
8
|
+
"AIOS_ADMIN_OUTBOUND_TOPIC": "aios-dev1/admin/outbound",
|
|
9
|
+
"AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE": "aios-dev1/agent/{agentId}/inbound",
|
|
10
|
+
"AIOS_AGENT_CHANNEL_OUTBOUND_TOPIC_TEMPLATE": "aios-dev1/agent/{agentId}/outbound",
|
|
11
|
+
"AIOS_S3_ENDPOINT": "http://172.16.12.2:9000",
|
|
12
|
+
"AIOS_S3_REGION": "local",
|
|
13
|
+
"AIOS_S3_ACCESS_KEY_ID": "minioadmin",
|
|
14
|
+
"AIOS_S3_SECRET_ACCESS_KEY": "minioadmin",
|
|
15
|
+
"AIOS_S3_FORCE_PATH_STYLE": "true",
|
|
16
|
+
"AIOS_S3_ADMIN_INBOX_BUCKET": "admin-in",
|
|
17
|
+
"AIOS_S3_ADMIN_OUTBOX_BUCKET": "admin-out",
|
|
18
|
+
"AIOS_S3_AGENT_INBOX_BUCKET": "agents-in",
|
|
19
|
+
"AIOS_S3_AGENT_OUTBOX_BUCKET": "agents-out",
|
|
20
|
+
"AIOS_MANAGEMENT_WEBSITE_TIMEOUT": "120"
|
|
21
|
+
}
|
package/README.md
ADDED
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
# AIOS 管理控制台 Web
|
|
2
|
+
|
|
3
|
+
AIOS 运维管理控制台,技术栈为 `React + Ant Design + Express + SQLite`。
|
|
4
|
+
|
|
5
|
+
当前能力:
|
|
6
|
+
|
|
7
|
+
- 管理员登录、密码修改、密码重置
|
|
8
|
+
- 管理站账号管理和 AIOS 用户目录管理
|
|
9
|
+
- 数字员工模板管理
|
|
10
|
+
- 全局技能目录管理
|
|
11
|
+
- 数字员工管理、用户授权和每日 Token 限额控制
|
|
12
|
+
- 本地缓存 agent、模板、技能和业务系统目录,支持启动同步和手动内核同步
|
|
13
|
+
- 启动全量同步,并每 10 分钟刷新一次 agent Token 用量
|
|
14
|
+
- 为 app-invoke proxy 和 CUI 消费方提供外部接口
|
|
15
|
+
- 为状态正常的 agent 提供内部 CUI 目录接口
|
|
16
|
+
- 业务系统管理、连通性测试、调用日志和调用统计
|
|
17
|
+
- 通过 MQTT 集成 `aios-management-serivce`
|
|
18
|
+
- 通过 S3 上传模板、技能和 Ontology 制品
|
|
19
|
+
- 为同容器部署的 `aios-app-invoke-proxy-service` 提供仅限 loopback 的 HTTP API
|
|
20
|
+
|
|
21
|
+
## 目录结构
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
server/src/
|
|
25
|
+
api/ HTTP 路由和中间件
|
|
26
|
+
background/ MQTT 后台监听
|
|
27
|
+
config/ 环境变量加载
|
|
28
|
+
db/ SQLite 初始化和表结构
|
|
29
|
+
infra/ MQTT / S3 / provider 适配
|
|
30
|
+
services/ 业务服务
|
|
31
|
+
utils/ 通用工具
|
|
32
|
+
|
|
33
|
+
src/
|
|
34
|
+
app/ 前端入口和 API 客户端
|
|
35
|
+
components/ 布局组件
|
|
36
|
+
pages/ 页面模块
|
|
37
|
+
utils/ 格式化工具
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 启动
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
npm install
|
|
44
|
+
npm run start
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
前端开发:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
npm run dev
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
构建:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npm run build
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
集成冒烟测试:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
npm run test:fast
|
|
63
|
+
npm run test:full
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
这些脚本假定真实的 `management-website` 服务已经运行在 `http://127.0.0.1:3030`,并且共享 MQTT/S3 测试环境可用。默认会从 `E:\tmp\aios4` 读取测试制品和环境配置。
|
|
67
|
+
|
|
68
|
+
可选环境变量:
|
|
69
|
+
|
|
70
|
+
- `AIOS_WEB_BASE_URL`
|
|
71
|
+
- `AIOS_TEST_ARTIFACT_ROOT`
|
|
72
|
+
- `AIOS_TEST_ENV_JSON`
|
|
73
|
+
- `AIOS_TEST_REPORT_DIR`
|
|
74
|
+
- `AIOS_TEST_SKIP_CLEANUP=1`
|
|
75
|
+
|
|
76
|
+
当前测试范围:
|
|
77
|
+
|
|
78
|
+
- `test:fast`:模板、agent、业务系统的创建、列表、删除冒烟链路,包含手动内核同步和 CUI 目录校验
|
|
79
|
+
- `test:full`:除技能管理外的完整 `management-website` 集成链路,包含手动内核同步和 CUI 目录校验
|
|
80
|
+
|
|
81
|
+
## 默认账号
|
|
82
|
+
|
|
83
|
+
- 用户名:`aios`
|
|
84
|
+
- 密码:`123456`
|
|
85
|
+
|
|
86
|
+
系统会在首次登录后强制修改密码。
|
|
87
|
+
|
|
88
|
+
通过命令行重置密码:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
npm run reset-password -- aios NewPassword123!
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## 关键配置
|
|
95
|
+
|
|
96
|
+
服务 API 访问 Token 存储在 SQLite 中,并通过设置页的访问 Token API 管理。
|
|
97
|
+
MQTT 和 S3 设置从环境变量读取,由 `web` 和 `proxy` 共享。
|
|
98
|
+
|
|
99
|
+
- `AIOS_MQTT_CHANNEL_BROKER`
|
|
100
|
+
- `AIOS_MQTT_CHANNEL_USERNAME`
|
|
101
|
+
- `AIOS_MQTT_CHANNEL_PASSWORD`
|
|
102
|
+
- `AIOS_ADMIN_INBOUND_TOPIC`
|
|
103
|
+
- `AIOS_ADMIN_OUTBOUND_TOPIC`
|
|
104
|
+
- `AIOS_AGENT_CHANNEL_INBOUND_TOPIC_TEMPLATE`
|
|
105
|
+
- `AIOS_AGENT_CHANNEL_OUTBOUND_TOPIC_TEMPLATE`
|
|
106
|
+
- `AIOS_S3_ENDPOINT`
|
|
107
|
+
- `AIOS_S3_REGION`
|
|
108
|
+
- `AIOS_S3_ACCESS_KEY_ID`
|
|
109
|
+
- `AIOS_S3_SECRET_ACCESS_KEY`
|
|
110
|
+
- `AIOS_S3_FORCE_PATH_STYLE`
|
|
111
|
+
- `AIOS_S3_ADMIN_INBOX_BUCKET`
|
|
112
|
+
- `AIOS_S3_ADMIN_OUTBOX_BUCKET`
|
|
113
|
+
- `AIOS_S3_AGENT_INBOX_BUCKET`
|
|
114
|
+
- `AIOS_S3_AGENT_OUTBOX_BUCKET`
|
|
115
|
+
|
|
116
|
+
## 外部 API
|
|
117
|
+
|
|
118
|
+
`web` 在 `http://127.0.0.1:3030` 同时提供前端页面和 API。
|
|
119
|
+
|
|
120
|
+
统一鉴权规则:
|
|
121
|
+
|
|
122
|
+
- 所有 API 对来自 `127.0.0.1` / `::1` 的 loopback 请求跳过鉴权
|
|
123
|
+
- 服务 API(`/api/internal/*`、`/api/external/*`)仅对非 loopback 请求要求配置好的 Bearer 访问 Token
|
|
124
|
+
- 管理 API 仅对非 loopback 请求要求管理站登录 Token
|
|
125
|
+
|
|
126
|
+
### 面向 Proxy 的 API
|
|
127
|
+
|
|
128
|
+
这些接口供 `aios-app-invoke-proxy-service` 使用:
|
|
129
|
+
|
|
130
|
+
- `GET /api/external/cookie?sessionId=...&provider=...`
|
|
131
|
+
- `POST /api/external/invoke/logging`
|
|
132
|
+
|
|
133
|
+
规则:
|
|
134
|
+
|
|
135
|
+
- localhost 请求直接跳过鉴权
|
|
136
|
+
- 非本地请求使用服务 API 的 Bearer Token 规则
|
|
137
|
+
- `/api/external/cookie` 按 `sessionId + provider` 解析并缓存 provider Cookie
|
|
138
|
+
- `/api/external/invoke/logging` 将业务调用日志写入 SQLite
|
|
139
|
+
- `management-website` 不消费专用的 app-invoke MQTT topic;应用调用流量只由 `aios-app-invoke-proxy-service` 处理
|
|
140
|
+
|
|
141
|
+
### Token 保护的 CUI API
|
|
142
|
+
|
|
143
|
+
这些接口供上层 CUI 应用使用,需要配置好的服务访问 Token:
|
|
144
|
+
|
|
145
|
+
```http
|
|
146
|
+
Authorization: Bearer sk-xxxx
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
接口:
|
|
150
|
+
|
|
151
|
+
- `GET /api/external/agents?userName=zhangsan`
|
|
152
|
+
- `GET /api/external/session?userName=zhangsan&agentId=finance-agent`
|
|
153
|
+
|
|
154
|
+
规则:
|
|
155
|
+
|
|
156
|
+
- localhost 请求直接跳过鉴权
|
|
157
|
+
- 非本地请求使用相同的服务 API Bearer Token 规则
|
|
158
|
+
- `GET /api/external/agents` 返回指定用户明确有权访问的全部 agent,包含 `normal`、`disabled` 和 `overlimit`
|
|
159
|
+
- `GET /api/external/session` 对同一个 `userName + agentId` 返回稳定的 `sessionId`
|
|
160
|
+
- 当目标 agent 存在但状态不是 `normal` 时,`GET /api/external/session` 返回 HTTP 500;响应 `message` 会说明该 agent 是已停用、已超限,还是其他非正常状态
|
|
161
|
+
- 系统至少会播种一个服务访问 Token,且 UI 会阻止删除最后一个 Token
|
|
162
|
+
|
|
163
|
+
`GET /api/external/agents` 响应示例:
|
|
164
|
+
|
|
165
|
+
```json
|
|
166
|
+
{
|
|
167
|
+
"items": [
|
|
168
|
+
{
|
|
169
|
+
"agent_id": "finance-agent",
|
|
170
|
+
"agent_name": "Finance Agent",
|
|
171
|
+
"status": "normal",
|
|
172
|
+
"inbound_topic": "aios/agent/finance-agent/inbound",
|
|
173
|
+
"outbound_topic": "aios/agent/finance-agent/outbound",
|
|
174
|
+
"users": ["zhangsan"]
|
|
175
|
+
}
|
|
176
|
+
]
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
`GET /api/external/session` 响应示例:
|
|
181
|
+
|
|
182
|
+
```json
|
|
183
|
+
{
|
|
184
|
+
"sessionId": "s-2d34dd2f-2c16-4f2e-bf16-9dcb6ecf5451",
|
|
185
|
+
"inboundTopic": "aios/agent/finance-agent/inbound",
|
|
186
|
+
"outboundTopic": "aios/agent/finance-agent/outbound"
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## 内部 API
|
|
191
|
+
|
|
192
|
+
内部 app-invoke 接口也遵循相同规则:localhost 跳过鉴权;非本地请求在适用时要求配置好的 Bearer Token。
|
|
193
|
+
|
|
194
|
+
接口:
|
|
195
|
+
|
|
196
|
+
- `GET /api/internal/app-invoke/system?provider=...&applicationName=...`
|
|
197
|
+
- `GET /api/internal/app-invoke/base-url?applicationName=...`
|
|
198
|
+
- `POST /api/internal/app-invoke/logs`
|
|
199
|
+
- `GET /api/internal/cui/agents`
|
|
200
|
+
|
|
201
|
+
## 内部 CUI API
|
|
202
|
+
|
|
203
|
+
服务为上层 CUI 应用提供内部 agent 目录接口:
|
|
204
|
+
|
|
205
|
+
```http
|
|
206
|
+
GET /api/internal/cui/agents
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
响应结构:
|
|
210
|
+
|
|
211
|
+
```json
|
|
212
|
+
{
|
|
213
|
+
"items": [
|
|
214
|
+
{
|
|
215
|
+
"agent_id": "finance-agent",
|
|
216
|
+
"agent_name": "Finance Agent",
|
|
217
|
+
"inbound_topic": "aios/agent/in/finance-agent",
|
|
218
|
+
"outbound_topic": "aios/agent/out/finance-agent",
|
|
219
|
+
"users": ["zhangsan", "lisi"]
|
|
220
|
+
}
|
|
221
|
+
]
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
规则:
|
|
226
|
+
|
|
227
|
+
- 只返回 `status = "normal"` 的 agent
|
|
228
|
+
- `agent_name` 存储在本地数据库中,并在可用时从内核侧同步
|
|
229
|
+
- 新创建的 agent 会以 `status = "normal"` 写入本地
|
|
230
|
+
- 用量刷新可能会把正常 agent 调整为 `overlimit`;已停用和已超限 agent 会从 CUI 目录中排除
|
|
231
|
+
- 鉴权规则与 invoke proxy 接口的内部鉴权规则一致
|
|
232
|
+
|
|
233
|
+
## 后台任务
|
|
234
|
+
|
|
235
|
+
- 启动全量同步:RPC 客户端启动后,服务从内核侧拉取 agent、模板、技能和业务系统,并全量刷新本地目录缓存
|
|
236
|
+
- 启动 Token 刷新:启动全量同步完成后,服务立即刷新所有本地 agent 的 Token 用量
|
|
237
|
+
- 定时 Token 刷新:每 10 分钟刷新一次所有本地 agent 的最新 Token 用量
|
|
238
|
+
|
|
239
|
+
Token 用量持久化:
|
|
240
|
+
|
|
241
|
+
- 最新用量存储在 `agents.usage_snapshot_json`
|
|
242
|
+
|
|
243
|
+
## 数据模型
|
|
244
|
+
|
|
245
|
+
关键 SQLite 表:
|
|
246
|
+
|
|
247
|
+
- `users`、`sessions`:管理站登录用户和会话
|
|
248
|
+
- `aios_users`、`agents`、`agent_permissions`、`agent_skill_bindings`:AIOS 用户、数字员工目录和访问控制
|
|
249
|
+
- `agent_templates`、`skills`、`business_systems`:同步和管理的制品
|
|
250
|
+
- `external_sessions`:绑定到 `user + agent` 的稳定 CUI 会话 id
|
|
251
|
+
- `external_session_cookies`:绑定到 `sessionId + provider` 的 provider Cookie 缓存;Cookie 上限为 16 KB
|
|
252
|
+
- `system_invocation_logs`:业务调用日志;`session_id` 已建立索引以支持高频查询
|
|
253
|
+
- `audit_logs`:管理操作和后台任务审计记录
|
|
254
|
+
|
|
255
|
+
## 数据文件
|
|
256
|
+
|
|
257
|
+
- `data/management-console.db`
|
|
Binary file
|
|
Binary file
|
|
Binary file
|