mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-08-04 16:38:49 +00:00
52 lines
1.5 KiB
TypeScript
52 lines
1.5 KiB
TypeScript
import type { SlashCommand } from "@/lib/types";
|
|
|
|
type ResolvedSlashCommandLifecycle =
|
|
| "side_channel"
|
|
| "finalize_active_turn"
|
|
| "stop_active_turn"
|
|
| "agent_turn";
|
|
|
|
function slashCommandName(content: string): string {
|
|
return content.split(/\s+/, 1)[0];
|
|
}
|
|
|
|
function slashCommandArgs(content: string, commandName: string): string {
|
|
return content.slice(commandName.length).trim();
|
|
}
|
|
|
|
export function matchingSlashCommand(
|
|
content: string,
|
|
slashCommands: SlashCommand[],
|
|
): SlashCommand | null {
|
|
const commandName = slashCommandName(content);
|
|
if (!commandName.startsWith("/")) return null;
|
|
const command = slashCommands.find((item) => item.command === commandName);
|
|
if (!command) return null;
|
|
if (slashCommandArgs(content, command.command).length > 0 && !command.acceptsArgs) return null;
|
|
return command;
|
|
}
|
|
|
|
export function slashCommandLifecycle(
|
|
content: string,
|
|
slashCommands: SlashCommand[],
|
|
): ResolvedSlashCommandLifecycle | null {
|
|
const command = matchingSlashCommand(content, slashCommands);
|
|
if (!command) return null;
|
|
if (command.lifecycle === "agent_turn_with_args") {
|
|
return slashCommandArgs(content, command.command).length > 0
|
|
? "agent_turn"
|
|
: "side_channel";
|
|
}
|
|
return command.lifecycle;
|
|
}
|
|
|
|
export function isSideChannelLifecycle(
|
|
lifecycle: ResolvedSlashCommandLifecycle | null,
|
|
): boolean {
|
|
return (
|
|
lifecycle === "side_channel"
|
|
|| lifecycle === "finalize_active_turn"
|
|
|| lifecycle === "stop_active_turn"
|
|
);
|
|
}
|