improvement(wand): added more wands (#2756)

* added wand configs

* fixed greptile comments
This commit is contained in:
Adam Gough
2026-01-09 18:41:51 -08:00
committed by GitHub
parent 1dbd16115f
commit fd76e98f0e
6 changed files with 401 additions and 6 deletions

View File

@@ -73,6 +73,33 @@ export const GoogleSheetsBlock: BlockConfig<GoogleSheetsResponse> = {
title: 'Range',
type: 'short-input',
placeholder: 'Sheet name and cell range (e.g., Sheet1!A1:D10)',
wandConfig: {
enabled: true,
prompt: `Generate a valid Google Sheets range based on the user's description.
### VALID FORMATS
1. Sheet name only (for appending to end): Sheet1
2. Full range (for reading/writing specific cells): Sheet1!A1:D10
### RANGE RULES
- Sheet names with spaces must be quoted: 'My Sheet'!A1:B10
- Column letters are uppercase: A, B, C, ... Z, AA, AB, etc.
- Row numbers start at 1 (not 0)
- Range format: SheetName!StartCell:EndCell (e.g., Sheet1!A2:C10)
- For a single column: Sheet1!A:A
- For a single row: Sheet1!1:1
### EXAMPLES
- "the first sheet" -> Sheet1
- "data sheet from A1 to E100" -> 'Data Sheet'!A1:E100
- "append to orders sheet" -> Orders
- "cells A1 through C50 on Sheet2" -> Sheet2!A1:C50
- "column A of inventory" -> Inventory!A:A
- "just the headers row" -> Sheet1!1:1
Return ONLY the range string - no explanations, no quotes around the entire output, no extra text.`,
placeholder: 'Describe the range (e.g., "all data from Sheet1" or "A1 to D50")...',
},
},
// Write-specific Fields
{

View File

@@ -70,6 +70,33 @@ export const MicrosoftExcelBlock: BlockConfig<MicrosoftExcelResponse> = {
type: 'short-input',
placeholder: 'Sheet name and cell range (e.g., Sheet1!A1:D10)',
condition: { field: 'operation', value: ['read', 'write', 'update'] },
wandConfig: {
enabled: true,
prompt: `Generate a valid Microsoft Excel range based on the user's description.
### FORMAT (REQUIRED)
SheetName!StartCell:EndCell
Excel ALWAYS requires the full range format with both sheet name and cell range.
### RANGE RULES
- Sheet names with spaces must be quoted: 'My Sheet'!A1:B10
- Column letters are uppercase: A, B, C, ... Z, AA, AB, etc.
- Row numbers start at 1 (not 0)
- For entire columns: Sheet1!A:Z
- For entire rows: Sheet1!1:100
### EXAMPLES
- "the first sheet" -> Sheet1!A1:Z1000
- "data sheet from A1 to E100" -> 'Data Sheet'!A1:E100
- "cells A1 through C50 on Sheet2" -> Sheet2!A1:C50
- "column A of inventory" -> Inventory!A:A
- "just the headers row on Sheet1" -> Sheet1!1:1
- "all data on sales sheet" -> 'Sales'!A1:Z1000
Return ONLY the range string - no explanations, no quotes around the entire output, no extra text.`,
placeholder: 'Describe the range (e.g., "A1 to D50 on Sheet1")...',
},
},
{
id: 'tableName',
@@ -95,6 +122,22 @@ export const MicrosoftExcelBlock: BlockConfig<MicrosoftExcelResponse> = {
'Enter values as JSON array of arrays (e.g., [["A1", "B1"], ["A2", "B2"]]) or an array of objects (e.g., [{"name":"John", "age":30}, {"name":"Jane", "age":25}])',
condition: { field: 'operation', value: 'write' },
required: true,
wandConfig: {
enabled: true,
prompt: `Generate Microsoft Excel data as a JSON array based on the user's description.
Format options:
1. Array of arrays: [["Header1", "Header2"], ["Value1", "Value2"]]
2. Array of objects: [{"column1": "value1", "column2": "value2"}]
Examples:
- "sales data with product and revenue columns" -> [["Product", "Revenue"], ["Widget A", 1500], ["Widget B", 2300]]
- "list of employees with name and email" -> [{"name": "John Doe", "email": "john@example.com"}, {"name": "Jane Smith", "email": "jane@example.com"}]
Return ONLY the JSON array - no explanations, no markdown, no extra text.`,
placeholder: 'Describe the data you want to write...',
generationType: 'json-object',
},
},
{
id: 'valueInputOption',
@@ -114,6 +157,22 @@ export const MicrosoftExcelBlock: BlockConfig<MicrosoftExcelResponse> = {
'Enter values as JSON array of arrays (e.g., [["A1", "B1"], ["A2", "B2"]]) or an array of objects (e.g., [{"name":"John", "age":30}, {"name":"Jane", "age":25}])',
condition: { field: 'operation', value: 'update' },
required: true,
wandConfig: {
enabled: true,
prompt: `Generate Microsoft Excel data as a JSON array based on the user's description.
Format options:
1. Array of arrays: [["Header1", "Header2"], ["Value1", "Value2"]]
2. Array of objects: [{"column1": "value1", "column2": "value2"}]
Examples:
- "update with new prices" -> [["Product", "Price"], ["Widget A", 29.99], ["Widget B", 49.99]]
- "quarterly targets" -> [{"Q1": 10000, "Q2": 12000, "Q3": 15000, "Q4": 18000}]
Return ONLY the JSON array - no explanations, no markdown, no extra text.`,
placeholder: 'Describe the data you want to update...',
generationType: 'json-object',
},
},
{
id: 'valueInputOption',
@@ -133,6 +192,25 @@ export const MicrosoftExcelBlock: BlockConfig<MicrosoftExcelResponse> = {
'Enter values as JSON array of arrays (e.g., [["A1", "B1"], ["A2", "B2"]]) or an array of objects (e.g., [{"name":"John", "age":30}, {"name":"Jane", "age":25}])',
condition: { field: 'operation', value: 'table_add' },
required: true,
wandConfig: {
enabled: true,
prompt: `Generate Microsoft Excel table row data as a JSON array based on the user's description.
Format options:
1. Array of arrays: [["Value1", "Value2"], ["Value3", "Value4"]]
2. Array of objects: [{"column1": "value1", "column2": "value2"}]
Note: When adding to an existing table, do NOT include headers - only data rows.
Examples:
- "add new sales record" -> [["2024-01-15", "Widget Pro", 5, 249.99]]
- "append customer info" -> [{"name": "Acme Corp", "contact": "John Smith", "status": "Active"}]
- "add multiple rows with name, age, city" -> [["Alice", 28, "NYC"], ["Bob", 35, "LA"]]
Return ONLY the JSON array - no explanations, no markdown, no extra text.`,
placeholder: 'Describe the data you want to add to the table...',
generationType: 'json-object',
},
},
],
tools: {

View File

@@ -132,14 +132,108 @@ export const SharepointBlock: BlockConfig<SharepointResponse> = {
type: 'short-input',
placeholder: "Template (e.g., 'genericList')",
condition: { field: 'operation', value: 'create_list' },
wandConfig: {
enabled: true,
prompt: `Generate a SharePoint list template name based on the user's description.
### AVAILABLE TEMPLATES
- genericList - Standard list for general data (default)
- documentLibrary - For storing and managing documents
- survey - For creating surveys and polls
- links - For storing hyperlinks
- announcements - For news and announcements
- contacts - For contact information (name, email, phone)
- events - For calendar events and scheduling
- tasks - For task tracking and project management
- discussionBoard - For team discussions and forums
- pictureLibrary - For storing images and photos
- issue - For issue/bug tracking
### EXAMPLES
- "I want to track tasks" -> tasks
- "store documents" -> documentLibrary
- "team announcements" -> announcements
- "contact list" -> contacts
- "calendar events" -> events
- "general data" -> genericList
- "bug tracking" -> issue
- "photo gallery" -> pictureLibrary
Return ONLY the template name - no explanations, no quotes, no extra text.`,
placeholder: 'Describe what kind of list you need...',
},
},
{
id: 'pageContent',
title: 'Page Content',
id: 'columnDefinitions',
title: 'Column Definitions',
type: 'long-input',
placeholder: 'Provide page content',
placeholder: 'Optional: Define custom columns as JSON array',
condition: { field: 'operation', value: ['create_list'] },
wandConfig: {
enabled: true,
prompt: `Generate a JSON array of SharePoint list column definitions based on the user's description.
### FORMAT
A JSON array of column definition objects. Each column needs at minimum a "name" and column type properties.
### COLUMN TYPES AND PROPERTIES
**Text Column:**
{"name": "ColumnName", "text": {}}
- For single line of text
**Multi-line Text:**
{"name": "ColumnName", "text": {"allowMultipleLines": true}}
**Number Column:**
{"name": "ColumnName", "number": {}}
- Optional: "minimum", "maximum", "decimalPlaces"
**DateTime Column:**
{"name": "ColumnName", "dateTime": {"format": "dateOnly"}}
- format: "dateOnly" or "dateTime"
**Boolean (Yes/No):**
{"name": "ColumnName", "boolean": {}}
**Choice Column:**
{"name": "ColumnName", "choice": {"choices": ["Option1", "Option2", "Option3"]}}
**Person Column:**
{"name": "ColumnName", "personOrGroup": {}}
**Currency:**
{"name": "ColumnName", "currency": {"locale": "en-US"}}
### EXAMPLES
"add columns for status (choice: Active, Completed, On Hold), due date, and priority number"
-> [
{"name": "Status", "choice": {"choices": ["Active", "Completed", "On Hold"]}},
{"name": "DueDate", "dateTime": {"format": "dateOnly"}},
{"name": "Priority", "number": {"minimum": 1, "maximum": 5}}
]
"text column for description, yes/no for completed, date for start"
-> [
{"name": "Description", "text": {"allowMultipleLines": true}},
{"name": "Completed", "boolean": {}},
{"name": "StartDate", "dateTime": {"format": "dateOnly"}}
]
"assignee (person), budget (currency), category (choice: Marketing, Sales, Engineering)"
-> [
{"name": "Assignee", "personOrGroup": {}},
{"name": "Budget", "currency": {"locale": "en-US"}},
{"name": "Category", "choice": {"choices": ["Marketing", "Sales", "Engineering"]}}
]
Return ONLY the JSON array - no explanations, no markdown, no extra text.`,
placeholder:
'Describe the columns you want to add (e.g., "status dropdown, due date, priority number")...',
generationType: 'json-object',
},
},
{
id: 'listDescription',
@@ -164,9 +258,50 @@ export const SharepointBlock: BlockConfig<SharepointResponse> = {
id: 'listItemFields',
title: 'List Item Fields',
type: 'long-input',
placeholder: 'Enter list item fields',
placeholder:
'Enter list item fields as JSON (e.g., {"Title": "My Item", "Status": "Active"})',
canonicalParamId: 'listItemFields',
condition: { field: 'operation', value: ['update_list', 'add_list_items'] },
wandConfig: {
enabled: true,
prompt: `Generate a JSON object for SharePoint list item fields based on the user's description.
### FORMAT
A JSON object where keys are column internal names and values are the data to set.
### RULES
- Use the column's internal name (often same as display name, but spaces become _x0020_)
- Common field names: Title, Status, Description, Priority, DueDate, AssignedTo, Category
- Date fields should use ISO 8601 format: "2024-01-15" or "2024-01-15T10:30:00Z"
- Number fields should be numeric, not strings
- Boolean fields use true/false
- Choice fields use the exact choice value as a string
- Person fields use the person's email or ID
### READ-ONLY FIELDS (automatically filtered out)
Id, UniqueId, GUID, Created, Modified, Author, Editor, ContentTypeId
### EXAMPLES
"set title to Project Alpha and status to In Progress"
-> {"Title": "Project Alpha", "Status": "In Progress"}
"update priority to high and due date to next Friday"
-> {"Priority": "High", "DueDate": "2024-01-19"}
"add task with title Review Document, assigned to john@company.com"
-> {"Title": "Review Document", "AssignedToLookupId": "john@company.com"}
"create contact with name John Smith, email john@example.com, phone 555-1234"
-> {"Title": "John Smith", "Email": "john@example.com", "WorkPhone": "555-1234"}
"set completed to true and notes to Task finished successfully"
-> {"Completed": true, "Notes": "Task finished successfully"}
Return ONLY the JSON object - no explanations, no markdown, no extra text.`,
placeholder: 'Describe the fields and values you want to set...',
generationType: 'json-object',
},
},
// Upload File operation fields
@@ -267,6 +402,7 @@ export const SharepointBlock: BlockConfig<SharepointResponse> = {
includeItems,
uploadFiles,
files,
columnDefinitions,
...others
} = rest as any
@@ -314,7 +450,7 @@ export const SharepointBlock: BlockConfig<SharepointResponse> = {
// Handle file upload files parameter
const fileParam = uploadFiles || files
const baseParams = {
const baseParams: Record<string, any> = {
credential,
siteId: effectiveSiteId || undefined,
pageSize: others.pageSize ? Number.parseInt(others.pageSize as string, 10) : undefined,
@@ -331,6 +467,10 @@ export const SharepointBlock: BlockConfig<SharepointResponse> = {
baseParams.files = fileParam
}
if (columnDefinitions) {
baseParams.pageContent = columnDefinitions
}
return baseParams
},
},
@@ -339,7 +479,10 @@ export const SharepointBlock: BlockConfig<SharepointResponse> = {
operation: { type: 'string', description: 'Operation to perform' },
credential: { type: 'string', description: 'Microsoft account credential' },
pageName: { type: 'string', description: 'Page name' },
pageContent: { type: 'string', description: 'Page content' },
columnDefinitions: {
type: 'string',
description: 'Column definitions for list creation (JSON array)',
},
pageTitle: { type: 'string', description: 'Page title' },
pageId: { type: 'string', description: 'Page ID' },
siteSelector: { type: 'string', description: 'Site selector' },

View File

@@ -402,6 +402,38 @@ Return ONLY the PostgREST filter expression - no explanations, no markdown, no e
type: 'short-input',
placeholder: 'column_name (add DESC for descending)',
condition: { field: 'operation', value: 'query' },
wandConfig: {
enabled: true,
prompt: `Generate a Supabase order by clause based on the user's description.
### FORMAT
column_name [ASC|DESC]
### RULES
- Column name only: sorts ascending by default
- Add DESC after column name for descending order
- Add ASC after column name for ascending order (explicit)
- Column names are case-sensitive and should match your database schema
### COMMON PATTERNS
- Newest first: created_at DESC
- Oldest first: created_at ASC
- Alphabetical: name
- Reverse alphabetical: name DESC
- Highest value first: price DESC
- Lowest value first: price ASC
### EXAMPLES
- "sort by start time newest first" -> start_time DESC
- "order by name alphabetically" -> name
- "sort by created date oldest first" -> created_at ASC
- "highest scores first" -> score DESC
- "sort by updated timestamp descending" -> updated_at DESC
- "order by email" -> email
Return ONLY the order by expression - no explanations, no extra text.`,
placeholder: 'Describe how to sort (e.g., "newest first by created_at")...',
},
},
// Optional limit for query operation
{

View File

@@ -87,6 +87,62 @@ export const TwilioVoiceBlock: BlockConfig<ToolResponse> = {
field: 'operation',
value: 'make_call',
},
wandConfig: {
enabled: true,
prompt: `Generate TwiML (Twilio Markup Language) for outbound voice calls based on the user's description.
### IMPORTANT: Use SQUARE BRACKETS instead of angle brackets
- Use [Tag] instead of <Tag>
- Use [/Tag] instead of </Tag>
- Use [Tag/] for self-closing tags instead of <Tag/>
### COMMON TWIML VERBS
**[Say]** - Text-to-speech
[Say voice="alice"]Hello, this is an automated call.[/Say]
- Voices: alice, man, woman, Polly.Joanna, Polly.Matthew, etc.
**[Play]** - Play audio file
[Play]https://example.com/audio.mp3[/Play]
**[Record]** - Record caller's voice
[Record maxLength="120" transcribe="true"/]
- transcribe="true" to get text transcription
**[Gather]** - Collect keypad input or speech
[Gather input="dtmf speech" timeout="5" numDigits="1"]
[Say]Press 1 to confirm, 2 to cancel.[/Say]
[/Gather]
**[Dial]** - Connect to another number
[Dial]+14155551234[/Dial]
**[Pause]** - Add silence
[Pause length="2"/]
**[Hangup]** - End the call
[Hangup/]
### EXAMPLES
"say hello and deliver a reminder message"
-> [Response][Say voice="alice"]Hello! This is a reminder about your appointment tomorrow at 2 PM. Press 1 to confirm or 2 to reschedule.[/Say][Gather input="dtmf" timeout="10" numDigits="1"/][/Response]
"play a recorded message"
-> [Response][Play]https://example.com/message.mp3[/Play][/Response]
"say a message and record their response"
-> [Response][Say voice="alice"]Hello! Please leave your feedback after the beep.[/Say][Record maxLength="60" transcribe="true"/][Say voice="alice"]Thank you for your feedback. Goodbye.[/Say][/Response]
"simple greeting message"
-> [Response][Say voice="alice"]Hello! This is an automated call from your service provider. Have a great day![/Say][/Response]
"ask a yes or no question"
-> [Response][Say voice="alice"]Hello! Would you like to receive updates? Press 1 for yes, or 2 for no.[/Say][Gather input="dtmf" timeout="10" numDigits="1"/][Say voice="alice"]We didn't receive your response. Goodbye.[/Say][/Response]
Return ONLY the TwiML with square brackets - no explanations, no markdown, no extra text.`,
placeholder: 'Describe what the call should say or do...',
},
},
{
id: 'record',

View File

@@ -48,6 +48,65 @@ export const twilioVoiceWebhookTrigger: TriggerConfig = {
'TwiML instructions to return immediately to Twilio. Use square brackets instead of angle brackets (e.g., [Response] instead of <Response>). This controls what happens when the call comes in (e.g., play a message, record, gather input). Your workflow will execute in the background.',
required: false,
mode: 'trigger',
wandConfig: {
enabled: true,
prompt: `Generate TwiML (Twilio Markup Language) for voice calls based on the user's description.
### IMPORTANT: Use SQUARE BRACKETS instead of angle brackets
- Use [Tag] instead of <Tag>
- Use [/Tag] instead of </Tag>
- Use [Tag/] for self-closing tags instead of <Tag/>
### COMMON TWIML VERBS
**[Say]** - Text-to-speech
[Say voice="alice"]Hello, how can I help you?[/Say]
- Voices: alice, man, woman, Polly.Joanna, Polly.Matthew, etc.
**[Play]** - Play audio file
[Play]https://example.com/audio.mp3[/Play]
**[Record]** - Record caller's voice
[Record maxLength="120" transcribe="true"/]
- transcribe="true" to get text transcription
**[Gather]** - Collect keypad input or speech
[Gather input="dtmf speech" timeout="5" numDigits="1"]
[Say]Press 1 for sales, 2 for support.[/Say]
[/Gather]
**[Dial]** - Connect to another number
[Dial]+14155551234[/Dial]
**[Pause]** - Add silence
[Pause length="2"/]
**[Hangup]** - End the call
[Hangup/]
**[Redirect]** - Redirect to another URL
[Redirect]https://example.com/next[/Redirect]
### EXAMPLES
"say hello and ask them to leave a message"
-> [Response][Say voice="alice"]Hello! Please leave a message after the beep.[/Say][Record maxLength="120" transcribe="true"/][/Response]
"greet and offer options: press 1 for sales, 2 for support"
-> [Response][Gather input="dtmf" timeout="5" numDigits="1"][Say voice="alice"]Welcome! Press 1 for sales, or press 2 for support.[/Say][/Gather][Say]Sorry, I didn't get that. Goodbye.[/Say][/Response]
"play hold music"
-> [Response][Say voice="alice"]Please hold while we connect you.[/Say][Play loop="0"]https://api.twilio.com/cowbell.mp3[/Play][/Response]
"just say please wait"
-> [Response][Say voice="alice"]Please wait while we process your request.[/Say][/Response]
"record a voicemail with transcription"
-> [Response][Say voice="alice"]You've reached our voicemail. Please leave a message.[/Say][Record transcribe="true" maxLength="180" playBeep="true"/][Say voice="alice"]Thank you for your message. Goodbye.[/Say][/Response]
Return ONLY the TwiML with square brackets - no explanations, no markdown, no extra text.`,
placeholder: 'Describe what should happen when a call comes in...',
},
},
{
id: 'triggerSave',