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

This commit is contained in:
yawan
2026-09-22 16:19:06 +08:00
commit f7fc992f57
3929 changed files with 1006607 additions and 0 deletions
@@ -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
}