+// promptTools returns the function tools of every call of the agent: the tools
+// of promptSubagentTools, then spawn, tell, the WhatsApp tools, and the
+// schedule tools. A compaction sends them too and never calls them, because a
+// change of the tools ends the shared prompt cache.
+func promptTools() []ModelTool {
+ return append(promptSubagentTools(), ModelTool{
+ Type: "function",
+ Name: "spawn",
+ Description: `Start one subagent per task, in parallel, and return their names at once. Each one's report reaches you as a message "[Name] report" when it finishes. A subagent sees the view and the user's instructions, but knows what you want only from its task.`,
+ Parameters: promptObjectSchema(map[string]any{
+ "tasks": map[string]any{
+ "type": "array",
+ "items": map[string]any{"type": "string"},
+ "description": "One task for each subagent, with all it needs to know.",
+ },
+ "effort": map[string]any{
+ "type": []string{"string", "null"},
+ "enum": promptEffortEnum(),
+ "description": "How hard they think; null for as hard as you.",
+ },
+ }),
+ Strict: true,
+ }, ModelTool{
+ Type: "function",
+ Name: "tell",
+ Description: `Send a message to a subagent, by name. One at work reads it between its tool calls, and its report answers it; a finished one goes on from its chat, and its reply reaches you as a message "[Name] reply".`,
+ Parameters: promptObjectSchema(map[string]any{
+ "name": promptStringSchema("The name of the subagent."),
+ "message": promptStringSchema("The message."),
+ }),
+ Strict: true,
+ }, ModelTool{
+ Type: "function",
+ Name: "whatsapp_find",
+ Description: "Find the WhatsApp contacts and groups of the user whose name contains the text, with no regard to case and accents. Gives up to 20 matches, each as ID | name | contact or group. Give the ID to whatsapp_send.",
+ Parameters: promptObjectSchema(map[string]any{
+ "name": promptStringSchema("A part of the name of the contact or the group."),
+ }),
+ Strict: true,
+ }, ModelTool{
+ Type: "function",
+ Name: "whatsapp_send",
+ Description: "Send a text message to a WhatsApp chat. Send only a message that the user asked you to send, to the chat that the user named. Give a new id for each message: a call with an id that was used gives the answer of the first call and sends nothing.",
+ Parameters: promptObjectSchema(map[string]any{
+ "id": promptStringSchema("A new id for this message, such as a short random word."),
+ "chat": promptStringSchema("The ID of the chat, from whatsapp_find or from a [WhatsApp] message."),
+ "text": promptStringSchema("The text of the message."),
+ }),
+ Strict: true,
+ }, ModelTool{
+ Type: "function",
+ Name: "schedule_set",
+ Description: `Set a reminder or a timed task, only when the user asks for one. At its time, the text reaches you as a message "[Schedule ID]" that starts a turn, and you do the task then. Give at for one time, or cron for a repeating schedule, and null for the other. Turn a time such as "tomorrow at 9" into a local time from the Now line.`,
+ Parameters: promptObjectSchema(map[string]any{
+ "text": promptStringSchema(`The task for you at that time, as an order to yourself, with all you need to know, such as "Remind the user to drink water."`),
+ "at": promptNullableStringSchema("A local time YYYY-MM-DD HH:MM after now, or null."),
+ "cron": promptNullableStringSchema(`A cron expression of five fields, minute hour day-of-month month day-of-week, with *, lists, ranges, and steps, such as "0 8 * * 1-5", or null. Its runs must be at least 5 minutes apart.`),
+ }),
+ Strict: true,
+ }, ModelTool{
+ Type: "function",
+ Name: "schedule_list",
+ Description: "List the schedules by their next time, each as ID | next time | cron expression or once | text.",
+ Parameters: promptObjectSchema(map[string]any{}),
+ Strict: true,
+ }, ModelTool{
+ Type: "function",
+ Name: "schedule_remove",
+ Description: "Remove a schedule by its ID, when the user asks.",
+ Parameters: promptObjectSchema(map[string]any{
+ "id": promptIntegerSchema("The ID of the schedule."),
+ }),
+ Strict: true,
+ })
+}
+
+// promptSubagentTools returns the function tools of a subagent: zoom, date,
+// shell, read, write, and edit.
+func promptSubagentTools() []ModelTool {