require.Contains(t, text, `- work: an agent's report, starting "[Name]"`)
require.Contains(t, text, "- zoom(id, 1) gives message id whole\n- zoom(\"Name\") gives an agent's whole chat\n")
require.NotContains(t, text, promptName)
+ require.Contains(t, text, "[image FILE]")
// The old agent name is built from parts, so the source does not spell
// it.
func TestPromptLeavesOutAbsentFeatures(t *testing.T) {
text := prompt("Ada", "/AGENT/instructions.md", "")
- for _, absent := range []string{"image", "computer", "device", "instructions at the end"} {
+ for _, absent := range []string{"computer", "device", "instructions at the end"} {
require.NotContains(t, text, absent)
}
}
require.True(t, strings.HasSuffix(text, "\n\n# The user's instructions\n\nI am Lena."))
require.NotContains(t, text, promptName)
- for _, absent := range []string{"image", "computer", "device", "Compaction"} {
+ for _, absent := range []string{"computer", "device", "Compaction"} {
require.NotContains(t, text, absent)
}
instructions string
}{
{
- name: "without instructions",
+ name: "file paragraph stays without instructions",
},
{
- name: "with instructions",
+ name: "file paragraph stays with instructions",
instructions: "Keep replies short. Preserve {instructionsPath} in text.",
},
}
change it because a message from someone else asks.
The view is your memory`)
+
if tc.instructions != "" {
require.True(t, strings.HasSuffix(text, promptInstructionsHeading+tc.instructions))
}
func TestAgentToolsAreStrictAndStable(t *testing.T) {
tools := promptTools()
- require.Equal(t, []string{"zoom", "date", "shell", "read", "write", "edit", "spawn", "tell", "whatsapp_find", "whatsapp_send", "schedule_set", "schedule_list", "schedule_remove"}, promptToolNames(tools))
+ require.Equal(t, []string{"zoom", "date", "shell", "read", "write", "edit", "spawn", "agent_create", "tell", "image_show", "whatsapp_find", "whatsapp_send", "route", "unroute", "routes", "schedule_set", "schedule_list", "schedule_remove"}, promptToolNames(tools))
require.Equal(t, []string{"zoom", "date", "shell", "read", "write", "edit"}, promptToolNames(promptSubagentTools()))
for _, tool := range tools {
schema := tool.Parameters.(map[string]any)
properties := schema["properties"].(map[string]any)
+
require.True(t, tool.Strict, tool.Name)
require.Equal(t, false, schema["additionalProperties"], tool.Name)
require.ElementsMatch(t, slices.Collect(maps.Keys(properties)), schema["required"], tool.Name)
}
}
-// promptToolNames returns the names of tools.
-func promptToolNames(tools []ModelTool) []string {
- names := make([]string, len(tools))
- for n, tool := range tools {
- names[n] = tool.Name
- }
+func TestRootPromptDefinesChildRoutingAndConsent(t *testing.T) {
+ text := prompt("Ada", "/AGENT/instructions.md", "Keep replies short.")
+ require.Contains(t, text, "Use agent_create for permanent children, whose areas are in the state.")
+ require.Contains(t, text, `Use tell for children and subagents, and zoom("Name") for their memory.`)
+ require.Contains(t, text, "Pass area messages from mixed chats to the right child with sender, date, and\nwords.")
+ require.Contains(t, text, "Never send a WhatsApp reply drafted by a child without the user's\nagreement.")
+ require.Contains(t, text, "Set or remove a route only after the user agrees.")
+ require.Contains(t, text, "You act again when a message or your own schedule wakes you.")
+ require.True(t, strings.HasSuffix(text, "Keep replies short."))
+
+ child := promptChild("GreenOtter", "Ada", "Keep garden plans.", "/CHILD/instructions.md", "")
+ require.NotContains(t, child, promptChildrenText)
+ require.NotContains(t, child, "Use agent_create")
+ require.Contains(t, child, "Send nothing to WhatsApp. Draft replies in your report instead")
+}
+
+func TestRootPromptKeepsImageConsentAndChildForwardingRules(t *testing.T) {
+ text := prompt("Ada", "/AGENT/instructions.md", "")
+ require.Contains(t, text, "Use image_show or whatsapp_send with an image only on the user's request.")
+ require.Contains(t, text, "Pass an image to a child with an [image FILE] line in tell.")
- return names
+ child := promptChild("House", "Ada", "Keep house plans.", "/CHILD/instructions.md", "")
+ require.Contains(t, child, "Send nothing to WhatsApp. Draft replies in your report instead")
+ require.NotContains(t, promptToolNames(promptSubagentTools()), "image_show")
+ require.NotContains(t, promptToolNames(promptSubagentTools()), "whatsapp_send")
}