c8559676ed
executus CI / test (push) Has been cancelled
Merges the skill half of the persona/skill pair plus the second nested module. (Squashed onto main from phase-4b-skill; the audit/budget/persona batteries it was stacked on already landed via the P4 merge.) - skill/: clean-redesign Skill noun + LEAN SkillStore (lifecycle/versions/ schedule only) + ToRunnable + Memory default. - contrib/store/: separate go.mod carrying modernc.org/sqlite, so the driver never enters the core go.sum. db.Budget()/Personas()/Skills()/Audit() back all four store seams (JSON-blob + indexed columns; round-trip tested). Includes the verified gadfly #5 fixes (AppendVersion tx+UNIQUE+error, Mark*ScheduledRun atomic json_set, busy_timeout, NaN guard). - CI: builds + tests the nested module and asserts it owns the sqlite driver. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
36 lines
1.2 KiB
Go
36 lines
1.2 KiB
Go
package skill
|
|
|
|
import (
|
|
"time"
|
|
|
|
"gitea.stevedudenhoeffer.com/steve/executus/run"
|
|
)
|
|
|
|
// ToRunnable lowers a saved Skill into the kernel's run.RunnableAgent DTO, so
|
|
// run.Executor can run a skill WITHOUT importing this battery (the inversion of
|
|
// mort's skillexec running a skills.Skill). Maps the static shape only; the
|
|
// skill's input schema → prompt rendering, palette resolution, audit, etc. are
|
|
// supplied separately (the host renders inputs into the input string and wires
|
|
// run.Ports). A skill exposes a flat tool list (no SkillPalette/SubAgentPalette
|
|
// — composition is a host concern), so those stay empty.
|
|
func (s *Skill) ToRunnable() run.RunnableAgent {
|
|
return run.RunnableAgent{
|
|
ID: s.ID,
|
|
Name: s.Name,
|
|
SystemPrompt: s.SystemPrompt,
|
|
ModelTier: s.ModelTier,
|
|
MaxIterations: s.MaxIterations,
|
|
MaxRuntime: s.MaxRuntime,
|
|
LowLevelTools: s.Tools,
|
|
}
|
|
}
|
|
|
|
// DueAt reports whether a scheduled skill is due at now (cron empty => never).
|
|
// Convenience for a host scheduler that doesn't want to re-parse the cron.
|
|
func (s *Skill) DueAt(now time.Time) bool {
|
|
if s.Schedule == "" || s.NextRunAt.IsZero() {
|
|
return false
|
|
}
|
|
return !s.NextRunAt.After(now)
|
|
}
|