Loading...
Loading...
Guides interactive user input collection using the Zhin Prompt class. Covers text, number, confirm, list, and pick prompts with timeout handling and Schema-based input. Use when a plugin needs to collect input from users in a conversational flow.
npx skill4agent add zhinjs/ai-skills zhin-prompt-interactionPromptimport { usePlugin, Prompt, MessageCommand } from 'zhin.js'
const plugin = usePlugin()
plugin.addCommand(
new MessageCommand('setup')
.desc('Interactive setup wizard')
.action(async (message) => {
const prompt = new Prompt(plugin, message)
const name = await prompt.text('What is your name?')
const age = await prompt.number('How old are you?')
const confirm = await prompt.confirm('Is this correct?')
if (confirm) {
return `Welcome, ${name} (age ${age})!`
}
return 'Setup cancelled.'
})
)const name = await prompt.text('Enter your name')
// With timeout (ms) and default value
const name = await prompt.text('Enter your name', 30000, 'Anonymous', 'Timed out')const count = await prompt.number('How many items?')
// With timeout and default
const count = await prompt.number('How many items?', 30000, 1, 'Timed out')// User must type "yes" to confirm
const ok = await prompt.confirm('Are you sure?')
// Custom confirmation word
const ok = await prompt.confirm('Continue?', 'ok')
// With timeout and default
const ok = await prompt.confirm('Continue?', 'yes', 30000, false, 'Timed out')// Text list (comma-separated by default)
const tags = await prompt.list('Enter tags')
// User types: "tag1,tag2,tag3" → ['tag1', 'tag2', 'tag3']
// Number list with custom separator
const scores = await prompt.list('Enter scores', {
type: 'number',
separator: ' ',
defaultValue: [0],
timeout: 60000,
})// Single select
const color = await prompt.pick('Choose a color', {
type: 'text',
options: [
{ label: 'Red', value: 'red' },
{ label: 'Green', value: 'green' },
{ label: 'Blue', value: 'blue' },
],
})
// Displays:
// Choose a color
// 1.Red
// 2.Green
// 3.Blue
// User types: "2" → 'green'
// Multi-select
const colors = await prompt.pick('Choose colors', {
type: 'text',
multiple: true,
separator: ',',
options: [
{ label: 'Red', value: 'red' },
{ label: 'Green', value: 'green' },
{ label: 'Blue', value: 'blue' },
],
})
// User types: "1,3" → ['red', 'blue']import { Schema } from '@zhin.js/schema'
// Single schema value
const value = await prompt.getValueWithSchema(
Schema.string().description('Enter your email')
)
// Multiple schema values at once
const result = await prompt.getValueWithSchemas({
name: Schema.string().description('Your name'),
age: Schema.number().description('Your age'),
admin: Schema.boolean().description('Are you admin?'),
})
// result = { name: 'Alice', age: 25, admin: true }| Type | Prompt Used |
|---|---|
| |
| |
| |
| Recursively prompts each field |
| |
| Text input parsed as Date |
| Text input parsed as RegExp |
| Returns the default value |
Schema with | |
try {
const name = await prompt.text('Enter name', 10000) // 10 seconds
} catch (error) {
// error.message = 'Input timeout'
await message.$reply('You took too long!')
}prompt.middleware()prompt.middleware(
(input) => {
if (input instanceof Error) {
// Timeout occurred
return
}
// input is the raw message string
console.log('User said:', input)
},
60000, // timeout in ms
'Input timed out' // timeout message
)Promptnew Prompt(plugin, message)