From 3c54a674162e794ac87cdc92434395c8ddb35870 Mon Sep 17 00:00:00 2001 From: Sunyc <165354365+Sycun@users.noreply.github.com> Date: Tue, 28 Jul 2026 11:18:58 +0800 Subject: [PATCH] =?UTF-8?q?fix(project):=20=E5=85=81=E8=AE=B8=20fact=5Fkey?= =?UTF-8?q?=20=E9=A9=BC=E5=B3=B0=E5=91=BD=E5=90=8D=E5=B9=B6=E6=BE=84?= =?UTF-8?q?=E6=B8=85=E6=9C=AA=E7=BB=91=E5=AE=9A=E9=A1=B9=E7=9B=AE=E6=8E=88?= =?UTF-8?q?=E6=9D=83=E6=8A=A5=E9=94=99=20(#200)=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fact_key 校验放开大写字母,支持驼峰命名(如 finding/info-disclosure-messageBundle): - internal/database/project.go: 正则 ^[a-z0-9]... 改为 ^[a-zA-Z0-9]...,并更新错误提示 - internal/project/fact_body_links.go: body 解析正则(依赖事实/相关 fact_key)同步放开大写 - authorizeProjectTool 区分「未绑定项目 / 查询出错 / 真实无权限」三种情况: 未绑定项目时返回明确可执行提示,替代误导性的 no access to project - internal/app/mcp_authorization.go Co-authored-by: sycmacmini --- internal/app/mcp_authorization.go | 8 +++++++- internal/database/project.go | 4 ++-- internal/project/fact_body_links.go | 4 ++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/internal/app/mcp_authorization.go b/internal/app/mcp_authorization.go index cd933a79..6526de7d 100644 --- a/internal/app/mcp_authorization.go +++ b/internal/app/mcp_authorization.go @@ -382,7 +382,13 @@ func authorizeProjectTool(ctx context.Context, principal authctx.Principal, db * return fmt.Errorf("no access to conversation %s", conversationID) } projectID, err := db.GetConversationProjectID(conversationID) - if err != nil || strings.TrimSpace(projectID) == "" || !db.UserCanAccessResource(principal.UserID, principal.ScopeFor(permission), "project", projectID) { + if err != nil { + return fmt.Errorf("no access to project: %w", err) + } + if strings.TrimSpace(projectID) == "" { + return fmt.Errorf("当前对话未绑定项目,无法使用项目黑板工具,请先在对话中选择项目或创建带项目的对话") + } + if !db.UserCanAccessResource(principal.UserID, principal.ScopeFor(permission), "project", projectID) { return fmt.Errorf("no access to project %s", projectID) } return nil diff --git a/internal/database/project.go b/internal/database/project.go index df2604eb..c2201267 100644 --- a/internal/database/project.go +++ b/internal/database/project.go @@ -10,7 +10,7 @@ import ( "github.com/google/uuid" ) -var factKeyPattern = regexp.MustCompile(`^[a-z0-9][a-z0-9._/-]*$`) +var factKeyPattern = regexp.MustCompile(`^[a-zA-Z0-9][a-zA-Z0-9._/-]*$`) // ValidateFactKey 校验事实 key(项目内唯一标识)。 func ValidateFactKey(key string) error { @@ -22,7 +22,7 @@ func ValidateFactKey(key string) error { return fmt.Errorf("fact_key 过长(最多 128 字符)") } if !factKeyPattern.MatchString(key) { - return fmt.Errorf("fact_key 格式无效,仅允许小写字母、数字及 . _ / -,且须以小写字母或数字开头") + return fmt.Errorf("fact_key 格式无效,仅允许字母、数字及 . _ / -,且须以字母或数字开头(支持驼峰命名)") } return nil } diff --git a/internal/project/fact_body_links.go b/internal/project/fact_body_links.go index 0ec69328..8c0bd39c 100644 --- a/internal/project/fact_body_links.go +++ b/internal/project/fact_body_links.go @@ -9,8 +9,8 @@ import ( ) var ( - bodyDepFactLine = regexp.MustCompile(`(?im)^[\s\-*]*依赖事实\s*[::]\s*([a-z0-9][a-z0-9._/-]*)`) - bodyRelFactLine = regexp.MustCompile(`(?im)^[\s\-*]*相关\s*fact_key\s*[::]\s*([a-z0-9][a-z0-9._/-]*)`) + bodyDepFactLine = regexp.MustCompile(`(?im)^[\s\-*]*依赖事实\s*[::]\s*([a-zA-Z0-9][a-zA-Z0-9._/-]*)`) + bodyRelFactLine = regexp.MustCompile(`(?im)^[\s\-*]*相关\s*fact_key\s*[::]\s*([a-zA-Z0-9][a-zA-Z0-9._/-]*)`) bodyAssocSection = regexp.MustCompile(`(?im)^##\s*关联\s*$`) bodySyncLinksHead = "结构化关系边(自动同步)" )