@furlow/builtins 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/afk/index.d.ts +21 -0
  2. package/dist/afk/index.js +195 -0
  3. package/dist/afk/index.js.map +1 -0
  4. package/dist/auto-responder/index.d.ts +21 -0
  5. package/dist/auto-responder/index.js +356 -0
  6. package/dist/auto-responder/index.js.map +1 -0
  7. package/dist/giveaways/index.d.ts +25 -0
  8. package/dist/giveaways/index.js +416 -0
  9. package/dist/giveaways/index.js.map +1 -0
  10. package/dist/index.d.ts +15 -0
  11. package/dist/index.js +5402 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/leveling/index.d.ts +46 -0
  14. package/dist/leveling/index.js +521 -0
  15. package/dist/leveling/index.js.map +1 -0
  16. package/dist/logging/index.d.ts +52 -0
  17. package/dist/logging/index.js +519 -0
  18. package/dist/logging/index.js.map +1 -0
  19. package/dist/moderation/index.d.ts +83 -0
  20. package/dist/moderation/index.js +221 -0
  21. package/dist/moderation/index.js.map +1 -0
  22. package/dist/music/index.d.ts +33 -0
  23. package/dist/music/index.js +414 -0
  24. package/dist/music/index.js.map +1 -0
  25. package/dist/polls/index.d.ts +21 -0
  26. package/dist/polls/index.js +395 -0
  27. package/dist/polls/index.js.map +1 -0
  28. package/dist/reaction-roles/index.d.ts +19 -0
  29. package/dist/reaction-roles/index.js +551 -0
  30. package/dist/reaction-roles/index.js.map +1 -0
  31. package/dist/reminders/index.d.ts +23 -0
  32. package/dist/reminders/index.js +224 -0
  33. package/dist/reminders/index.js.map +1 -0
  34. package/dist/starboard/index.d.ts +35 -0
  35. package/dist/starboard/index.js +401 -0
  36. package/dist/starboard/index.js.map +1 -0
  37. package/dist/tickets/index.d.ts +43 -0
  38. package/dist/tickets/index.js +614 -0
  39. package/dist/tickets/index.js.map +1 -0
  40. package/dist/utilities/index.d.ts +15 -0
  41. package/dist/utilities/index.js +299 -0
  42. package/dist/utilities/index.js.map +1 -0
  43. package/dist/welcome/index.d.ts +48 -0
  44. package/dist/welcome/index.js +302 -0
  45. package/dist/welcome/index.js.map +1 -0
  46. package/package.json +109 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/starboard/index.ts"],"sourcesContent":["/**\n * Starboard builtin module\n * Handles star reactions and hall of fame\n */\n\nimport type { FurlowSpec, CommandDefinition, EventHandler, TableDefinition } from '@furlow/schema';\n\nexport interface StarboardConfig {\n /** Starboard channel */\n channel?: string;\n /** Minimum stars required */\n threshold?: number;\n /** Emoji to use (default: star) */\n emoji?: string;\n /** Self-starring allowed */\n selfStar?: boolean;\n /** Bot messages can be starred */\n botMessages?: boolean;\n /** Ignored channels */\n ignoredChannels?: string[];\n /** NSFW channel handling */\n nsfwAllowed?: boolean;\n /** Star tiers with different thresholds */\n tiers?: Array<{\n threshold: number;\n emoji: string;\n color?: string;\n }>;\n}\n\nexport const starboardTables: Record<string, TableDefinition> = {\n starboard_messages: {\n columns: {\n id: { type: 'number', primary: true },\n guild_id: { type: 'string', index: true },\n source_channel_id: { type: 'string' },\n source_message_id: { type: 'string', unique: true },\n starboard_message_id: { type: 'string' },\n author_id: { type: 'string', index: true },\n star_count: { type: 'number', default: 0 },\n created_at: { type: 'timestamp' },\n },\n },\n starboard_stars: {\n columns: {\n id: { type: 'number', primary: true },\n message_id: { type: 'string', index: true },\n user_id: { type: 'string' },\n created_at: { type: 'timestamp' },\n },\n },\n};\n\nexport const starboardEventHandlers: EventHandler[] = [\n // Handle star reactions\n {\n event: 'reaction_add',\n condition: '${(reaction.emoji.name === (config.starboard?.emoji || \"⭐\") || reaction.emoji.name === \"🌟\") && config.starboard?.channel}',\n actions: [\n // Check if channel is ignored\n {\n action: 'flow_if',\n condition: '${config.starboard.ignoredChannels?.includes(channel.id)}',\n then: [{ action: 'abort' }],\n },\n // Check NSFW\n {\n action: 'flow_if',\n condition: '${channel.nsfw && !config.starboard.nsfwAllowed}',\n then: [{ action: 'abort' }],\n },\n // Check self-star\n {\n action: 'flow_if',\n condition: '${!config.starboard.selfStar && user.id === message.author.id}',\n then: [{ action: 'abort' }],\n },\n // Check bot messages\n {\n action: 'flow_if',\n condition: '${!config.starboard.botMessages && message.author.bot}',\n then: [{ action: 'abort' }],\n },\n // Check if already starred by this user\n {\n action: 'db_query',\n table: 'starboard_stars',\n where: { message_id: '${message.id}', user_id: '${user.id}' },\n as: 'existingStar',\n },\n {\n action: 'flow_if',\n condition: '${existingStar.length > 0}',\n then: [{ action: 'abort' }],\n },\n // Add star\n {\n action: 'db_insert',\n table: 'starboard_stars',\n data: {\n message_id: '${message.id}',\n user_id: '${user.id}',\n created_at: '${now()}',\n },\n },\n // Count stars\n {\n action: 'db_query',\n table: 'starboard_stars',\n where: { message_id: '${message.id}' },\n as: 'allStars',\n },\n {\n action: 'set',\n key: 'starCount',\n value: '${allStars.length}',\n },\n // Get threshold\n {\n action: 'set',\n key: 'threshold',\n value: '${config.starboard.threshold || 3}',\n },\n // Get appropriate tier\n {\n action: 'set',\n key: 'tier',\n value: '${config.starboard.tiers ? config.starboard.tiers.filter(t => starCount >= t.threshold).pop() : null}',\n },\n {\n action: 'set',\n key: 'displayEmoji',\n value: '${tier?.emoji || config.starboard.emoji || \"⭐\"}',\n },\n {\n action: 'set',\n key: 'embedColor',\n value: '${tier?.color || \"#ffd700\"}',\n },\n // Check if already on starboard\n {\n action: 'db_query',\n table: 'starboard_messages',\n where: { source_message_id: '${message.id}' },\n as: 'existing',\n },\n {\n action: 'flow_if',\n condition: '${existing.length > 0}',\n then: [\n // Update existing starboard message\n {\n action: 'db_update',\n table: 'starboard_messages',\n where: { source_message_id: '${message.id}' },\n data: { star_count: '${starCount}' },\n },\n {\n action: 'edit_message',\n channel: '${config.starboard.channel}',\n message: '${existing[0].starboard_message_id}',\n content: '${displayEmoji} **${starCount}** | <#${channel.id}>',\n },\n ],\n else: [\n // Create new starboard entry if threshold met\n {\n action: 'flow_if',\n condition: '${starCount >= threshold}',\n then: [\n // Build embed\n {\n action: 'set',\n key: 'imageUrl',\n value: '${message.attachments.first()?.url || message.embeds[0]?.image?.url || message.embeds[0]?.thumbnail?.url}',\n },\n {\n action: 'send_message',\n channel: '${config.starboard.channel}',\n content: '${displayEmoji} **${starCount}** | <#${channel.id}>',\n embed: {\n author: {\n name: '${message.author.tag}',\n icon_url: '${message.author.avatarURL}',\n },\n description: '${message.content}\\n\\n[Jump to message](${message.url})',\n color: '${embedColor}',\n image: '${imageUrl ? { url: imageUrl } : null}',\n timestamp: '${message.createdAt}',\n footer: {\n text: 'ID: ${message.id}',\n },\n },\n as: 'starboardMessage',\n },\n {\n action: 'db_insert',\n table: 'starboard_messages',\n data: {\n guild_id: '${guild.id}',\n source_channel_id: '${channel.id}',\n source_message_id: '${message.id}',\n starboard_message_id: '${starboardMessage.id}',\n author_id: '${message.author.id}',\n star_count: '${starCount}',\n created_at: '${now()}',\n },\n },\n ],\n },\n ],\n },\n ],\n },\n // Handle star removal\n {\n event: 'reaction_remove',\n condition: '${(reaction.emoji.name === (config.starboard?.emoji || \"⭐\") || reaction.emoji.name === \"🌟\") && config.starboard?.channel}',\n actions: [\n // Remove star record\n {\n action: 'db_delete',\n table: 'starboard_stars',\n where: { message_id: '${message.id}', user_id: '${user.id}' },\n },\n // Count remaining stars\n {\n action: 'db_query',\n table: 'starboard_stars',\n where: { message_id: '${message.id}' },\n as: 'allStars',\n },\n {\n action: 'set',\n key: 'starCount',\n value: '${allStars.length}',\n },\n // Check if on starboard\n {\n action: 'db_query',\n table: 'starboard_messages',\n where: { source_message_id: '${message.id}' },\n as: 'existing',\n },\n {\n action: 'flow_if',\n condition: '${existing.length > 0}',\n then: [\n {\n action: 'flow_if',\n condition: '${starCount < (config.starboard.threshold || 3)}',\n then: [\n // Remove from starboard\n {\n action: 'delete_message',\n channel: '${config.starboard.channel}',\n message: '${existing[0].starboard_message_id}',\n },\n {\n action: 'db_delete',\n table: 'starboard_messages',\n where: { source_message_id: '${message.id}' },\n },\n ],\n else: [\n // Update count\n {\n action: 'set',\n key: 'tier',\n value: '${config.starboard.tiers ? config.starboard.tiers.filter(t => starCount >= t.threshold).pop() : null}',\n },\n {\n action: 'set',\n key: 'displayEmoji',\n value: '${tier?.emoji || config.starboard.emoji || \"⭐\"}',\n },\n {\n action: 'db_update',\n table: 'starboard_messages',\n where: { source_message_id: '${message.id}' },\n data: { star_count: '${starCount}' },\n },\n {\n action: 'edit_message',\n channel: '${config.starboard.channel}',\n message: '${existing[0].starboard_message_id}',\n content: '${displayEmoji} **${starCount}** | <#${channel.id}>',\n },\n ],\n },\n ],\n },\n ],\n },\n];\n\nexport const starboardCommands: CommandDefinition[] = [\n {\n name: 'starboard',\n description: 'Starboard commands',\n subcommands: [\n {\n name: 'setup',\n description: 'Set up the starboard',\n options: [\n { name: 'channel', description: 'Starboard channel', type: 'channel', required: true },\n { name: 'threshold', description: 'Minimum stars required', type: 'integer', required: false },\n { name: 'emoji', description: 'Star emoji', type: 'string', required: false },\n ],\n actions: [\n {\n action: 'set',\n key: 'config.starboard.channel',\n value: '${args.channel.id}',\n scope: 'guild',\n },\n {\n action: 'flow_if',\n condition: '${args.threshold}',\n then: [\n {\n action: 'set',\n key: 'config.starboard.threshold',\n value: '${args.threshold}',\n scope: 'guild',\n },\n ],\n },\n {\n action: 'flow_if',\n condition: '${args.emoji}',\n then: [\n {\n action: 'set',\n key: 'config.starboard.emoji',\n value: '${args.emoji}',\n scope: 'guild',\n },\n ],\n },\n {\n action: 'reply',\n content: 'Starboard set up in ${args.channel}!',\n ephemeral: true,\n },\n ],\n },\n {\n name: 'stats',\n description: 'View starboard statistics',\n actions: [\n {\n action: 'db_query',\n table: 'starboard_messages',\n where: { guild_id: '${guild.id}' },\n order_by: 'star_count DESC',\n limit: 5,\n as: 'topMessages',\n },\n {\n action: 'db_query',\n table: 'starboard_messages',\n where: { guild_id: '${guild.id}' },\n as: 'allMessages',\n },\n {\n action: 'set',\n key: 'totalStars',\n value: '${allMessages.reduce((sum, m) => sum + m.star_count, 0)}',\n },\n {\n action: 'reply',\n embed: {\n title: 'Starboard Statistics',\n color: '#ffd700',\n fields: [\n { name: 'Total Starred Messages', value: '${allMessages.length}', inline: true },\n { name: 'Total Stars', value: '${totalStars}', inline: true },\n { name: 'Top Starred Messages', value: '${topMessages.map((m, i) => (i + 1) + \". \" + m.star_count + \" stars - <@\" + m.author_id + \">\").join(\"\\\\n\") || \"None yet!\"}' },\n ],\n },\n },\n ],\n },\n {\n name: 'random',\n description: 'Get a random starred message',\n actions: [\n {\n action: 'db_query',\n table: 'starboard_messages',\n where: { guild_id: '${guild.id}' },\n as: 'allMessages',\n },\n {\n action: 'flow_if',\n condition: '${allMessages.length === 0}',\n then: [\n { action: 'reply', content: 'No starred messages yet!', ephemeral: true },\n { action: 'abort' },\n ],\n },\n {\n action: 'set',\n key: 'randomMessage',\n value: '${allMessages[floor(random(0, allMessages.length))]}',\n },\n {\n action: 'reply',\n content: '⭐ **${randomMessage.star_count}** - https://discord.com/channels/${guild.id}/${randomMessage.source_channel_id}/${randomMessage.source_message_id}',\n },\n ],\n },\n ],\n },\n];\n\nexport function getStarboardSpec(config: StarboardConfig = {}): Partial<FurlowSpec> {\n return {\n events: starboardEventHandlers,\n commands: starboardCommands,\n state: {\n tables: starboardTables,\n },\n };\n}\n"],"mappings":";AA8BO,IAAM,kBAAmD;AAAA,EAC9D,oBAAoB;AAAA,IAClB,SAAS;AAAA,MACP,IAAI,EAAE,MAAM,UAAU,SAAS,KAAK;AAAA,MACpC,UAAU,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACxC,mBAAmB,EAAE,MAAM,SAAS;AAAA,MACpC,mBAAmB,EAAE,MAAM,UAAU,QAAQ,KAAK;AAAA,MAClD,sBAAsB,EAAE,MAAM,SAAS;AAAA,MACvC,WAAW,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MACzC,YAAY,EAAE,MAAM,UAAU,SAAS,EAAE;AAAA,MACzC,YAAY,EAAE,MAAM,YAAY;AAAA,IAClC;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf,SAAS;AAAA,MACP,IAAI,EAAE,MAAM,UAAU,SAAS,KAAK;AAAA,MACpC,YAAY,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,MAC1C,SAAS,EAAE,MAAM,SAAS;AAAA,MAC1B,YAAY,EAAE,MAAM,YAAY;AAAA,IAClC;AAAA,EACF;AACF;AAEO,IAAM,yBAAyC;AAAA;AAAA,EAEpD;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA;AAAA,MAEP;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC;AAAA,MAC5B;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC;AAAA,MAC5B;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC;AAAA,MAC5B;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC;AAAA,MAC5B;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,YAAY,iBAAiB,SAAS,aAAa;AAAA,QAC5D,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM,CAAC,EAAE,QAAQ,QAAQ,CAAC;AAAA,MAC5B;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM;AAAA,UACJ,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,YAAY;AAAA,QACd;AAAA,MACF;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,YAAY,gBAAgB;AAAA,QACrC,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,mBAAmB,gBAAgB;AAAA,QAC5C,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA;AAAA,UAEJ;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,mBAAmB,gBAAgB;AAAA,YAC5C,MAAM,EAAE,YAAY,eAAe;AAAA,UACrC;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,QACF;AAAA,QACA,MAAM;AAAA;AAAA,UAEJ;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA;AAAA,cAEJ;AAAA,gBACE,QAAQ;AAAA,gBACR,KAAK;AAAA,gBACL,OAAO;AAAA,cACT;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,SAAS;AAAA,gBACT,OAAO;AAAA,kBACL,QAAQ;AAAA,oBACN,MAAM;AAAA,oBACN,UAAU;AAAA,kBACZ;AAAA,kBACA,aAAa;AAAA,kBACb,OAAO;AAAA,kBACP,OAAO;AAAA,kBACP,WAAW;AAAA,kBACX,QAAQ;AAAA,oBACN,MAAM;AAAA,kBACR;AAAA,gBACF;AAAA,gBACA,IAAI;AAAA,cACN;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,MAAM;AAAA,kBACJ,UAAU;AAAA,kBACV,mBAAmB;AAAA,kBACnB,mBAAmB;AAAA,kBACnB,sBAAsB;AAAA,kBACtB,WAAW;AAAA,kBACX,YAAY;AAAA,kBACZ,YAAY;AAAA,gBACd;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAEA;AAAA,IACE,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA;AAAA,MAEP;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,YAAY,iBAAiB,SAAS,aAAa;AAAA,MAC9D;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,YAAY,gBAAgB;AAAA,QACrC,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA;AAAA,MAEA;AAAA,QACE,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,EAAE,mBAAmB,gBAAgB;AAAA,QAC5C,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,UACJ;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA;AAAA,cAEJ;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,SAAS;AAAA,cACX;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,OAAO,EAAE,mBAAmB,gBAAgB;AAAA,cAC9C;AAAA,YACF;AAAA,YACA,MAAM;AAAA;AAAA,cAEJ;AAAA,gBACE,QAAQ;AAAA,gBACR,KAAK;AAAA,gBACL,OAAO;AAAA,cACT;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,KAAK;AAAA,gBACL,OAAO;AAAA,cACT;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,OAAO,EAAE,mBAAmB,gBAAgB;AAAA,gBAC5C,MAAM,EAAE,YAAY,eAAe;AAAA,cACrC;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,SAAS;AAAA,gBACT,SAAS;AAAA,cACX;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,oBAAyC;AAAA,EACpD;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP,EAAE,MAAM,WAAW,aAAa,qBAAqB,MAAM,WAAW,UAAU,KAAK;AAAA,UACrF,EAAE,MAAM,aAAa,aAAa,0BAA0B,MAAM,WAAW,UAAU,MAAM;AAAA,UAC7F,EAAE,MAAM,SAAS,aAAa,cAAc,MAAM,UAAU,UAAU,MAAM;AAAA,QAC9E;AAAA,QACA,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,YACP,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,QAAQ;AAAA,gBACR,KAAK;AAAA,gBACL,OAAO;AAAA,gBACP,OAAO;AAAA,cACT;AAAA,YACF;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,QAAQ;AAAA,gBACR,KAAK;AAAA,gBACL,OAAO;AAAA,gBACP,OAAO;AAAA,cACT;AAAA,YACF;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,UAAU,cAAc;AAAA,YACjC,UAAU;AAAA,YACV,OAAO;AAAA,YACP,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,UAAU,cAAc;AAAA,YACjC,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,cACL,OAAO;AAAA,cACP,OAAO;AAAA,cACP,QAAQ;AAAA,gBACN,EAAE,MAAM,0BAA0B,OAAO,yBAAyB,QAAQ,KAAK;AAAA,gBAC/E,EAAE,MAAM,eAAe,OAAO,iBAAiB,QAAQ,KAAK;AAAA,gBAC5D,EAAE,MAAM,wBAAwB,OAAO,6HAA6H;AAAA,cACtK;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,UACP;AAAA,YACE,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO,EAAE,UAAU,cAAc;AAAA,YACjC,IAAI;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,MAAM;AAAA,cACJ,EAAE,QAAQ,SAAS,SAAS,4BAA4B,WAAW,KAAK;AAAA,cACxE,EAAE,QAAQ,QAAQ;AAAA,YACpB;AAAA,UACF;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,KAAK;AAAA,YACL,OAAO;AAAA,UACT;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,SAA0B,CAAC,GAAwB;AAClF,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,43 @@
1
+ import { FurlowSpec, ComponentDefinition, CommandDefinition, EventHandler, TableDefinition } from '@furlow/schema';
2
+
3
+ /**
4
+ * Tickets builtin module
5
+ * Handles ticket creation, claiming, closing, and transcripts
6
+ */
7
+
8
+ interface TicketsConfig {
9
+ /** Category to create tickets in */
10
+ category?: string;
11
+ /** Support roles that can see tickets */
12
+ supportRoles?: string[];
13
+ /** Ticket channel naming pattern */
14
+ channelPattern?: string;
15
+ /** Maximum open tickets per user */
16
+ maxTicketsPerUser?: number;
17
+ /** Ticket panel channel */
18
+ panelChannel?: string;
19
+ /** Log channel for ticket transcripts */
20
+ logChannel?: string;
21
+ /** Auto-close inactive tickets (hours) */
22
+ autoCloseAfter?: number;
23
+ /** Ticket categories/types */
24
+ categories?: Array<{
25
+ id: string;
26
+ name: string;
27
+ description?: string;
28
+ emoji?: string;
29
+ supportRoles?: string[];
30
+ }>;
31
+ /** DM user on ticket close */
32
+ dmOnClose?: boolean;
33
+ /** Include transcript on close */
34
+ includeTranscript?: boolean;
35
+ }
36
+ declare const ticketsTables: Record<string, TableDefinition>;
37
+ declare const ticketPanelComponents: ComponentDefinition[];
38
+ declare const ticketControlComponents: ComponentDefinition[];
39
+ declare const ticketsEventHandlers: EventHandler[];
40
+ declare const ticketsCommands: CommandDefinition[];
41
+ declare function getTicketsSpec(config?: TicketsConfig): Partial<FurlowSpec>;
42
+
43
+ export { type TicketsConfig, getTicketsSpec, ticketControlComponents, ticketPanelComponents, ticketsCommands, ticketsEventHandlers, ticketsTables };