8ecdadf8b8
executus CI / test (push) Successful in 3m21s
Lifts the 'an agent uses a SKILL.md pack' concept out of a host and into the harness: - run.Ports.SkillPacks (SkillPackActivator) — nil-safe port; the executor folds a loaded agent's pack catalog into the system prompt and adds a skill_use loader tool to the toolbox (uses the existing ra.SystemPrompt + toolbox seams) - run.RunnableAgent.SkillPacks + persona.Agent.SkillPacks (+ skill_packs YAML, extends-inherit, ToRunnable) — the Agent noun is now pack-aware - skillpack.Activator — the battery's default port impl (resolve names → packs → catalog + skill_use), with a per-run BundleStager factory the host plumbs; satisfies the port structurally (no import of run) - agentbuiltins: ships gifsmith, a portable focused GIF/MP4 render agent that uses the gif pack — references tool/tier/pack NAMES only, no host coupling A host now wires run.Ports.SkillPacks instead of carrying its own activation glue. Tests: Activator resolution + gifsmith loads through persona→RunnableAgent. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
43 lines
1.3 KiB
Go
43 lines
1.3 KiB
Go
package agentbuiltins_test
|
|
|
|
import (
|
|
"context"
|
|
"slices"
|
|
"testing"
|
|
|
|
"gitea.stevedudenhoeffer.com/steve/executus/agentbuiltins"
|
|
"gitea.stevedudenhoeffer.com/steve/executus/persona"
|
|
)
|
|
|
|
// TestGifsmithLoads proves executus's shipped gifsmith manifest flows through
|
|
// the persona loader and lowers into a RunnableAgent carrying the gif pack — the
|
|
// path a host uses to dogfood it.
|
|
func TestGifsmithLoads(t *testing.T) {
|
|
ctx := context.Background()
|
|
store := persona.NewMemory()
|
|
n, err := persona.LoadBuiltinAgents(ctx, store, agentbuiltins.FS(), nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if n < 1 {
|
|
t.Fatalf("expected gifsmith seeded, got %d", n)
|
|
}
|
|
a, err := store.GetAgentByName(ctx, persona.BuiltinAgentOwnerID, "gifsmith")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(a.SkillPacks) != 1 || a.SkillPacks[0] != "gif" {
|
|
t.Errorf("skill_packs = %v", a.SkillPacks)
|
|
}
|
|
if a.ModelTier != "thinking" {
|
|
t.Errorf("model_tier = %q (want a portable tier name)", a.ModelTier)
|
|
}
|
|
if !slices.Contains(a.LowLevelTools, "code_exec") || !slices.Contains(a.LowLevelTools, "send_attachments") {
|
|
t.Errorf("low_level_tools missing render/deliver tools: %v", a.LowLevelTools)
|
|
}
|
|
// The pack must survive the lowering the executor consumes.
|
|
if ra := a.ToRunnable(); len(ra.SkillPacks) != 1 || ra.SkillPacks[0] != "gif" {
|
|
t.Errorf("RunnableAgent.SkillPacks = %v", ra.SkillPacks)
|
|
}
|
|
}
|