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.
Files changed (91) hide show
  1. package/.env.json +21 -0
  2. package/README.md +257 -0
  3. package/data/management-console.db +0 -0
  4. package/data/management-console.db-shm +0 -0
  5. package/data/management-console.db-wal +0 -0
  6. package/dist/assets/index-CV_wjCAG.js +464 -0
  7. package/dist/assets/index-DfMPB0eV.css +1 -0
  8. package/dist/index.html +13 -0
  9. package/docs/spec.md +199 -0
  10. package/index.html +12 -0
  11. package/package.json +37 -0
  12. package/scripts/reset-kernel.js +59 -0
  13. package/scripts/reset-password.js +22 -0
  14. package/server/fakes.js +57 -0
  15. package/server/index.js +21 -0
  16. package/server/src/api/middleware/auth.js +29 -0
  17. package/server/src/api/middleware/internal.js +44 -0
  18. package/server/src/api/routes/index.js +677 -0
  19. package/server/src/app.js +90 -0
  20. package/server/src/background/index.js +106 -0
  21. package/server/src/background/protocol.js +15 -0
  22. package/server/src/config/env.js +90 -0
  23. package/server/src/db/index.js +501 -0
  24. package/server/src/infra/mqtt/management-rpc-client.js +213 -0
  25. package/server/src/infra/providers/hzg-provider-client.js +39 -0
  26. package/server/src/infra/s3/object-storage.js +97 -0
  27. package/server/src/services/agent-quota.js +54 -0
  28. package/server/src/services/agent-service.js +696 -0
  29. package/server/src/services/agent-status-sync-service.js +132 -0
  30. package/server/src/services/audit-log-service.js +39 -0
  31. package/server/src/services/auth-service.js +153 -0
  32. package/server/src/services/catalog-sync-service.js +712 -0
  33. package/server/src/services/external-service.js +308 -0
  34. package/server/src/services/kernel-reset-service.js +86 -0
  35. package/server/src/services/portal-service.js +555 -0
  36. package/server/src/services/system-service.js +580 -0
  37. package/server/src/services/topic-ping-service.js +282 -0
  38. package/server/src/utils/errors.js +36 -0
  39. package/server/src/utils/security.js +22 -0
  40. package/server/test/agent-service-alignment.test.js +316 -0
  41. package/server/test/agent-service-create.test.js +662 -0
  42. package/server/test/agent-status-sync-service.test.js +167 -0
  43. package/server/test/agent-update-audit.test.js +63 -0
  44. package/server/test/auth-middleware.test.js +71 -0
  45. package/server/test/background-services.test.js +160 -0
  46. package/server/test/catalog-sync-service.test.js +920 -0
  47. package/server/test/db-reset-migration.test.js +123 -0
  48. package/server/test/env-config.test.js +68 -0
  49. package/server/test/external-service.test.js +380 -0
  50. package/server/test/hzg-provider-client.test.js +50 -0
  51. package/server/test/internal-auth-middleware.test.js +66 -0
  52. package/server/test/kernel-reset-service.test.js +112 -0
  53. package/server/test/management-rpc-client.test.js +105 -0
  54. package/server/test/portal-service-access-tokens.test.js +121 -0
  55. package/server/test/portal-service-alignment.test.js +318 -0
  56. package/server/test/portal-service-management-logs.test.js +114 -0
  57. package/server/test/reset-kernel-cli.test.js +23 -0
  58. package/server/test/service-api-auth-middleware.test.js +59 -0
  59. package/server/test/system-service-alignment.test.js +265 -0
  60. package/server/test/topic-ping-service.test.js +182 -0
  61. package/server/test/usage-refresh-audit-route.test.js +82 -0
  62. package/src/App.jsx +1 -0
  63. package/src/api.js +1 -0
  64. package/src/app/App.jsx +346 -0
  65. package/src/app/api-client.js +112 -0
  66. package/src/components/AppShell.jsx +117 -0
  67. package/src/components/CardTitleWithReload.jsx +20 -0
  68. package/src/components/DeleteActionButton.jsx +31 -0
  69. package/src/main.jsx +14 -0
  70. package/src/pages/AgentsPage.jsx +647 -0
  71. package/src/pages/AiosUsersPage.jsx +151 -0
  72. package/src/pages/DashboardPage.jsx +72 -0
  73. package/src/pages/LoginPage.jsx +41 -0
  74. package/src/pages/SettingsPage.jsx +431 -0
  75. package/src/pages/SkillsPage.jsx +175 -0
  76. package/src/pages/SystemLogsPage.jsx +349 -0
  77. package/src/pages/SystemsPage.jsx +498 -0
  78. package/src/pages/TemplatesPage.jsx +207 -0
  79. package/src/pages/UserManagementPage.jsx +25 -0
  80. package/src/pages/UsersPage.jsx +192 -0
  81. package/src/pages/system-logs/SystemLogsTabs.jsx +362 -0
  82. package/src/styles.css +222 -0
  83. package/src/utils/format.js +63 -0
  84. package/test/.reports/fast-2026-05-25T08-32-39-420Z.json +299 -0
  85. package/test/integration/common.js +208 -0
  86. package/test/integration/fast.js +135 -0
  87. package/test/integration/full.js +306 -0
  88. package/test/run-browser-e2e.js +212 -0
  89. package/test/run-jasmine.js +21 -0
  90. package/test/setup.js +1 -0
  91. 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