Apply namespace scopes to inspections and diagnostics

This commit is contained in:
2026-10-17 06:17:16 +00:00
parent aa54b8d1c4
commit 15f79ce7b1
6 changed files with 186 additions and 30 deletions

View File

@@ -153,7 +153,9 @@ func New(cfg Config, options Options) (*Engine, error) {
}
// WithNamespaces returns an immutable view sharing this engine's assembled
// collaborators and configuration snapshot.
// collaborators and configuration snapshot. Caller-supplied selection IDs are
// qualified at each operation boundary; captured configuration references are
// not rewritten.
func (e *Engine) WithNamespaces(prompt, profile, backend string) *Engine {
view := *e
view.namespaces = resourceNamespaces{prompt: prompt, profile: profile, backend: backend}
@@ -198,15 +200,34 @@ func fileSource(name string) (fs.FS, string, string, error) {
}
func (e *Engine) InspectPrompt(ctx context.Context, id string) (*domain.PromptInspection, error) {
var err error
id, err = e.qualifyResourceID(id, e.namespaces.prompt, "prompt")
if err != nil {
return nil, err
}
return e.runner.InspectPrompt(ctx, id)
}
func (e *Engine) InspectRequirements(
ctx context.Context,
request usecase.RequirementInspectionRequest,
) (*domain.RequirementInspection, error) {
var err error
request.PromptID, err = e.qualifyResourceID(request.PromptID, e.namespaces.prompt, "prompt")
if err != nil {
return nil, err
}
request.ProfileID, err = e.qualifyResourceID(request.ProfileID, e.namespaces.profile, "profile")
if err != nil {
return nil, err
}
return e.runner.InspectRequirements(ctx, request)
}
func (e *Engine) InspectProfile(ctx context.Context, id string) (*domain.ProfileInspection, error) {
var err error
id, err = e.qualifyResourceID(id, e.namespaces.profile, "profile")
if err != nil {
return nil, err
}
return e.runner.InspectProfile(ctx, id)
}
@@ -240,21 +261,29 @@ func (e *Engine) Run(ctx context.Context, request domain.RunRequest) (*domain.Ru
}
func (e *Engine) qualifyRunRequest(request domain.RunRequest) (domain.RunRequest, error) {
var ok bool
if request.PromptID != "" {
request.PromptID, ok = domain.QualifyResourceID(request.PromptID, e.namespaces.prompt)
if !ok {
return domain.RunRequest{}, fmt.Errorf("%w: invalid prompt ID", usecase.ErrInvalidRequest)
}
var err error
request.PromptID, err = e.qualifyResourceID(request.PromptID, e.namespaces.prompt, "prompt")
if err != nil {
return domain.RunRequest{}, err
}
if request.ProfileID != "" {
request.ProfileID, ok = domain.QualifyResourceID(request.ProfileID, e.namespaces.profile)
if !ok {
return domain.RunRequest{}, fmt.Errorf("%w: invalid profile ID", usecase.ErrInvalidRequest)
}
request.ProfileID, err = e.qualifyResourceID(request.ProfileID, e.namespaces.profile, "profile")
if err != nil {
return domain.RunRequest{}, err
}
return request, nil
}
func (e *Engine) qualifyResourceID(id, namespace, kind string) (string, error) {
if id == "" {
return "", nil
}
qualified, ok := domain.QualifyResourceID(id, namespace)
if !ok {
return "", fmt.Errorf("%w: invalid %s ID", usecase.ErrInvalidRequest, kind)
}
return qualified, nil
}
func (e *Engine) RunPrepared(ctx context.Context, prepared *usecase.PreparedExecution) (*domain.RunResult, error) {
return e.runner.RunPrepared(ctx, prepared)
}
@@ -263,5 +292,18 @@ func (e *Engine) SmokeTest(ctx context.Context, request domain.SmokeTestRequest)
if e == nil || e.smokeTester == nil {
return nil, fmt.Errorf("%w: smoke tester is not configured", usecase.ErrInvalidRequest)
}
var err error
request.PromptID, err = e.qualifyResourceID(request.PromptID, e.namespaces.prompt, "prompt")
if err != nil {
return nil, err
}
request.ProfileID, err = e.qualifyResourceID(request.ProfileID, e.namespaces.profile, "profile")
if err != nil {
return nil, err
}
request.BackendID, err = e.qualifyResourceID(request.BackendID, e.namespaces.backend, "backend")
if err != nil {
return nil, err
}
return e.smokeTester.Run(ctx, request)
}