0.11.3: 旗舰版第四轮完善(统一审批中心/工具治理/平台环境变量/数字员工入口/个人渠道/报表多维/租户配额)

- 统一审批中心:模型/资源/渠道/工具四类申请聚合审批,通过自动开通
  (marketplace 安装/渠道授权),outbox 双向站内信;门户可发起/撤回。
- 工具治理:rate_limit_rpm(固定窗口原子 upsert,多实例共享)+ approval_required
  (首次调用自动发起审批,批准前一律拒绝)。
- 平台环境变量:平台级注入 skill/MCP 运行时,个人可覆盖;系统管理员可写。
- 数字员工会话入口:门户列表/对话/调用记录,复用用户运行时凭据。
- 个人渠道:webhook 入站令牌 SHA-256 摘要 + constant-time 校验,绑定已批准
  模型,用量归属用户 Key。
- 报表多维:工具调用/审批授权/安全事件三组统计端点与页面。
- 租户配额:部门 Key/月 Token 上限,运行时凭据开通强制校验,概览展示用量。
- 迁移 000042-000045;修复渠道空 API Key NOT NULL 违约与 inet 扫描;
  25 包测试通过,前后端构建通过,端到端验证完成。
This commit is contained in:
LLMGuardX Dev
2026-08-13 13:41:22 +08:00
parent e31cc54b8e
commit 87c2b04174
40 changed files with 2416 additions and 111 deletions
+17 -2
View File
@@ -11,10 +11,10 @@ import (
"time"
"aigateway.local/core/internal/agentnode"
"aigateway.local/core/internal/channel"
"aigateway.local/core/internal/assistant"
"aigateway.local/core/internal/apikey"
"aigateway.local/core/internal/assistant"
"aigateway.local/core/internal/audit"
"aigateway.local/core/internal/channel"
"aigateway.local/core/internal/contentpolicy"
"aigateway.local/core/internal/factcheck"
"aigateway.local/core/internal/gateway"
@@ -265,6 +265,7 @@ func main() {
}
envVarService := workbench.NewEnvVarService(db, envVarCipher)
envVarHandler := workbench.NewEnvVarHTTPHandler(envVarService, identityService)
adminEnvVarHandler := workbench.NewAdminEnvVarHTTPHandler(envVarService, identityService)
toolService := workbench.NewToolService(workbenchService, toolCipher, cfg.Credentials.AllowPrivateToolURL)
notificationService := workbench.NewNotificationService(workbenchService, notificationCipher, cfg.Credentials.AllowPrivateWebhookURL)
workbenchHandler := workbench.NewAdminHTTPHandler(workbenchService, toolService, notificationService, identityService)
@@ -400,6 +401,8 @@ func main() {
controlMux.Handle("/api/v1/admin/knowledge-bases/", workbenchHandler)
controlMux.Handle("/api/v1/admin/tools", workbenchHandler)
controlMux.Handle("/api/v1/admin/tools/", workbenchHandler)
controlMux.Handle("/api/v1/admin/tool-approvals", workbenchHandler)
controlMux.Handle("/api/v1/admin/tool-approvals/", workbenchHandler)
controlMux.Handle("/api/v1/admin/applications", workbenchHandler)
controlMux.Handle("/api/v1/admin/applications/", workbenchHandler)
controlMux.Handle("/api/v1/admin/marketplace-categories", marketplaceHandler)
@@ -422,6 +425,7 @@ func main() {
controlMux.Handle("/api/v1/admin/model-requests/", portalAdminHandler)
controlMux.Handle("/api/v1/admin/system-info", operationsHandler)
controlMux.Handle("/api/v1/admin/monitoring/overview", operationsHandler)
controlMux.Handle("/api/v1/admin/reports/", operationsHandler)
controlMux.Handle("/api/v1/admin/tenants/", operationsHandler)
controlMux.Handle("/api/v1/admin/files", filesAdminHandler)
controlMux.Handle("/api/v1/admin/files/", filesAdminHandler)
@@ -479,6 +483,16 @@ func main() {
controlMux.Handle("/api/v1/portal/stats", portalHandler)
controlMux.Handle("/api/v1/portal/tools", portalHandler)
controlMux.Handle("/api/v1/portal/chat/", portalHandler)
controlMux.Handle("/api/v1/portal/personal-channels", portalHandler)
controlMux.Handle("/api/v1/portal/personal-channels/", portalHandler)
controlMux.Handle("/api/v1/portal/digital-employees", portalHandler)
controlMux.Handle("/api/v1/portal/digital-employees/", portalHandler)
controlMux.Handle("/api/v1/portal/resource-requests", portalHandler)
controlMux.Handle("/api/v1/portal/resource-requests/", portalHandler)
controlMux.Handle("/api/v1/admin/resource-requests", portalAdminHandler)
controlMux.Handle("/api/v1/admin/resource-requests/", portalAdminHandler)
controlMux.Handle("/api/v1/admin/env-vars", adminEnvVarHandler)
controlMux.Handle("/api/v1/admin/env-vars/", adminEnvVarHandler)
controlMux.Handle("/api/v1/", identityHandler)
publicMux := http.NewServeMux()
publicMux.Handle("/v1/prompts", workbenchRuntime)
@@ -491,6 +505,7 @@ func main() {
publicMux.Handle("/v1/mcp-servers", workbenchRuntime)
publicMux.Handle("/v1/mcp-servers/", workbenchRuntime)
publicMux.Handle("/v1/channels/", channelInboundHandler)
publicMux.Handle("/v1/personal-channels/", portalHandler)
publicMux.Handle("/v1/digital-employees/", workbenchRuntime)
publicMux.Handle("/v1/", governedGateway)
server := httpserver.New(httpserver.Dependencies{