@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/ai-context-worker.d.ts +6 -0
- package/dist/ai-context-worker.js +7 -1
- package/dist/augmentation.d.ts +17 -0
- package/dist/augmentation.js +32 -0
- package/dist/configure.d.ts +58 -0
- package/dist/configure.js +83 -0
- package/dist/context.d.ts +41 -0
- package/dist/context.js +18 -1
- package/dist/index.d.ts +18 -0
- package/dist/index.js +33 -1
- package/dist/plugin.d.ts +18 -10
- package/dist/plugin.js +76 -248
- package/dist/system-prompt.d.ts +6 -0
- package/dist/system-prompt.js +34 -0
- package/dist/tools/common/index.d.ts +76 -0
- package/dist/tools/common/index.js +48 -0
- package/dist/tools/get-available-commands.d.ts +14 -0
- package/dist/tools/get-available-commands.js +23 -0
- package/dist/tools/get-channel-by-id.d.ts +12 -0
- package/dist/tools/get-channel-by-id.js +35 -0
- package/dist/tools/get-current-client-info.d.ts +4 -0
- package/dist/tools/get-current-client-info.js +21 -0
- package/dist/tools/get-guild-by-id.d.ts +36 -0
- package/dist/tools/get-guild-by-id.js +41 -0
- package/dist/tools/get-user-by-id.d.ts +12 -0
- package/dist/tools/get-user-by-id.js +30 -0
- package/dist/types.d.ts +34 -6
- package/dist/utils.d.ts +6 -0
- package/dist/utils.js +24 -0
- package/package.json +3 -3
- package/dist/schema.d.ts +0 -159
- package/dist/schema.js +0 -105
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const getChannelById: import("ai").Tool<z.ZodObject<{
|
|
3
|
+
channelId: z.ZodString;
|
|
4
|
+
}, "strip", z.ZodTypeAny, {
|
|
5
|
+
channelId: string;
|
|
6
|
+
}, {
|
|
7
|
+
channelId: string;
|
|
8
|
+
}>, unknown> & {
|
|
9
|
+
execute: (args: {
|
|
10
|
+
channelId: string;
|
|
11
|
+
}, options: import("ai").ToolExecutionOptions) => PromiseLike<unknown>;
|
|
12
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getChannelById = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const common_1 = require("./common");
|
|
6
|
+
const commandkit_1 = require("commandkit");
|
|
7
|
+
exports.getChannelById = (0, common_1.createTool)({
|
|
8
|
+
description: 'Get a channel by its ID.',
|
|
9
|
+
name: 'getChannelById',
|
|
10
|
+
parameters: zod_1.z.object({
|
|
11
|
+
channelId: zod_1.z.string().describe('The ID of the channel to retrieve.'),
|
|
12
|
+
}),
|
|
13
|
+
async execute(ctx, params) {
|
|
14
|
+
try {
|
|
15
|
+
const { client } = ctx;
|
|
16
|
+
const channel = await client.channels.fetch(params.channelId, {
|
|
17
|
+
force: false,
|
|
18
|
+
cache: true,
|
|
19
|
+
});
|
|
20
|
+
if (!channel) {
|
|
21
|
+
return {
|
|
22
|
+
error: 'Channel not found',
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
return channel.toJSON();
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
commandkit_1.Logger.error(e);
|
|
29
|
+
return {
|
|
30
|
+
error: 'Could not fetch the channel',
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWNoYW5uZWwtYnktaWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9vbHMvZ2V0LWNoYW5uZWwtYnktaWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQXdCO0FBQ3hCLHFDQUFzQztBQUN0QywyQ0FBb0M7QUFFdkIsUUFBQSxjQUFjLEdBQUcsSUFBQSxtQkFBVSxFQUFDO0lBQ3ZDLFdBQVcsRUFBRSwwQkFBMEI7SUFDdkMsSUFBSSxFQUFFLGdCQUFnQjtJQUN0QixVQUFVLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNuQixTQUFTLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxvQ0FBb0MsQ0FBQztLQUNyRSxDQUFDO0lBQ0YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsTUFBTTtRQUN2QixJQUFJLENBQUM7WUFDSCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDO1lBQ3ZCLE1BQU0sT0FBTyxHQUFHLE1BQU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtnQkFDNUQsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osS0FBSyxFQUFFLElBQUk7YUFDWixDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2IsT0FBTztvQkFDTCxLQUFLLEVBQUUsbUJBQW1CO2lCQUMzQixDQUFDO1lBQ0osQ0FBQztZQUVELE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzFCLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsbUJBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFaEIsT0FBTztnQkFDTCxLQUFLLEVBQUUsNkJBQTZCO2FBQ3JDLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztDQUNGLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCurrentClientInfo = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const common_1 = require("./common");
|
|
6
|
+
exports.getCurrentClientInfo = (0, common_1.createTool)({
|
|
7
|
+
name: 'getCurrentClientInfo',
|
|
8
|
+
description: 'Get information about the current discord bot user',
|
|
9
|
+
parameters: zod_1.z.object({}),
|
|
10
|
+
execute: async (ctx, params) => {
|
|
11
|
+
const { client } = ctx;
|
|
12
|
+
const user = client.user;
|
|
13
|
+
if (!user) {
|
|
14
|
+
return {
|
|
15
|
+
error: 'Bot user not found',
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return user.toJSON();
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWN1cnJlbnQtY2xpZW50LWluZm8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9vbHMvZ2V0LWN1cnJlbnQtY2xpZW50LWluZm8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQXdCO0FBQ3hCLHFDQUFzQztBQUV6QixRQUFBLG9CQUFvQixHQUFHLElBQUEsbUJBQVUsRUFBQztJQUM3QyxJQUFJLEVBQUUsc0JBQXNCO0lBQzVCLFdBQVcsRUFBRSxvREFBb0Q7SUFDakUsVUFBVSxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO0lBQ3hCLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQzdCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFDdkIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUV6QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixPQUFPO2dCQUNMLEtBQUssRUFBRSxvQkFBb0I7YUFDNUIsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN2QixDQUFDO0NBQ0YsQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const getGuildById: import("ai").Tool<z.ZodObject<{
|
|
3
|
+
guildId: z.ZodString;
|
|
4
|
+
}, "strip", z.ZodTypeAny, {
|
|
5
|
+
guildId: string;
|
|
6
|
+
}, {
|
|
7
|
+
guildId: string;
|
|
8
|
+
}>, {
|
|
9
|
+
error: string;
|
|
10
|
+
id?: undefined;
|
|
11
|
+
name?: undefined;
|
|
12
|
+
icon?: undefined;
|
|
13
|
+
memberCount?: undefined;
|
|
14
|
+
} | {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
icon: string | null;
|
|
18
|
+
memberCount: number;
|
|
19
|
+
error?: undefined;
|
|
20
|
+
}> & {
|
|
21
|
+
execute: (args: {
|
|
22
|
+
guildId: string;
|
|
23
|
+
}, options: import("ai").ToolExecutionOptions) => PromiseLike<{
|
|
24
|
+
error: string;
|
|
25
|
+
id?: undefined;
|
|
26
|
+
name?: undefined;
|
|
27
|
+
icon?: undefined;
|
|
28
|
+
memberCount?: undefined;
|
|
29
|
+
} | {
|
|
30
|
+
id: string;
|
|
31
|
+
name: string;
|
|
32
|
+
icon: string | null;
|
|
33
|
+
memberCount: number;
|
|
34
|
+
error?: undefined;
|
|
35
|
+
}>;
|
|
36
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getGuildById = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const common_1 = require("./common");
|
|
6
|
+
const commandkit_1 = require("commandkit");
|
|
7
|
+
exports.getGuildById = (0, common_1.createTool)({
|
|
8
|
+
description: 'Get a guild by its ID.',
|
|
9
|
+
name: 'getGuildById',
|
|
10
|
+
parameters: zod_1.z.object({
|
|
11
|
+
guildId: zod_1.z.string().describe('The ID of the guild to retrieve.'),
|
|
12
|
+
}),
|
|
13
|
+
async execute(ctx, params) {
|
|
14
|
+
try {
|
|
15
|
+
const { client } = ctx;
|
|
16
|
+
const guild = await client.guilds.fetch({
|
|
17
|
+
guild: params.guildId,
|
|
18
|
+
force: false,
|
|
19
|
+
cache: true,
|
|
20
|
+
});
|
|
21
|
+
if (!guild) {
|
|
22
|
+
return {
|
|
23
|
+
error: 'Guild not found',
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
id: guild.id,
|
|
28
|
+
name: guild.name,
|
|
29
|
+
icon: guild.iconURL(),
|
|
30
|
+
memberCount: guild.approximateMemberCount ?? guild.memberCount,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
commandkit_1.Logger.error(e);
|
|
35
|
+
return {
|
|
36
|
+
error: 'Could not fetch the guild',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWd1aWxkLWJ5LWlkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xzL2dldC1ndWlsZC1ieS1pZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBd0I7QUFDeEIscUNBQXNDO0FBQ3RDLDJDQUFvQztBQUV2QixRQUFBLFlBQVksR0FBRyxJQUFBLG1CQUFVLEVBQUM7SUFDckMsV0FBVyxFQUFFLHdCQUF3QjtJQUNyQyxJQUFJLEVBQUUsY0FBYztJQUNwQixVQUFVLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNuQixPQUFPLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxrQ0FBa0MsQ0FBQztLQUNqRSxDQUFDO0lBQ0YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsTUFBTTtRQUN2QixJQUFJLENBQUM7WUFDSCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDO1lBQ3ZCLE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBQ3RDLEtBQUssRUFBRSxNQUFNLENBQUMsT0FBTztnQkFDckIsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osS0FBSyxFQUFFLElBQUk7YUFDWixDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1gsT0FBTztvQkFDTCxLQUFLLEVBQUUsaUJBQWlCO2lCQUN6QixDQUFDO1lBQ0osQ0FBQztZQUVELE9BQU87Z0JBQ0wsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFO2dCQUNaLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDaEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUU7Z0JBQ3JCLFdBQVcsRUFBRSxLQUFLLENBQUMsc0JBQXNCLElBQUksS0FBSyxDQUFDLFdBQVc7YUFDL0QsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsbUJBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFaEIsT0FBTztnQkFDTCxLQUFLLEVBQUUsMkJBQTJCO2FBQ25DLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztDQUNGLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const getUserById: import("ai").Tool<z.ZodObject<{
|
|
3
|
+
userId: z.ZodString;
|
|
4
|
+
}, "strip", z.ZodTypeAny, {
|
|
5
|
+
userId: string;
|
|
6
|
+
}, {
|
|
7
|
+
userId: string;
|
|
8
|
+
}>, unknown> & {
|
|
9
|
+
execute: (args: {
|
|
10
|
+
userId: string;
|
|
11
|
+
}, options: import("ai").ToolExecutionOptions) => PromiseLike<unknown>;
|
|
12
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getUserById = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const common_1 = require("./common");
|
|
6
|
+
const commandkit_1 = require("commandkit");
|
|
7
|
+
exports.getUserById = (0, common_1.createTool)({
|
|
8
|
+
description: 'Get a user by their ID.',
|
|
9
|
+
name: 'getUserById',
|
|
10
|
+
parameters: zod_1.z.object({
|
|
11
|
+
userId: zod_1.z.string().describe('The ID of the user to retrieve.'),
|
|
12
|
+
}),
|
|
13
|
+
async execute(ctx, params) {
|
|
14
|
+
try {
|
|
15
|
+
const { client } = ctx;
|
|
16
|
+
const user = await client.users.fetch(params.userId, {
|
|
17
|
+
force: false,
|
|
18
|
+
cache: true,
|
|
19
|
+
});
|
|
20
|
+
return user.toJSON();
|
|
21
|
+
}
|
|
22
|
+
catch (e) {
|
|
23
|
+
commandkit_1.Logger.error(e);
|
|
24
|
+
return {
|
|
25
|
+
error: 'Could not fetch the user',
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXVzZXItYnktaWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9vbHMvZ2V0LXVzZXItYnktaWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQXdCO0FBQ3hCLHFDQUFzQztBQUN0QywyQ0FBb0M7QUFFdkIsUUFBQSxXQUFXLEdBQUcsSUFBQSxtQkFBVSxFQUFDO0lBQ3BDLFdBQVcsRUFBRSx5QkFBeUI7SUFDdEMsSUFBSSxFQUFFLGFBQWE7SUFDbkIsVUFBVSxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUM7UUFDbkIsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsaUNBQWlDLENBQUM7S0FDL0QsQ0FBQztJQUNGLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE1BQU07UUFDdkIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQztZQUN2QixNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7Z0JBQ25ELEtBQUssRUFBRSxLQUFLO2dCQUNaLEtBQUssRUFBRSxJQUFJO2FBQ1osQ0FBQyxDQUFDO1lBRUgsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxtQkFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVoQixPQUFPO2dCQUNMLEtBQUssRUFBRSwwQkFBMEI7YUFDbEMsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0YsQ0FBQyxDQUFDIn0=
|
package/dist/types.d.ts
CHANGED
|
@@ -1,13 +1,41 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Tool, type generateText } from 'ai';
|
|
2
2
|
import { Message } from 'discord.js';
|
|
3
3
|
import { AiContext } from './context';
|
|
4
|
+
import { LoadedCommand } from 'commandkit';
|
|
5
|
+
/**
|
|
6
|
+
* Represents the result of an AI text generation operation.
|
|
7
|
+
*/
|
|
8
|
+
export type AIGenerateResult = Awaited<ReturnType<typeof generateText>>;
|
|
9
|
+
/**
|
|
10
|
+
* Function type for filtering commands based on their name.
|
|
11
|
+
* @param commandName - The name of the command to filter.
|
|
12
|
+
* @returns A boolean indicating whether the command should be included in the filter.
|
|
13
|
+
*/
|
|
4
14
|
export type CommandFilterFunction = (commandName: string) => boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Function type for filtering messages before they are processed by the AI.
|
|
17
|
+
* @param message - The message to filter.
|
|
18
|
+
* @returns A promise that resolves to a boolean indicating whether the message should be processed.
|
|
19
|
+
*/
|
|
5
20
|
export type MessageFilter = (message: Message) => Promise<boolean>;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Function type for selecting an AI model based on the message.
|
|
23
|
+
* @param message - The message to base the model selection on.
|
|
24
|
+
* @returns A promise that resolves to an object containing the selected model and optional metadata.
|
|
25
|
+
*/
|
|
26
|
+
export type SelectAiModel = (ctx: AiContext, message: Message) => Promise<SelectAiModelResult>;
|
|
27
|
+
export type SelectAiModelResult = Parameters<typeof generateText>[0];
|
|
28
|
+
export type CommandTool = LoadedCommand & {
|
|
29
|
+
tool: Tool;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Options for the AI plugin.
|
|
33
|
+
*/
|
|
11
34
|
export interface AiPluginOptions {
|
|
12
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Represents a command that can be executed by the AI.
|
|
38
|
+
* @param T - The type of parameters that the command accepts.
|
|
39
|
+
* @param ctx - The AI context in which the command is executed, including the message and parameters.
|
|
40
|
+
*/
|
|
13
41
|
export type AiCommand<T extends Record<string, unknown>> = (ctx: AiContext<T>) => Promise<unknown> | unknown;
|
package/dist/utils.d.ts
ADDED
package/dist/utils.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createTypingIndicator = createTypingIndicator;
|
|
4
|
+
/**
|
|
5
|
+
* @private
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
async function createTypingIndicator(channel) {
|
|
9
|
+
let stopped = false;
|
|
10
|
+
const runner = async () => {
|
|
11
|
+
if (stopped)
|
|
12
|
+
return clearInterval(typingInterval);
|
|
13
|
+
if (channel.isSendable()) {
|
|
14
|
+
await channel.sendTyping().catch(Object);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const typingInterval = setInterval(runner, 3000).unref();
|
|
18
|
+
await runner();
|
|
19
|
+
return () => {
|
|
20
|
+
stopped = true;
|
|
21
|
+
clearInterval(typingInterval);
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFNQSxzREFxQkM7QUF6QkQ7OztHQUdHO0FBQ0ksS0FBSyxVQUFVLHFCQUFxQixDQUN6QyxPQUF5QjtJQUV6QixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFFcEIsTUFBTSxNQUFNLEdBQUcsS0FBSyxJQUFJLEVBQUU7UUFDeEIsSUFBSSxPQUFPO1lBQUUsT0FBTyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFbEQsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUN6QixNQUFNLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0MsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLE1BQU0sY0FBYyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFFekQsTUFBTSxNQUFNLEVBQUUsQ0FBQztJQUVmLE9BQU8sR0FBRyxFQUFFO1FBQ1YsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNmLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNoQyxDQUFDLENBQUM7QUFDSixDQUFDIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@commandkit/ai",
|
|
3
|
-
"version": "0.1.0-dev.
|
|
3
|
+
"version": "0.1.0-dev.20250611155146",
|
|
4
4
|
"description": "Supercharge your CommandKit bot with AI capabilities",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist"
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"discord.js": "^14.19.3",
|
|
26
26
|
"typescript": "^5.7.3",
|
|
27
|
-
"tsconfig": "0.0.0-dev.
|
|
28
|
-
"commandkit": "1.0.0-dev.
|
|
27
|
+
"tsconfig": "0.0.0-dev.20250611155146",
|
|
28
|
+
"commandkit": "1.0.0-dev.20250611155146"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"ai": "^4.3.16",
|
package/dist/schema.d.ts
DELETED
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
export declare const AiResponseSchema: z.ZodObject<{
|
|
3
|
-
content: z.ZodOptional<z.ZodString>;
|
|
4
|
-
embed: z.ZodOptional<z.ZodObject<{
|
|
5
|
-
title: z.ZodOptional<z.ZodString>;
|
|
6
|
-
description: z.ZodOptional<z.ZodString>;
|
|
7
|
-
url: z.ZodOptional<z.ZodString>;
|
|
8
|
-
color: z.ZodOptional<z.ZodNumber>;
|
|
9
|
-
thumbnailImage: z.ZodOptional<z.ZodString>;
|
|
10
|
-
image: z.ZodOptional<z.ZodString>;
|
|
11
|
-
footer: z.ZodOptional<z.ZodString>;
|
|
12
|
-
footerIcon: z.ZodOptional<z.ZodString>;
|
|
13
|
-
fields: z.ZodOptional<z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
14
|
-
name: z.ZodString;
|
|
15
|
-
value: z.ZodString;
|
|
16
|
-
inline: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
17
|
-
}, "strip", z.ZodTypeAny, {
|
|
18
|
-
value: string;
|
|
19
|
-
name: string;
|
|
20
|
-
inline: boolean;
|
|
21
|
-
}, {
|
|
22
|
-
value: string;
|
|
23
|
-
name: string;
|
|
24
|
-
inline?: boolean | undefined;
|
|
25
|
-
}>, "many">>>;
|
|
26
|
-
}, "strip", z.ZodTypeAny, {
|
|
27
|
-
title?: string | undefined;
|
|
28
|
-
description?: string | undefined;
|
|
29
|
-
url?: string | undefined;
|
|
30
|
-
color?: number | undefined;
|
|
31
|
-
thumbnailImage?: string | undefined;
|
|
32
|
-
image?: string | undefined;
|
|
33
|
-
footer?: string | undefined;
|
|
34
|
-
footerIcon?: string | undefined;
|
|
35
|
-
fields?: {
|
|
36
|
-
value: string;
|
|
37
|
-
name: string;
|
|
38
|
-
inline: boolean;
|
|
39
|
-
}[] | undefined;
|
|
40
|
-
}, {
|
|
41
|
-
title?: string | undefined;
|
|
42
|
-
description?: string | undefined;
|
|
43
|
-
url?: string | undefined;
|
|
44
|
-
color?: number | undefined;
|
|
45
|
-
thumbnailImage?: string | undefined;
|
|
46
|
-
image?: string | undefined;
|
|
47
|
-
footer?: string | undefined;
|
|
48
|
-
footerIcon?: string | undefined;
|
|
49
|
-
fields?: {
|
|
50
|
-
value: string;
|
|
51
|
-
name: string;
|
|
52
|
-
inline?: boolean | undefined;
|
|
53
|
-
}[] | undefined;
|
|
54
|
-
}>>;
|
|
55
|
-
poll: z.ZodOptional<z.ZodObject<{
|
|
56
|
-
question: z.ZodObject<{
|
|
57
|
-
text: z.ZodString;
|
|
58
|
-
emoji: z.ZodOptional<z.ZodString>;
|
|
59
|
-
}, "strip", z.ZodTypeAny, {
|
|
60
|
-
text: string;
|
|
61
|
-
emoji?: string | undefined;
|
|
62
|
-
}, {
|
|
63
|
-
text: string;
|
|
64
|
-
emoji?: string | undefined;
|
|
65
|
-
}>;
|
|
66
|
-
answers: z.ZodArray<z.ZodObject<{
|
|
67
|
-
text: z.ZodString;
|
|
68
|
-
emoji: z.ZodOptional<z.ZodString>;
|
|
69
|
-
}, "strip", z.ZodTypeAny, {
|
|
70
|
-
text: string;
|
|
71
|
-
emoji?: string | undefined;
|
|
72
|
-
}, {
|
|
73
|
-
text: string;
|
|
74
|
-
emoji?: string | undefined;
|
|
75
|
-
}>, "many">;
|
|
76
|
-
allow_multiselect: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
77
|
-
duration: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
78
|
-
}, "strip", z.ZodTypeAny, {
|
|
79
|
-
question: {
|
|
80
|
-
text: string;
|
|
81
|
-
emoji?: string | undefined;
|
|
82
|
-
};
|
|
83
|
-
answers: {
|
|
84
|
-
text: string;
|
|
85
|
-
emoji?: string | undefined;
|
|
86
|
-
}[];
|
|
87
|
-
allow_multiselect: boolean;
|
|
88
|
-
duration: number;
|
|
89
|
-
}, {
|
|
90
|
-
question: {
|
|
91
|
-
text: string;
|
|
92
|
-
emoji?: string | undefined;
|
|
93
|
-
};
|
|
94
|
-
answers: {
|
|
95
|
-
text: string;
|
|
96
|
-
emoji?: string | undefined;
|
|
97
|
-
}[];
|
|
98
|
-
allow_multiselect?: boolean | undefined;
|
|
99
|
-
duration?: number | undefined;
|
|
100
|
-
}>>;
|
|
101
|
-
}, "strip", z.ZodTypeAny, {
|
|
102
|
-
content?: string | undefined;
|
|
103
|
-
embed?: {
|
|
104
|
-
title?: string | undefined;
|
|
105
|
-
description?: string | undefined;
|
|
106
|
-
url?: string | undefined;
|
|
107
|
-
color?: number | undefined;
|
|
108
|
-
thumbnailImage?: string | undefined;
|
|
109
|
-
image?: string | undefined;
|
|
110
|
-
footer?: string | undefined;
|
|
111
|
-
footerIcon?: string | undefined;
|
|
112
|
-
fields?: {
|
|
113
|
-
value: string;
|
|
114
|
-
name: string;
|
|
115
|
-
inline: boolean;
|
|
116
|
-
}[] | undefined;
|
|
117
|
-
} | undefined;
|
|
118
|
-
poll?: {
|
|
119
|
-
question: {
|
|
120
|
-
text: string;
|
|
121
|
-
emoji?: string | undefined;
|
|
122
|
-
};
|
|
123
|
-
answers: {
|
|
124
|
-
text: string;
|
|
125
|
-
emoji?: string | undefined;
|
|
126
|
-
}[];
|
|
127
|
-
allow_multiselect: boolean;
|
|
128
|
-
duration: number;
|
|
129
|
-
} | undefined;
|
|
130
|
-
}, {
|
|
131
|
-
content?: string | undefined;
|
|
132
|
-
embed?: {
|
|
133
|
-
title?: string | undefined;
|
|
134
|
-
description?: string | undefined;
|
|
135
|
-
url?: string | undefined;
|
|
136
|
-
color?: number | undefined;
|
|
137
|
-
thumbnailImage?: string | undefined;
|
|
138
|
-
image?: string | undefined;
|
|
139
|
-
footer?: string | undefined;
|
|
140
|
-
footerIcon?: string | undefined;
|
|
141
|
-
fields?: {
|
|
142
|
-
value: string;
|
|
143
|
-
name: string;
|
|
144
|
-
inline?: boolean | undefined;
|
|
145
|
-
}[] | undefined;
|
|
146
|
-
} | undefined;
|
|
147
|
-
poll?: {
|
|
148
|
-
question: {
|
|
149
|
-
text: string;
|
|
150
|
-
emoji?: string | undefined;
|
|
151
|
-
};
|
|
152
|
-
answers: {
|
|
153
|
-
text: string;
|
|
154
|
-
emoji?: string | undefined;
|
|
155
|
-
}[];
|
|
156
|
-
allow_multiselect?: boolean | undefined;
|
|
157
|
-
duration?: number | undefined;
|
|
158
|
-
} | undefined;
|
|
159
|
-
}>;
|
package/dist/schema.js
DELETED
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AiResponseSchema = void 0;
|
|
4
|
-
const zod_1 = require("zod");
|
|
5
|
-
const pollMediaObject = zod_1.z
|
|
6
|
-
.object({
|
|
7
|
-
text: zod_1.z.string().trim().describe('The question text of the poll'),
|
|
8
|
-
emoji: zod_1.z
|
|
9
|
-
.string()
|
|
10
|
-
.trim()
|
|
11
|
-
.optional()
|
|
12
|
-
.describe('An optional emoji associated with the poll question. Eg: 👍'),
|
|
13
|
-
})
|
|
14
|
-
.describe('An object representing the media for a poll question, containing the text of the question. Emoji cannot be used in question text.');
|
|
15
|
-
exports.AiResponseSchema = zod_1.z
|
|
16
|
-
.object({
|
|
17
|
-
content: zod_1.z
|
|
18
|
-
.string()
|
|
19
|
-
.trim()
|
|
20
|
-
.optional()
|
|
21
|
-
.describe('The content of the message. This can be plain text or markdown. This is an optional field.'),
|
|
22
|
-
embed: zod_1.z
|
|
23
|
-
.object({
|
|
24
|
-
title: zod_1.z
|
|
25
|
-
.string()
|
|
26
|
-
.trim()
|
|
27
|
-
.optional()
|
|
28
|
-
.describe('The title of the embed. This is an optional field.'),
|
|
29
|
-
description: zod_1.z
|
|
30
|
-
.string()
|
|
31
|
-
.trim()
|
|
32
|
-
.optional()
|
|
33
|
-
.describe('The description of the embed. This is an optional field.'),
|
|
34
|
-
url: zod_1.z
|
|
35
|
-
.string()
|
|
36
|
-
.optional()
|
|
37
|
-
.describe('A URL associated with the embed. This is an optional field.'),
|
|
38
|
-
color: zod_1.z
|
|
39
|
-
.number()
|
|
40
|
-
.int()
|
|
41
|
-
.min(0)
|
|
42
|
-
.max(16777215)
|
|
43
|
-
.optional()
|
|
44
|
-
.describe('A color for the embed, represented as an integer in RGB format. This is an optional field.'),
|
|
45
|
-
thumbnailImage: zod_1.z
|
|
46
|
-
.string()
|
|
47
|
-
.optional()
|
|
48
|
-
.describe('A URL for a thumbnail image. This is an optional field.'),
|
|
49
|
-
image: zod_1.z
|
|
50
|
-
.string()
|
|
51
|
-
.optional()
|
|
52
|
-
.describe('A URL for a main image in the embed. This is an optional field.'),
|
|
53
|
-
footer: zod_1.z
|
|
54
|
-
.string()
|
|
55
|
-
.optional()
|
|
56
|
-
.describe('The footer text of the embed. This is an optional field.'),
|
|
57
|
-
footerIcon: zod_1.z
|
|
58
|
-
.string()
|
|
59
|
-
.optional()
|
|
60
|
-
.describe('A URL for an icon to display in the footer of the embed. This is an optional field.'),
|
|
61
|
-
fields: zod_1.z
|
|
62
|
-
.array(zod_1.z.object({
|
|
63
|
-
name: zod_1.z.string().trim().describe('The name of the field.'),
|
|
64
|
-
value: zod_1.z.string().trim().describe('The value of the field.'),
|
|
65
|
-
inline: zod_1.z
|
|
66
|
-
.boolean()
|
|
67
|
-
.optional()
|
|
68
|
-
.default(false)
|
|
69
|
-
.describe('Whether the field should be displayed inline with other fields. This is an optional field which defaults to false.'),
|
|
70
|
-
}))
|
|
71
|
-
.min(0)
|
|
72
|
-
.max(25)
|
|
73
|
-
.default([])
|
|
74
|
-
.optional()
|
|
75
|
-
.describe('An array of fields to include in the embed. Each field should be an object with "name" and "value" properties. This is an optional field.'),
|
|
76
|
-
})
|
|
77
|
-
.optional()
|
|
78
|
-
.describe('An object representing embeds to include in the discord message. This is an optional field.'),
|
|
79
|
-
poll: zod_1.z
|
|
80
|
-
.object({
|
|
81
|
-
question: pollMediaObject,
|
|
82
|
-
answers: zod_1.z
|
|
83
|
-
.array(pollMediaObject)
|
|
84
|
-
.min(1)
|
|
85
|
-
.max(10)
|
|
86
|
-
.describe('An array of answers for the poll'),
|
|
87
|
-
allow_multiselect: zod_1.z
|
|
88
|
-
.boolean()
|
|
89
|
-
.optional()
|
|
90
|
-
.default(false)
|
|
91
|
-
.describe('Whether the poll allows multiple selections'),
|
|
92
|
-
duration: zod_1.z
|
|
93
|
-
.number()
|
|
94
|
-
.int()
|
|
95
|
-
.min(1)
|
|
96
|
-
.max(32)
|
|
97
|
-
.optional()
|
|
98
|
-
.default(24)
|
|
99
|
-
.describe('The duration of the poll in hours'),
|
|
100
|
-
})
|
|
101
|
-
.optional()
|
|
102
|
-
.describe('An object representing a poll to include in the message'),
|
|
103
|
-
})
|
|
104
|
-
.describe('The schema for an AI response message to be sent to discord, including content and embeds. At least one of content, embeds, or poll must be present.');
|
|
105
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBd0I7QUFFeEIsTUFBTSxlQUFlLEdBQUcsT0FBQztLQUN0QixNQUFNLENBQUM7SUFDTixJQUFJLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQywrQkFBK0IsQ0FBQztJQUNqRSxLQUFLLEVBQUUsT0FBQztTQUNMLE1BQU0sRUFBRTtTQUNSLElBQUksRUFBRTtTQUNOLFFBQVEsRUFBRTtTQUNWLFFBQVEsQ0FBQyw2REFBNkQsQ0FBQztDQUMzRSxDQUFDO0tBQ0QsUUFBUSxDQUNQLG1JQUFtSSxDQUNwSSxDQUFDO0FBRVMsUUFBQSxnQkFBZ0IsR0FBRyxPQUFDO0tBQzlCLE1BQU0sQ0FBQztJQUNOLE9BQU8sRUFBRSxPQUFDO1NBQ1AsTUFBTSxFQUFFO1NBQ1IsSUFBSSxFQUFFO1NBQ04sUUFBUSxFQUFFO1NBQ1YsUUFBUSxDQUNQLDRGQUE0RixDQUM3RjtJQUNILEtBQUssRUFBRSxPQUFDO1NBQ0wsTUFBTSxDQUFDO1FBQ04sS0FBSyxFQUFFLE9BQUM7YUFDTCxNQUFNLEVBQUU7YUFDUixJQUFJLEVBQUU7YUFDTixRQUFRLEVBQUU7YUFDVixRQUFRLENBQUMsb0RBQW9ELENBQUM7UUFDakUsV0FBVyxFQUFFLE9BQUM7YUFDWCxNQUFNLEVBQUU7YUFDUixJQUFJLEVBQUU7YUFDTixRQUFRLEVBQUU7YUFDVixRQUFRLENBQUMsMERBQTBELENBQUM7UUFDdkUsR0FBRyxFQUFFLE9BQUM7YUFDSCxNQUFNLEVBQUU7YUFDUixRQUFRLEVBQUU7YUFDVixRQUFRLENBQ1AsNkRBQTZELENBQzlEO1FBQ0gsS0FBSyxFQUFFLE9BQUM7YUFDTCxNQUFNLEVBQUU7YUFDUixHQUFHLEVBQUU7YUFDTCxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ04sR0FBRyxDQUFDLFFBQVEsQ0FBQzthQUNiLFFBQVEsRUFBRTthQUNWLFFBQVEsQ0FDUCw0RkFBNEYsQ0FDN0Y7UUFDSCxjQUFjLEVBQUUsT0FBQzthQUNkLE1BQU0sRUFBRTthQUNSLFFBQVEsRUFBRTthQUNWLFFBQVEsQ0FBQyx5REFBeUQsQ0FBQztRQUN0RSxLQUFLLEVBQUUsT0FBQzthQUNMLE1BQU0sRUFBRTthQUNSLFFBQVEsRUFBRTthQUNWLFFBQVEsQ0FDUCxpRUFBaUUsQ0FDbEU7UUFDSCxNQUFNLEVBQUUsT0FBQzthQUNOLE1BQU0sRUFBRTthQUNSLFFBQVEsRUFBRTthQUNWLFFBQVEsQ0FBQywwREFBMEQsQ0FBQztRQUN2RSxVQUFVLEVBQUUsT0FBQzthQUNWLE1BQU0sRUFBRTthQUNSLFFBQVEsRUFBRTthQUNWLFFBQVEsQ0FDUCxxRkFBcUYsQ0FDdEY7UUFDSCxNQUFNLEVBQUUsT0FBQzthQUNOLEtBQUssQ0FDSixPQUFDLENBQUMsTUFBTSxDQUFDO1lBQ1AsSUFBSSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUM7WUFDMUQsS0FBSyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUM7WUFDNUQsTUFBTSxFQUFFLE9BQUM7aUJBQ04sT0FBTyxFQUFFO2lCQUNULFFBQVEsRUFBRTtpQkFDVixPQUFPLENBQUMsS0FBSyxDQUFDO2lCQUNkLFFBQVEsQ0FDUCxvSEFBb0gsQ0FDckg7U0FDSixDQUFDLENBQ0g7YUFDQSxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ04sR0FBRyxDQUFDLEVBQUUsQ0FBQzthQUNQLE9BQU8sQ0FBQyxFQUFFLENBQUM7YUFDWCxRQUFRLEVBQUU7YUFDVixRQUFRLENBQ1AsMklBQTJJLENBQzVJO0tBQ0osQ0FBQztTQUNELFFBQVEsRUFBRTtTQUNWLFFBQVEsQ0FDUCw2RkFBNkYsQ0FDOUY7SUFDSCxJQUFJLEVBQUUsT0FBQztTQUNKLE1BQU0sQ0FBQztRQUNOLFFBQVEsRUFBRSxlQUFlO1FBQ3pCLE9BQU8sRUFBRSxPQUFDO2FBQ1AsS0FBSyxDQUFDLGVBQWUsQ0FBQzthQUN0QixHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ04sR0FBRyxDQUFDLEVBQUUsQ0FBQzthQUNQLFFBQVEsQ0FBQyxrQ0FBa0MsQ0FBQztRQUMvQyxpQkFBaUIsRUFBRSxPQUFDO2FBQ2pCLE9BQU8sRUFBRTthQUNULFFBQVEsRUFBRTthQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUM7YUFDZCxRQUFRLENBQUMsNkNBQTZDLENBQUM7UUFDMUQsUUFBUSxFQUFFLE9BQUM7YUFDUixNQUFNLEVBQUU7YUFDUixHQUFHLEVBQUU7YUFDTCxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ04sR0FBRyxDQUFDLEVBQUUsQ0FBQzthQUNQLFFBQVEsRUFBRTthQUNWLE9BQU8sQ0FBQyxFQUFFLENBQUM7YUFDWCxRQUFRLENBQUMsbUNBQW1DLENBQUM7S0FDakQsQ0FBQztTQUNELFFBQVEsRUFBRTtTQUNWLFFBQVEsQ0FBQyx5REFBeUQsQ0FBQztDQUN2RSxDQUFDO0tBQ0QsUUFBUSxDQUNQLHNKQUFzSixDQUN2SixDQUFDIn0=
|