refactor(workspace): extract layered resolver pipeline for workspace path computation

Replace inline workspace path computation in loop_context.go with composable
WorkspaceLayer pipeline (tenant → team → project → user/chat). Each layer is
a pure function that appends a path segment or is a no-op.

- New workspace_resolver.go: ResolveWorkspace, TenantLayer, TeamLayer,
  ProjectLayer (future), UserChatLayer, SanitizePathSegment
- 16 unit tests covering all layer combinations
- Migrate loop_context.go, loop_history.go, team_tasks_mutations.go
- Move sanitizePathSegment from agent to tools package (exported)
- Zero behavior change — identical paths for all scenarios
This commit is contained in:
viettranx committed 2026-03-25 16:03:31 +07:00
1 parent 28a17c4d6b
commit 4b780bbffa
6 files changed
+323 -66

No files matched your search

-13
View File
@@ -10,19 +10,6 @@ import (
"github.com/nextlevelbuilder/goclaw/internal/tools"
)
// sanitizePathSegment makes a userID safe for use as a directory name.
// Replaces colons, spaces, and other unsafe chars with underscores.
func sanitizePathSegment(s string) string {
var b strings.Builder
for _, r := range s {
if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') || (r >= '0' && r <= '9') || r == '-' || r == '_' {
b.WriteRune(r)
} else {
b.WriteByte('_')
}
}
return b.String()
}
// scanWebToolResult checks web_fetch/web_search tool results for prompt injection patterns.
// If detected, prepends a warning (doesn't block — may be false positive).