@commandkit/ai 0.1.0-dev.20250611020404 → 0.1.0-dev.20250611155146

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.
package/dist/plugin.js CHANGED
@@ -1,139 +1,54 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AiPlugin = void 0;
4
- exports.configureAI = configureAI;
5
4
  const plugin_1 = require("commandkit/plugin");
6
5
  const commandkit_1 = require("commandkit");
7
6
  const context_1 = require("./context");
8
7
  const discord_js_1 = require("discord.js");
9
8
  const ai_1 = require("ai");
10
- const zod_1 = require("zod");
11
9
  const ai_context_worker_1 = require("./ai-context-worker");
12
- const schema_1 = require("./schema");
13
- let messageFilter = null;
14
- let selectAiModel = null;
15
- let generateSystemPrompt;
16
- function configureAI(config) {
17
- if (config.messageFilter) {
18
- messageFilter = config.messageFilter;
19
- }
20
- if (config.selectAiModel) {
21
- selectAiModel = config.selectAiModel;
22
- }
23
- if (config.systemPrompt) {
24
- generateSystemPrompt = config.systemPrompt;
25
- }
26
- }
10
+ const get_available_commands_1 = require("./tools/get-available-commands");
11
+ const get_channel_by_id_1 = require("./tools/get-channel-by-id");
12
+ const get_current_client_info_1 = require("./tools/get-current-client-info");
13
+ const get_guild_by_id_1 = require("./tools/get-guild-by-id");
14
+ const get_user_by_id_1 = require("./tools/get-user-by-id");
15
+ const configure_1 = require("./configure");
16
+ const augmentation_1 = require("./augmentation");
17
+ const defaultTools = {
18
+ getAvailableCommands: get_available_commands_1.getAvailableCommands,
19
+ getChannelById: get_channel_by_id_1.getChannelById,
20
+ getCurrentClientInfo: get_current_client_info_1.getCurrentClientInfo,
21
+ getGuildById: get_guild_by_id_1.getGuildById,
22
+ getUserById: get_user_by_id_1.getUserById,
23
+ };
27
24
  class AiPlugin extends plugin_1.RuntimePlugin {
28
25
  constructor(options) {
29
26
  super(options);
30
27
  this.name = 'AiPlugin';
31
28
  this.toolsRecord = {};
32
- this.defaultTools = {};
29
+ this.defaultTools = defaultTools;
33
30
  this.onMessageFunc = null;
34
31
  }
35
32
  async activate(ctx) {
36
- this.onMessageFunc = (message) => this.handleMessage(ctx, message);
33
+ this.onMessageFunc = (message) => this.handleMessage(ctx.commandkit, message);
37
34
  ctx.commandkit.client.on(discord_js_1.Events.MessageCreate, this.onMessageFunc);
38
- this.createDefaultTools(ctx);
35
+ (0, augmentation_1.augmentCommandKit)(true);
39
36
  commandkit_1.Logger.info(`Plugin ${this.name} activated`);
40
37
  }
41
- createDefaultTools(ctx) {
42
- const { commandkit } = ctx;
43
- const client = commandkit.client;
44
- this.defaultTools.getUserById = (0, ai_1.tool)({
45
- description: 'Get user information by ID',
46
- parameters: zod_1.z.object({
47
- userId: zod_1.z
48
- .string()
49
- .describe('The ID of the user to retrieve. This is a Discord snowflake string.'),
50
- }),
51
- execute: async (params) => {
52
- const user = await client.users.fetch(params.userId, {
53
- force: false,
54
- cache: true,
55
- });
56
- return user.toJSON();
57
- },
58
- });
59
- this.defaultTools.getChannelById = (0, ai_1.tool)({
60
- description: 'Get channel information by ID',
61
- parameters: zod_1.z.object({
62
- channelId: zod_1.z
63
- .string()
64
- .describe('The ID of the channel to retrieve. This is a Discord snowflake string.'),
65
- }),
66
- execute: async (params) => {
67
- const channel = await client.channels.fetch(params.channelId, {
68
- force: false,
69
- cache: true,
70
- });
71
- if (!channel) {
72
- throw new Error(`Channel with ID ${params.channelId} not found.`);
73
- }
74
- return channel.toJSON();
75
- },
76
- });
77
- this.defaultTools.getGuildById = (0, ai_1.tool)({
78
- description: 'Get guild information by ID',
79
- parameters: zod_1.z.object({
80
- guildId: zod_1.z
81
- .string()
82
- .describe('The ID of the guild to retrieve. This is a Discord snowflake string.'),
83
- }),
84
- execute: async (params) => {
85
- const guild = await client.guilds.fetch({
86
- guild: params.guildId,
87
- force: false,
88
- cache: true,
89
- });
90
- if (!guild) {
91
- throw new Error(`Guild with ID ${params.guildId} not found.`);
92
- }
93
- return {
94
- id: guild.id,
95
- name: guild.name,
96
- icon: guild.iconURL(),
97
- memberCount: guild.memberCount,
98
- };
99
- },
100
- });
101
- this.defaultTools.getCurrentUser = (0, ai_1.tool)({
102
- description: 'Get information about the current discord bot user',
103
- parameters: zod_1.z.object({}),
104
- execute: async () => {
105
- const user = client.user;
106
- if (!user) {
107
- throw new Error('Bot user is not available.');
108
- }
109
- return user.toJSON();
110
- },
111
- });
112
- this.defaultTools.getAvailableCommands = (0, ai_1.tool)({
113
- description: 'Get all available commands',
114
- parameters: zod_1.z.object({}),
115
- execute: async () => {
116
- return ctx.commandkit.commandHandler.getCommandsArray().map((cmd) => ({
117
- name: cmd.data.command.name,
118
- description: cmd.data.command.description,
119
- category: cmd.command.category,
120
- }));
121
- },
122
- });
123
- }
124
38
  async deactivate(ctx) {
125
39
  this.toolsRecord = {};
126
40
  if (this.onMessageFunc) {
127
41
  ctx.commandkit.client.off(discord_js_1.Events.MessageCreate, this.onMessageFunc);
128
42
  this.onMessageFunc = null;
129
43
  }
44
+ (0, augmentation_1.augmentCommandKit)(false);
130
45
  commandkit_1.Logger.info(`Plugin ${this.name} deactivated`);
131
46
  }
132
- async handleMessage(pluginContext, message) {
47
+ async handleMessage(commandkit, message) {
133
48
  if (message.author.bot || !Object.keys(this.toolsRecord).length)
134
49
  return;
135
- const aiModelSelector = selectAiModel;
136
- if (!message.content?.length || !aiModelSelector)
50
+ const { messageFilter, selectAiModel, prepareSystemPrompt, preparePrompt, onProcessingFinish, onProcessingStart, onResult, onError, disableBuiltInTools, } = (0, configure_1.getAIConfig)();
51
+ if (!message.content?.length)
137
52
  return;
138
53
  if (!message.channel.isTextBased() || !message.channel.isSendable())
139
54
  return;
@@ -143,168 +58,62 @@ class AiPlugin extends plugin_1.RuntimePlugin {
143
58
  const ctx = new context_1.AiContext({
144
59
  message,
145
60
  params: {},
146
- commandkit: pluginContext.commandkit,
61
+ commandkit: commandkit,
147
62
  });
148
- const systemPrompt = (await generateSystemPrompt?.(message)) ||
149
- `You are a helpful AI discord bot. Your name is ${message.client.user.username} and your id is ${message.client.user.id}.
150
- You are designed to assist users with their questions and tasks. You also have access to various tools that can help you perform tasks.
151
- Tools are basically like commands that you can execute to perform specific actions based on user input.
152
- Keep the response short and concise, and only use tools when necessary. Keep the response length under 2000 characters.
153
- Do not include your own text in the response unless necessary. For text formatting, you can use discord's markdown syntax.
154
- ${message.inGuild() ? `\nYou are currently in a guild named ${message.guild.name} whose id is ${message.guildId}. While in guild, you can fetch member information if needed.` : '\nYou are currently in a direct message with the user.'}
155
- If the user asks you to create a poll or embeds, create a text containing the poll or embed information as a markdown instead of json. If structured response is possible, use the structured response format instead.
156
- If the user asks you to perform a task that requires a tool, use the tool to perform the task and return the result.
157
- `;
158
- const userInfo = `<user>
159
- <id>${message.author.id}</id>
160
- <name>${message.author.username}</name>
161
- <displayName>${message.author.displayName}</displayName>
162
- <avatar>${message.author.avatarURL()}</avatar>
163
- </user>`;
164
63
  await (0, ai_context_worker_1.runInAiWorkerContext)(ctx, message, async () => {
165
- const channel = message.channel;
166
- const stopTyping = await this.startTyping(channel);
64
+ const systemPrompt = await prepareSystemPrompt(ctx, message);
65
+ const prompt = await preparePrompt(ctx, message);
66
+ const { model, abortSignal, maxSteps, ...modelOptions } = await selectAiModel(ctx, message);
67
+ await onProcessingStart(ctx, message);
68
+ const tools = disableBuiltInTools
69
+ ? this.toolsRecord
70
+ : {
71
+ ...this.defaultTools,
72
+ ...this.toolsRecord,
73
+ };
167
74
  try {
168
- const { model, options, objectMode = false, } = await aiModelSelector(message);
169
- const originalPrompt = `${userInfo}\nUser: ${message.content}\nAI:`;
170
- const call = ({ prompt = originalPrompt, includeTools = true, disableObjectMode = false, }) => (0, ai_1.generateText)({
171
- abortSignal: AbortSignal.timeout(60000),
75
+ const result = await (0, ai_1.generateText)({
172
76
  model,
173
- ...(includeTools && {
174
- tools: { ...this.toolsRecord, ...this.defaultTools },
175
- }),
77
+ abortSignal: abortSignal ?? AbortSignal.timeout(60000),
176
78
  prompt,
177
79
  system: systemPrompt,
178
- maxSteps: 5,
179
- providerOptions: options,
180
- ...(objectMode && !disableObjectMode
181
- ? {
182
- experimental_output: ai_1.Output.object({
183
- schema: schema_1.AiResponseSchema,
184
- }),
185
- }
186
- : {}),
80
+ maxSteps: maxSteps ?? 5,
81
+ ...modelOptions,
82
+ tools: {
83
+ ...tools,
84
+ ...modelOptions.tools,
85
+ },
187
86
  });
188
- let result;
189
- try {
190
- result = await call({});
191
- }
192
- catch {
193
- if (objectMode) {
194
- const r1 = await call({
195
- includeTools: true,
196
- disableObjectMode: true,
197
- });
198
- if (!r1.text)
199
- throw new Error('No text response from AI');
200
- const r2 = await call({
201
- includeTools: false,
202
- disableObjectMode: false,
203
- prompt: `Original context: ${originalPrompt} ${r1.text}\n\nGenerate a structured response based on the previous response`,
204
- });
205
- result = r2;
206
- }
207
- }
208
- stopTyping();
209
- let structuredResult = null;
210
- try {
211
- const val = 'experimental_output' in result && result.experimental_output;
212
- if (val) {
213
- structuredResult = val;
214
- }
215
- }
216
- catch { }
217
- if (structuredResult) {
218
- const { poll, content, embed } = structuredResult;
219
- if (!poll && !content && !embed) {
220
- commandkit_1.Logger.warn('AI response did not include any content, embed, or poll.');
221
- return;
222
- }
223
- await message.reply({
224
- content: content?.substring(0, 2000),
225
- embeds: embed
226
- ? [
227
- {
228
- title: embed.title,
229
- description: embed.description,
230
- url: embed.url,
231
- color: embed.color,
232
- image: embed.image ? { url: embed.image } : undefined,
233
- thumbnail: embed.thumbnailImage
234
- ? { url: embed.thumbnailImage }
235
- : undefined,
236
- fields: embed.fields?.map((field) => ({
237
- name: field.name,
238
- value: field.value,
239
- inline: field.inline,
240
- })),
241
- },
242
- ]
243
- : [],
244
- poll: poll
245
- ? {
246
- allowMultiselect: poll.allow_multiselect,
247
- answers: poll.answers.map((answer) => ({
248
- text: answer.text,
249
- emoji: answer.emoji,
250
- })),
251
- duration: poll.duration,
252
- question: { text: poll.question.text },
253
- }
254
- : undefined,
255
- });
256
- }
257
- else if (!!result.text) {
258
- await message.reply({
259
- content: result.text.substring(0, 2000),
260
- allowedMentions: { parse: [] },
261
- });
262
- }
87
+ await onResult(ctx, message, result);
263
88
  }
264
89
  catch (e) {
265
- commandkit_1.Logger.error(`Error processing AI message: ${e}`);
266
- const channel = message.channel;
267
- if (channel.isSendable()) {
268
- await message
269
- .reply({
270
- content: 'An error occurred while processing your request.',
271
- allowedMentions: { parse: [] },
272
- })
273
- .catch((e) => commandkit_1.Logger.error(`Failed to send error message: ${e}`));
274
- }
90
+ await onError(ctx, message, e);
275
91
  }
276
92
  finally {
277
- stopTyping();
93
+ await onProcessingFinish(ctx, message);
278
94
  }
279
95
  });
280
96
  }
281
- async startTyping(channel) {
282
- let stopped = false;
283
- const runner = async () => {
284
- if (stopped)
285
- return clearInterval(typingInterval);
286
- if (channel.isSendable()) {
287
- await channel.sendTyping().catch(Object);
288
- }
289
- };
290
- const typingInterval = setInterval(runner, 3000).unref();
291
- await runner();
292
- return () => {
293
- stopped = true;
294
- clearInterval(typingInterval);
295
- };
97
+ /**
98
+ * Executes the AI for a given message.
99
+ * @param message The message to process.
100
+ * @param commandkit The CommandKit instance to use. If not provided, it will be inferred automatically.
101
+ */
102
+ async executeAI(message, commandkit) {
103
+ commandkit ?? (commandkit = (0, commandkit_1.getCommandKit)(true));
104
+ return this.handleMessage(commandkit, message);
296
105
  }
297
- async onBeforeCommandsLoad(ctx) {
106
+ async onBeforeCommandsLoad() {
298
107
  this.toolsRecord = {};
299
108
  }
300
109
  async onAfterCommandsLoad(ctx) {
301
- const commands = ctx.commandkit.commandHandler
110
+ const { commandkit } = ctx;
111
+ const commands = commandkit.commandHandler
302
112
  .getCommandsArray()
303
113
  .filter((command) => 'ai' in command.data &&
304
114
  typeof command.data.ai === 'function' &&
305
115
  'aiConfig' in command.data);
306
116
  if (!commands.length) {
307
- commandkit_1.Logger.warn('No commands with AI functionality found. Ensure commands are properly configured.');
308
117
  return;
309
118
  }
310
119
  const tools = new discord_js_1.Collection();
@@ -316,12 +125,31 @@ class AiPlugin extends plugin_1.RuntimePlugin {
316
125
  const description = cmd.data.aiConfig.description || cmd.data.command.description;
317
126
  const cmdTool = (0, ai_1.tool)({
318
127
  description,
319
- type: 'function',
320
128
  parameters: cmd.data.aiConfig.parameters,
321
129
  async execute(params) {
130
+ const config = (0, configure_1.getAIConfig)();
322
131
  const ctx = (0, ai_context_worker_1.getAiWorkerContext)();
323
132
  ctx.ctx.setParams(params);
324
- return cmd.data.ai(ctx.ctx);
133
+ try {
134
+ const target = await commandkit.commandHandler.prepareCommandRun(ctx.message, cmd.data.command.name);
135
+ if (!target) {
136
+ return {
137
+ error: true,
138
+ message: 'This command is not available.',
139
+ };
140
+ }
141
+ const res = await commandkit.commandHandler.commandRunner.runCommand(target, ctx.message, {
142
+ handler: 'ai',
143
+ });
144
+ return res === undefined ? { success: true } : res;
145
+ }
146
+ catch (e) {
147
+ await config.onError?.(ctx.ctx, ctx.message, e);
148
+ return {
149
+ error: true,
150
+ message: 'This tool failed with unexpected error.',
151
+ };
152
+ }
325
153
  },
326
154
  });
327
155
  cmd.tool = cmdTool;
@@ -333,4 +161,4 @@ class AiPlugin extends plugin_1.RuntimePlugin {
333
161
  }
334
162
  }
335
163
  exports.AiPlugin = AiPlugin;
336
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFpQ0Esa0NBWUM7QUE3Q0QsOENBQTJFO0FBRTNFLDJDQUFtRDtBQUNuRCx1Q0FBc0M7QUFDdEMsMkNBQXNFO0FBQ3RFLDJCQUFzRDtBQUN0RCw2QkFBd0I7QUFDeEIsMkRBQStFO0FBQy9FLHFDQUE0QztBQWU1QyxJQUFJLGFBQWEsR0FBeUIsSUFBSSxDQUFDO0FBQy9DLElBQUksYUFBYSxHQUF5QixJQUFJLENBQUM7QUFDL0MsSUFBSSxvQkFBeUUsQ0FBQztBQVE5RSxTQUFnQixXQUFXLENBQUMsTUFBbUI7SUFDN0MsSUFBSSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QixvQkFBb0IsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO0lBQzdDLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBYSxRQUFTLFNBQVEsc0JBQThCO0lBTTFELFlBQW1CLE9BQXdCO1FBQ3pDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQU5ELFNBQUksR0FBRyxVQUFVLENBQUM7UUFDMUIsZ0JBQVcsR0FBeUIsRUFBRSxDQUFDO1FBQ3ZDLGlCQUFZLEdBQXlCLEVBQUUsQ0FBQztRQUN4QyxrQkFBYSxHQUFpRCxJQUFJLENBQUM7SUFJM0UsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBNEI7UUFDaEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVB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
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw4Q0FBMkU7QUFFM0UsMkNBQStEO0FBQy9ELHVDQUFzQztBQUN0QywyQ0FBeUQ7QUFDekQsMkJBQThDO0FBQzlDLDJEQUErRTtBQUMvRSwyRUFBc0U7QUFDdEUsaUVBQTJEO0FBQzNELDZFQUF1RTtBQUN2RSw2REFBdUQ7QUFDdkQsMkRBQXFEO0FBQ3JELDJDQUEwQztBQUMxQyxpREFBbUQ7QUFnQm5ELE1BQU0sWUFBWSxHQUF5QjtJQUN6QyxvQkFBb0IsRUFBcEIsNkNBQW9CO0lBQ3BCLGNBQWMsRUFBZCxrQ0FBYztJQUNkLG9CQUFvQixFQUFwQiw4Q0FBb0I7SUFDcEIsWUFBWSxFQUFaLDhCQUFZO0lBQ1osV0FBVyxFQUFYLDRCQUFXO0NBQ1osQ0FBQztBQUVGLE1BQWEsUUFBUyxTQUFRLHNCQUE4QjtJQU0xRCxZQUFtQixPQUF3QjtRQUN6QyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFORCxTQUFJLEdBQUcsVUFBVSxDQUFDO1FBQzFCLGdCQUFXLEdBQXlCLEVBQUUsQ0FBQztRQUN2QyxpQkFBWSxHQUFHLFlBQVksQ0FBQztRQUM1QixrQkFBYSxHQUFpRCxJQUFJLENBQUM7SUFJM0UsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBNEI7UUFDaEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5QyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsbUJBQU0sQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ25FLElBQUEsZ0NBQWlCLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEIsbUJBQU0sQ0FB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
@@ -0,0 +1,6 @@
1
+ import { Message } from 'discord.js';
2
+ /**
3
+ * Creates the default system prompt for the AI bot based on the provided message context.
4
+ * This prompt includes the bot's role, current channel information, and response guidelines.
5
+ */
6
+ export declare function createSystemPrompt(message: Message): string;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSystemPrompt = createSystemPrompt;
4
+ /**
5
+ * Creates the default system prompt for the AI bot based on the provided message context.
6
+ * This prompt includes the bot's role, current channel information, and response guidelines.
7
+ */
8
+ function createSystemPrompt(message) {
9
+ const channelInfo = 'name' in message.channel
10
+ ? message.channel.name
11
+ : message.channel.recipient?.displayName || 'DM';
12
+ const guildInfo = message.inGuild()
13
+ ? `You are in the guild "${message.guild.name}" (ID: ${message.guildId}). You can fetch member information when needed.`
14
+ : 'You are in a direct message with the user.';
15
+ return `You are ${message.client.user.username} (ID: ${message.client.user.id}), a helpful AI Discord bot.
16
+
17
+ **Your Role:**
18
+ - Assist users with questions and tasks efficiently
19
+ - Use available tools to perform specific actions when requested
20
+ - Keep responses under 2000 characters and concise
21
+
22
+ **Current Context:**
23
+ - Channel: "${channelInfo}" (ID: ${message.channelId})
24
+ - Permissions: ${message.channel.isSendable() ? 'Can send messages' : 'Cannot send messages'}
25
+ - Location: ${guildInfo}
26
+
27
+ **Response Guidelines:**
28
+ - Use Discord markdown for formatting
29
+ - Only use tools when necessary for the task
30
+ - Reject requests unrelated to your available tools
31
+
32
+ Focus on being helpful while staying within your capabilities.`;
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXByb21wdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zeXN0ZW0tcHJvbXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBTUEsZ0RBNEJDO0FBaENEOzs7R0FHRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLE9BQWdCO0lBQ2pELE1BQU0sV0FBVyxHQUNmLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTztRQUN2QixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJO1FBQ3RCLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxXQUFXLElBQUksSUFBSSxDQUFDO0lBRXJELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUU7UUFDakMsQ0FBQyxDQUFDLHlCQUF5QixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksVUFBVSxPQUFPLENBQUMsT0FBTyxrREFBa0Q7UUFDeEgsQ0FBQyxDQUFDLDRDQUE0QyxDQUFDO0lBRWpELE9BQU8sV0FBVyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTs7Ozs7Ozs7Y0FRakUsV0FBVyxVQUFVLE9BQU8sQ0FBQyxTQUFTO2lCQUNuQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsc0JBQXNCO2NBQzlFLFNBQVM7Ozs7Ozs7K0RBT3dDLENBQUM7QUFDaEUsQ0FBQyJ9
@@ -0,0 +1,76 @@
1
+ import { Schema, tool } from 'ai';
2
+ import { AiContext } from '../../context';
3
+ import { z } from 'zod';
4
+ /**
5
+ * Utility type that represents a value that can be either synchronous or asynchronous.
6
+ * @template T - The type of the value
7
+ * @internal
8
+ */
9
+ type Awaitable<T> = T | Promise<T>;
10
+ /**
11
+ * Type representing the parameters schema for AI tools.
12
+ * Extracted from the first parameter of the `tool` function from the 'ai' library.
13
+ */
14
+ export type ToolParameterType = Parameters<typeof tool>[0]['parameters'];
15
+ /**
16
+ * Utility type that infers the TypeScript type from a tool parameter schema.
17
+ * Supports both Zod schemas and AI library schemas.
18
+ * @template T - The tool parameter type to infer from
19
+ */
20
+ export type InferParameters<T extends ToolParameterType> = T extends Schema<any> ? T['_type'] : T extends z.ZodTypeAny ? z.infer<T> : never;
21
+ /**
22
+ * Configuration options for creating an AI tool.
23
+ * @template T - The parameter schema type for the tool
24
+ * @template R - The return type of the tool's execute function
25
+ */
26
+ export interface CreateToolOptions<T extends ToolParameterType, R = unknown> {
27
+ /** The unique name identifier for the tool */
28
+ name: string;
29
+ /** A human-readable description of what the tool does */
30
+ description: string;
31
+ /** The parameter schema that defines the tool's input structure */
32
+ parameters: T;
33
+ /** The function that executes when the tool is called */
34
+ execute: ToolExecuteFunction<T, R>;
35
+ }
36
+ /**
37
+ * Type definition for a tool's execute function.
38
+ * @template T - The parameter schema type
39
+ * @template R - The return type of the function
40
+ * @param ctx - The AI context containing request and response information
41
+ * @param parameters - The validated parameters passed to the tool
42
+ * @returns The result of the tool execution, which can be synchronous or asynchronous
43
+ */
44
+ export type ToolExecuteFunction<T extends ToolParameterType, R> = (ctx: AiContext, parameters: InferParameters<T>) => Awaitable<R>;
45
+ /**
46
+ * Creates a new AI tool with the specified configuration.
47
+ * This function wraps the underlying AI library's tool creation with additional
48
+ * context management and parameter validation.
49
+ *
50
+ * @template T - The parameter schema type for the tool
51
+ * @template R - The return type of the tool's execute function
52
+ * @param options - The configuration options for the tool
53
+ * @returns A configured AI tool ready for use
54
+ *
55
+ * @example
56
+ * ```typescript
57
+ * const myTool = createTool({
58
+ * name: 'calculate',
59
+ * description: 'Performs basic arithmetic calculations',
60
+ * parameters: z.object({
61
+ * operation: z.enum(['add', 'subtract']),
62
+ * a: z.number(),
63
+ * b: z.number(),
64
+ * }),
65
+ * execute: async (ctx, params) => {
66
+ * return params.operation === 'add'
67
+ * ? params.a + params.b
68
+ * : params.a - params.b;
69
+ * },
70
+ * });
71
+ * ```
72
+ */
73
+ export declare function createTool<T extends ToolParameterType, R = unknown>(options: CreateToolOptions<T, R>): import("ai").Tool<T, R> & {
74
+ execute: (args: T extends Schema<any> ? T["_type"] : T extends z.ZodTypeAny ? z.TypeOf<T> : never, options: import("ai").ToolExecutionOptions) => PromiseLike<R>;
75
+ };
76
+ export {};
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTool = createTool;
4
+ const ai_1 = require("ai");
5
+ const ai_context_worker_1 = require("../../ai-context-worker");
6
+ /**
7
+ * Creates a new AI tool with the specified configuration.
8
+ * This function wraps the underlying AI library's tool creation with additional
9
+ * context management and parameter validation.
10
+ *
11
+ * @template T - The parameter schema type for the tool
12
+ * @template R - The return type of the tool's execute function
13
+ * @param options - The configuration options for the tool
14
+ * @returns A configured AI tool ready for use
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const myTool = createTool({
19
+ * name: 'calculate',
20
+ * description: 'Performs basic arithmetic calculations',
21
+ * parameters: z.object({
22
+ * operation: z.enum(['add', 'subtract']),
23
+ * a: z.number(),
24
+ * b: z.number(),
25
+ * }),
26
+ * execute: async (ctx, params) => {
27
+ * return params.operation === 'add'
28
+ * ? params.a + params.b
29
+ * : params.a - params.b;
30
+ * },
31
+ * });
32
+ * ```
33
+ */
34
+ function createTool(options) {
35
+ // @ts-ignore - Suppressing type checking due to complex generic inference
36
+ const _tool = (0, ai_1.tool)({
37
+ name: options.name,
38
+ description: options.description,
39
+ parameters: options.parameters,
40
+ async execute(params) {
41
+ const { ctx } = (0, ai_context_worker_1.getAiWorkerContext)();
42
+ ctx.setParams(params);
43
+ return options.execute(ctx, params);
44
+ },
45
+ });
46
+ return _tool;
47
+ }
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdG9vbHMvY29tbW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBdUZBLGdDQWtCQztBQXpHRCwyQkFBa0M7QUFFbEMsK0RBQTZEO0FBeUQ3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsU0FBZ0IsVUFBVSxDQUN4QixPQUFnQztJQUVoQywwRUFBMEU7SUFDMUUsTUFBTSxLQUFLLEdBQUcsSUFBQSxTQUFJLEVBQU87UUFDdkIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQ2xCLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztRQUNoQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7UUFDOUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNO1lBQ2xCLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFBLHNDQUFrQixHQUFFLENBQUM7WUFFckMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUV0QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE1BQTRCLENBQUMsQ0FBQztRQUM1RCxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIn0=
@@ -0,0 +1,14 @@
1
+ import { z } from 'zod';
2
+ export declare const getAvailableCommands: import("ai").Tool<z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>, {
3
+ name: any;
4
+ description: any;
5
+ category: string | null;
6
+ supportsAI: boolean;
7
+ }[]> & {
8
+ execute: (args: {}, options: import("ai").ToolExecutionOptions) => PromiseLike<{
9
+ name: any;
10
+ description: any;
11
+ category: string | null;
12
+ supportsAI: boolean;
13
+ }[]>;
14
+ };
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAvailableCommands = void 0;
4
+ const zod_1 = require("zod");
5
+ const common_1 = require("./common");
6
+ exports.getAvailableCommands = (0, common_1.createTool)({
7
+ description: 'Get a list of all available commands.',
8
+ name: 'getAvailableCommands',
9
+ parameters: zod_1.z.object({}),
10
+ execute(ctx, params) {
11
+ const { commandkit } = ctx;
12
+ const commands = commandkit.commandHandler
13
+ .getCommandsArray()
14
+ .map((cmd) => ({
15
+ name: cmd.data.command.name,
16
+ description: cmd.data.command.description,
17
+ category: cmd.command.category,
18
+ supportsAI: 'ai' in cmd.data && typeof cmd.data.ai === 'function',
19
+ }));
20
+ return commands;
21
+ },
22
+ });
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWF2YWlsYWJsZS1jb21tYW5kcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29scy9nZXQtYXZhaWxhYmxlLWNvbW1hbmRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUF3QjtBQUN4QixxQ0FBc0M7QUFFekIsUUFBQSxvQkFBb0IsR0FBRyxJQUFBLG1CQUFVLEVBQUM7SUFDN0MsV0FBVyxFQUFFLHVDQUF1QztJQUNwRCxJQUFJLEVBQUUsc0JBQXNCO0lBQzVCLFVBQVUsRUFBRSxPQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUN4QixPQUFPLENBQUMsR0FBRyxFQUFFLE1BQU07UUFDakIsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLEdBQUcsQ0FBQztRQUUzQixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsY0FBYzthQUN2QyxnQkFBZ0IsRUFBRTthQUNsQixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDYixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSTtZQUMzQixXQUFXLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVztZQUN6QyxRQUFRLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRO1lBQzlCLFVBQVUsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFVBQVU7U0FDbEUsQ0FBQyxDQUFDLENBQUM7UUFFTixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0NBQ0YsQ0FBQyxDQUFDIn0=