p2.4: restricted workspace for permitted callers

guardian-star context is allowed only when the authenticated caller is in
permit_restricted and mapped to that workspace. Fleet callers remapped to it
still refuse. CLI client.toml: SIFT_CLIENT, then $HERMES_HOME/sift, then ~/.config.
This commit is contained in:
2026-09-23 08:33:58 -07:00
parent 14eb7808ce
commit e36da19f57
10 changed files with 159 additions and 42 deletions
+28 -15
View File
@@ -1,4 +1,7 @@
// Package fleetctx is Honcho retrieval for sift. Read-only. Never guardian-star.
// Package fleetctx is Honcho retrieval for sift. Read-only.
// The restricted workspace (guardian-star) is reachable only when the
// authenticated caller is in Client.Permit and the caller's mapped workspace
// is that name. Workspace is never taken from the request.
package fleetctx
import (
@@ -17,10 +20,10 @@ import (
)
const (
Forbidden = "guardian-star"
Timeout = 3 * time.Second
Limit = 5
MaxChars = 300
Restricted = "guardian-star"
Timeout = 3 * time.Second
Limit = 5
MaxChars = 300
)
type Item struct {
@@ -33,6 +36,7 @@ type Item struct {
type Client struct {
Base string
Allow []string
Permit []string // caller names allowed to query Restricted
HTTP *http.Client
Log *slog.Logger
Calls atomic.Uint64
@@ -40,8 +44,20 @@ type Client struct {
Failures atomic.Uint64
}
func refused(ws string) bool {
return strings.EqualFold(strings.TrimSpace(ws), Forbidden)
func restricted(ws string) bool {
return strings.EqualFold(strings.TrimSpace(ws), Restricted)
}
func permitted(caller string, permit []string) bool {
if caller == "" {
return false
}
for _, p := range permit {
if p == caller {
return true
}
}
return false
}
var workspaceName = regexp.MustCompile(`^[A-Za-z0-9_-]+$`)
@@ -51,9 +67,6 @@ func workspaceOK(ws string) bool {
}
func allowed(ws string, allow []string) bool {
if refused(ws) {
return false
}
for _, a := range allow {
if a == ws {
return true
@@ -62,15 +75,15 @@ func allowed(ws string, allow []string) bool {
return false
}
// Search returns prior fleet knowledge. Failure → (nil, warning). Never an error
// that fails the fetch. guardian-star is refused in code, not only config.
func (c *Client) Search(ctx context.Context, workspace, query string) (items []Item, warn string) {
// Search returns prior knowledge for workspace. Failure → (nil, warning). Never
// an error that fails the fetch. Restricted workspace requires caller ∈ Permit.
func (c *Client) Search(ctx context.Context, workspace, caller, query string) (items []Item, warn string) {
if c == nil || query == "" {
return nil, ""
}
if refused(workspace) {
if restricted(workspace) && !permitted(caller, c.Permit) {
if c.Log != nil {
c.Log.Warn("context refused", "workspace", workspace)
c.Log.Warn("context refused", "workspace", workspace, "caller", caller)
}
c.Failures.Add(1)
return nil, "context refused: workspace"