WeKnora deployment source with the reviewed wiki identity, summary and recovery fixes
Anydoc / anydoc parser engine (push) Canceled after 0s
App / Format, vet, test, and build (push) Canceled after 0s
CLI / test (macos-latest / go 1.26) (push) Canceled after 0s
CLI / test (ubuntu-latest / go 1.26) (push) Canceled after 0s
CLI / test (windows-latest / go 1.26) (push) Canceled after 0s
Build and Push Docker Image / build-ui (push) Canceled after 0s
Build and Push Docker Image / build-docreader (push) Canceled after 0s
Build and Push Docker Image / build-sandbox (push) Canceled after 0s
Build and Push Docker Image / build-app (amd64, linux/amd64, ubuntu-latest) (push) Canceled after 0s
Build and Push Docker Image / build-app (arm64, linux/arm64, ubuntu-24.04-arm) (push) Canceled after 0s
DocReader / Python tests and Go client tests (push) Canceled after 0s
Build & Publish (dsh-weknora) / Typecheck, test, pack (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (pinned) (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (latest, advisory) (push) Canceled after 0s
Frontend / Test, type-check, and build (push) Canceled after 0s
Go Lint Cache / warm lint cache (.) (push) Canceled after 0s
Go Lint Cache / warm lint cache (cli) (push) Canceled after 0s
Go Lint Cache / warm lint cache (client) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.10) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.11) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.12) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.13) (push) Canceled after 0s
Build and Push Docker Image / merge (push) Canceled after 0s
Build & Publish (dsh-weknora) / Publish to npm (push) Canceled after 0s
Build & Publish (mcp-server) / Build sdist + wheel (push) Canceled after 0s
Build & Publish (mcp-server) / Publish to PyPI (push) Canceled after 0s
Anydoc / anydoc parser engine (push) Canceled after 0s
App / Format, vet, test, and build (push) Canceled after 0s
CLI / test (macos-latest / go 1.26) (push) Canceled after 0s
CLI / test (ubuntu-latest / go 1.26) (push) Canceled after 0s
CLI / test (windows-latest / go 1.26) (push) Canceled after 0s
Build and Push Docker Image / build-ui (push) Canceled after 0s
Build and Push Docker Image / build-docreader (push) Canceled after 0s
Build and Push Docker Image / build-sandbox (push) Canceled after 0s
Build and Push Docker Image / build-app (amd64, linux/amd64, ubuntu-latest) (push) Canceled after 0s
Build and Push Docker Image / build-app (arm64, linux/arm64, ubuntu-24.04-arm) (push) Canceled after 0s
DocReader / Python tests and Go client tests (push) Canceled after 0s
Build & Publish (dsh-weknora) / Typecheck, test, pack (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (pinned) (push) Canceled after 0s
Build & Publish (dsh-weknora) / End-to-end inside dsh (latest, advisory) (push) Canceled after 0s
Frontend / Test, type-check, and build (push) Canceled after 0s
Go Lint Cache / warm lint cache (.) (push) Canceled after 0s
Go Lint Cache / warm lint cache (cli) (push) Canceled after 0s
Go Lint Cache / warm lint cache (client) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.10) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.11) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.12) (push) Canceled after 0s
Build & Publish (mcp-server) / Test (Python 3.13) (push) Canceled after 0s
Build and Push Docker Image / merge (push) Canceled after 0s
Build & Publish (dsh-weknora) / Publish to npm (push) Canceled after 0s
Build & Publish (mcp-server) / Build sdist + wheel (push) Canceled after 0s
Build & Publish (mcp-server) / Publish to PyPI (push) Canceled after 0s
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
|
||||
"github.com/Tencent/WeKnora/internal/accesspolicy"
|
||||
apperrors "github.com/Tencent/WeKnora/internal/errors"
|
||||
"github.com/Tencent/WeKnora/internal/types"
|
||||
)
|
||||
|
||||
// PrepareAgentExecutionContext delegates only live bindings owned by the
|
||||
// authorized Agent's creator. The caller's publication snapshot stays intact.
|
||||
func (s *customAgentService) PrepareAgentExecutionContext(ctx context.Context, id string) (context.Context, error) {
|
||||
prepared, err := s.prepareAgentExecution(ctx, id, map[string]bool{}, map[string]bool{})
|
||||
if errors.Is(err, ErrAgentNotFound) {
|
||||
return ctx, apperrors.NewNotFoundError("Agent 已删除或无权使用")
|
||||
}
|
||||
if err != nil {
|
||||
return ctx, err
|
||||
}
|
||||
return prepared, nil
|
||||
}
|
||||
|
||||
func (s *customAgentService) prepareAgentExecution(ctx context.Context, id string, visiting, visited map[string]bool) (context.Context, error) {
|
||||
if visiting[id] {
|
||||
return ctx, apperrors.NewBadRequestError("Agent 依赖存在循环或层级过多,请调整融合配置")
|
||||
}
|
||||
if visited[id] {
|
||||
return ctx, nil
|
||||
}
|
||||
if len(visited) >= 64 {
|
||||
return ctx, apperrors.NewBadRequestError("Agent 依赖存在循环或层级过多,请调整融合配置")
|
||||
}
|
||||
agent, err := s.GetAgentByID(ctx, id)
|
||||
if err != nil {
|
||||
return ctx, err
|
||||
}
|
||||
if agent == nil || !agent.Enabled || !accesspolicy.Allowed(ctx, "agents.read") {
|
||||
return ctx, apperrors.NewForbiddenError("Agent 已停用或无权使用")
|
||||
}
|
||||
if guard, ok := s.repo.(interface {
|
||||
CheckDigitalHumanAgentExecution(context.Context, *types.CustomAgent) error
|
||||
}); ok {
|
||||
if err := guard.CheckDigitalHumanAgentExecution(ctx, agent); err != nil {
|
||||
return ctx, err
|
||||
}
|
||||
}
|
||||
visiting[id] = true
|
||||
defer delete(visiting, id)
|
||||
visited[id] = true
|
||||
if agent.Config.KBSelectionMode == "selected" && len(agent.Config.KnowledgeBases) > 0 && s.kbService != nil {
|
||||
for _, kbID := range agent.Config.KnowledgeBases {
|
||||
kb, err := s.kbService.GetRepository().GetKnowledgeBaseByIDAndTenant(ctx, kbID, agent.TenantID)
|
||||
if err != nil || kb == nil {
|
||||
continue
|
||||
}
|
||||
if kb.CreatorID != "" && kb.CreatorID == agent.CreatedBy && kb.VersionState == "" {
|
||||
ctx = accesspolicy.WithExecutionDependency(ctx, agent.TenantID, "knowledge", kb.ID, kb.CreatorID)
|
||||
}
|
||||
}
|
||||
}
|
||||
for _, fusionID := range agent.Config.FusionAgentIDs {
|
||||
child, err := s.repo.GetAgentByID(ctx, fusionID, agent.TenantID)
|
||||
if err != nil || child == nil {
|
||||
return ctx, apperrors.NewForbiddenError("融合 Agent 已删除或不可用")
|
||||
}
|
||||
if child.CreatedBy != "" && child.CreatedBy == agent.CreatedBy {
|
||||
ctx = accesspolicy.WithExecutionDependency(ctx, agent.TenantID, "agents", child.ID, child.CreatedBy)
|
||||
}
|
||||
ctx, err = s.prepareAgentExecution(ctx, fusionID, visiting, visited)
|
||||
if err != nil {
|
||||
return ctx, err
|
||||
}
|
||||
}
|
||||
return ctx, nil
|
||||
}
|
||||
Reference in New Issue
Block a user