fa4a48d5e7
* chore: remove orphan executor tracing file and deprecated ResolveScript wrappers - Delete internal/agentctl/tracing/executor.go (7 TraceExecutor* funcs) - Delete internal/orchestrator/executor/script_template.go (deprecated wrapper) - Delete scriptengine.ResolveScript convenience function Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: remove orphan setter methods across healthpoll, jira, linear, slack, updates - Delete Poller.SetInterval from integrations/healthpoll (no callers) - Delete Poller.SetIssueTickHook from jira and linear (no callers) - Delete Trigger.SetInterval and Trigger.SetMatchHook from slack (no callers) - Delete Service.SetPollInterval from system/updates (no callers) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: remove orphan wrapper functions and accessor method - Delete updates.FetchLatestRelease shim (wraps FetchLatestReleaseFrom, no callers) - Delete usage.NewClaudeUsageClient and NewCodexUsageClient shims (no callers) - Delete database.Service.Path() accessor (no callers) - Update ErrGitHubRateLimited godoc to reference FetchLatestReleaseFrom Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: remove unwired handleListExecutors MCP handler The sibling profile handlers (list/create/update/delete) are registered via RegisterFunc in handlers.go. handleListExecutors never was — dead flow. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: remove stale hook-field comments after setter deletion SetIssueTickHook (jira, linear) and SetMatchHook (slack) were removed in the deadcode cleanup. Their struct fields still claimed "tests use this" — no test or caller can set these fields now. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: remove orphan hook fields and fire methods after setter deletion issueTickHook (jira/linear) and matchHook (slack) are unexported and never set after their public setters were removed; fireIssueTickHook / fireHook were permanent no-ops. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Kandev Agent <agent@kandev.dev> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
65 lines
1.7 KiB
Go
65 lines
1.7 KiB
Go
// Package scriptengine provides executor-agnostic script resolution with dynamic placeholders.
|
|
// It is designed to be reusable by any executor type (Sprites, Docker, remote SSH, etc.).
|
|
package scriptengine
|
|
|
|
import (
|
|
"maps"
|
|
"strings"
|
|
)
|
|
|
|
// PlaceholderProvider supplies dynamic placeholder values at resolution time.
|
|
type PlaceholderProvider func() map[string]string
|
|
|
|
// Resolver resolves {{key}} placeholders in scripts.
|
|
type Resolver struct {
|
|
staticVars map[string]string
|
|
providers []PlaceholderProvider
|
|
}
|
|
|
|
// NewResolver creates a new placeholder resolver.
|
|
func NewResolver() *Resolver {
|
|
return &Resolver{
|
|
staticVars: make(map[string]string),
|
|
}
|
|
}
|
|
|
|
// WithStatic registers static key-value placeholders.
|
|
func (r *Resolver) WithStatic(vars map[string]string) *Resolver {
|
|
maps.Copy(r.staticVars, vars)
|
|
return r
|
|
}
|
|
|
|
// WithProvider registers a dynamic placeholder provider.
|
|
func (r *Resolver) WithProvider(p PlaceholderProvider) *Resolver {
|
|
r.providers = append(r.providers, p)
|
|
return r
|
|
}
|
|
|
|
// Resolve replaces all {{key}} placeholders in the script.
|
|
// Unknown placeholders are left as-is so the user can see what wasn't resolved.
|
|
func (r *Resolver) Resolve(script string) string {
|
|
if script == "" {
|
|
return script
|
|
}
|
|
vars := r.mergedVars()
|
|
if len(vars) == 0 {
|
|
return script
|
|
}
|
|
result := script
|
|
for key, value := range vars {
|
|
result = strings.ReplaceAll(result, "{{"+key+"}}", value)
|
|
}
|
|
return result
|
|
}
|
|
|
|
// mergedVars collects all static vars and dynamic provider vars into a single map.
|
|
// Provider values override static values if keys collide.
|
|
func (r *Resolver) mergedVars() map[string]string {
|
|
merged := make(map[string]string, len(r.staticVars))
|
|
maps.Copy(merged, r.staticVars)
|
|
for _, p := range r.providers {
|
|
maps.Copy(merged, p())
|
|
}
|
|
return merged
|
|
}
|