@elizaos/plugin-commands 2.0.0-alpha.9 → 2.0.3-beta.2

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.
@@ -1,17 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/index.ts", "../../src/registry.ts", "../../src/parser.ts", "../../src/actions/commands-list.ts", "../../src/actions/help.ts", "../../src/actions/models.ts", "../../src/actions/status.ts", "../../src/actions/stop.ts"],
4
- "sourcesContent": [
5
- "/**\n * Plugin Commands - Chat command system for Eliza agents\n *\n * Provides a slash-command system with:\n * - /help, /status, /commands for information\n * - /stop, /reset, /compact for session control\n * - /think, /verbose, /model for options\n * - /allowlist, /approve for management\n * - /tts for media\n * - /bash for tools (elevated)\n *\n * INTEGRATION NOTES:\n * - Commands are registered as Actions with strict validate() that only\n * matches slash-prefixed messages (e.g. /help, !stop). This prevents\n * conflicts with bootstrap actions (STATUS, IGNORE) and messaging plugins.\n * - Similes use ONLY slash-command forms (no natural language) so the LLM\n * won't accidentally route \"I need help\" to HELP_COMMAND instead of REPLY.\n * - The registry is scoped per runtime to prevent cross-agent state leaks.\n * - The COMMAND_REGISTRY provider includes the command list in the LLM context\n * ONLY when the message is a command, reducing prompt noise for normal messages.\n */\n\nimport {\n\ttype IAgentRuntime,\n\tlogger,\n\ttype Memory,\n\ttype Plugin,\n\ttype Provider,\n\ttype ProviderResult,\n\ttype State,\n} from \"@elizaos/core\";\n// Import actions\nimport { commandsListAction } from \"./actions/commands-list\";\nimport { helpAction } from \"./actions/help\";\nimport { modelsAction } from \"./actions/models\";\nimport { statusAction } from \"./actions/status\";\nimport { stopAction } from \"./actions/stop\";\nimport { detectCommand, hasCommand, normalizeCommandBody } from \"./parser\";\nimport {\n\tfindCommandByAlias,\n\tfindCommandByKey,\n\tgetCommandsByCategory,\n\tgetEnabledCommands,\n\tinitForRuntime,\n\tregisterCommand,\n\tunregisterCommand,\n\tuseRuntime,\n} from \"./registry\";\nimport type { CommandContext, CommandDefinition, CommandResult } from \"./types\";\n\nexport * from \"./parser\";\nexport * from \"./registry\";\n// Re-export everything\nexport * from \"./types\";\n\n/**\n * Provider that exposes available commands to the LLM context.\n *\n * Only injects the full command list when the message looks like a command.\n * For normal messages, returns a minimal hint so the LLM knows commands\n * exist but doesn't get a wall of command documentation in its context.\n */\nexport const commandRegistryProvider: Provider = {\n\tname: \"COMMAND_REGISTRY\",\n\tdescription: \"Available chat commands and their descriptions\",\n\tdynamic: true,\n\tasync get(\n\t\truntime: IAgentRuntime,\n\t\tmessage: Memory,\n\t\t_state: State,\n\t): Promise<ProviderResult> {\n\t\t// Scope to the correct runtime's command store\n\t\tuseRuntime(runtime.agentId);\n\n\t\tconst text = message.content?.text ?? \"\";\n\t\tconst isCommand = hasCommand(text);\n\t\tconst commands = getEnabledCommands();\n\n\t\tif (isCommand) {\n\t\t\t// Full command context for command messages — helps the LLM select\n\t\t\t// the right action\n\t\t\tconst commandList = commands.map((cmd) => {\n\t\t\t\tconst auth = cmd.requiresAuth ? \" (requires auth)\" : \"\";\n\t\t\t\treturn `- ${cmd.textAliases[0]}: ${cmd.description}${auth}`;\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\ttext: `The user sent a slash command. Available commands:\\n${commandList.join(\"\\n\")}\\n\\nIMPORTANT: This is a slash command — respond by executing the matching command action, not with conversational text.`,\n\t\t\t\tvalues: {\n\t\t\t\t\tcommandCount: commands.length,\n\t\t\t\t\tisCommand: true,\n\t\t\t\t\thasElevatedCommands: commands.some((c) => c.requiresElevated),\n\t\t\t\t},\n\t\t\t\tdata: { commands, isCommand: true },\n\t\t\t};\n\t\t}\n\n\t\t// Minimal context for non-command messages — don't pollute the prompt\n\t\treturn {\n\t\t\ttext: \"\",\n\t\t\tvalues: {\n\t\t\t\tcommandCount: commands.length,\n\t\t\t\tisCommand: false,\n\t\t\t},\n\t\t\tdata: { isCommand: false },\n\t\t};\n\t},\n};\n\n/**\n * Format command result for display\n */\nexport function formatCommandResult(result: CommandResult): string {\n\tif (result.error) {\n\t\treturn `Error: ${result.error}`;\n\t}\n\treturn result.reply ?? \"Command executed\";\n}\n\n/**\n * Check if a sender is authorized\n */\nexport function isAuthorized(\n\tcontext: CommandContext,\n\tcommand: CommandDefinition,\n): boolean {\n\tif (!command.requiresAuth) {\n\t\treturn true;\n\t}\n\treturn context.isAuthorized;\n}\n\n/**\n * Check if a sender has elevated permissions\n */\nexport function isElevated(\n\tcontext: CommandContext,\n\tcommand: CommandDefinition,\n): boolean {\n\tif (!command.requiresElevated) {\n\t\treturn true;\n\t}\n\treturn context.isElevated;\n}\n\n/**\n * Plugin Commands\n *\n * Provides chat commands as Eliza actions. Commands are detected\n * by their text aliases (e.g., /help, /status) and executed as actions.\n *\n * Design decisions for messaging integration:\n * 1. Actions use strict validate() — only true for slash-prefixed messages\n * 2. Similes are slash-only — no natural language to prevent LLM misrouting\n * 3. Provider is context-aware — full docs for commands, empty for normal msgs\n * 4. Registry is scoped per agentId — no cross-agent contamination\n * 5. Events use proper EventType enums — not raw strings\n */\nexport const commandsPlugin: Plugin = {\n\tname: \"commands\",\n\tdescription: \"Chat command system with /help, /status, /reset, etc.\",\n\n\tproviders: [commandRegistryProvider],\n\n\tactions: [\n\t\thelpAction,\n\t\tstatusAction,\n\t\tstopAction,\n\t\tmodelsAction,\n\t\tcommandsListAction,\n\t],\n\n\tconfig: {\n\t\tCOMMANDS_ENABLED: \"true\",\n\t\tCOMMANDS_CONFIG_ENABLED: \"false\",\n\t\tCOMMANDS_DEBUG_ENABLED: \"false\",\n\t\tCOMMANDS_BASH_ENABLED: \"false\",\n\t\tCOMMANDS_RESTART_ENABLED: \"true\",\n\t},\n\n\ttests: [\n\t\t{\n\t\t\tname: \"command-detection\",\n\t\t\ttests: [\n\t\t\t\t{\n\t\t\t\t\tname: \"Detect command prefix\",\n\t\t\t\t\tfn: async (_runtime: IAgentRuntime) => {\n\t\t\t\t\t\tif (!hasCommand(\"/help\")) {\n\t\t\t\t\t\t\tthrow new Error(\"Should detect /help command\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!hasCommand(\"/status test\")) {\n\t\t\t\t\t\t\tthrow new Error(\"Should detect /status with args\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (hasCommand(\"hello world\")) {\n\t\t\t\t\t\t\tthrow new Error(\"Should not detect plain text as command\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlogger.success(\"Command prefix detection works correctly\");\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"Parse command with args\",\n\t\t\t\t\tfn: async (_runtime: IAgentRuntime) => {\n\t\t\t\t\t\tconst detection = detectCommand(\"/think:high\");\n\t\t\t\t\t\tif (!detection.isCommand) {\n\t\t\t\t\t\t\tthrow new Error(\"Should detect think command\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (detection.command?.key !== \"think\") {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Expected key 'think', got '${detection.command?.key}'`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (detection.command?.args[0] !== \"high\") {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`Expected arg 'high', got '${detection.command?.args[0]}'`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlogger.success(\"Command argument parsing works correctly\");\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"Normalize command body\",\n\t\t\t\t\tfn: async (_runtime: IAgentRuntime) => {\n\t\t\t\t\t\tconst normalized1 = normalizeCommandBody(\"/status: test\");\n\t\t\t\t\t\tif (normalized1 !== \"/status test\") {\n\t\t\t\t\t\t\tthrow new Error(`Expected '/status test', got '${normalized1}'`);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst normalized2 = normalizeCommandBody(\"@bot /help\", \"bot\");\n\t\t\t\t\t\tif (normalized2 !== \"/help\") {\n\t\t\t\t\t\t\tthrow new Error(`Expected '/help', got '${normalized2}'`);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlogger.success(\"Command normalization works correctly\");\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"Find command by alias\",\n\t\t\t\t\tfn: async (_runtime: IAgentRuntime) => {\n\t\t\t\t\t\tconst cmd = findCommandByAlias(\"/h\");\n\t\t\t\t\t\tif (!cmd) {\n\t\t\t\t\t\t\tthrow new Error(\"Should find help command by /h alias\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (cmd.key !== \"help\") {\n\t\t\t\t\t\t\tthrow new Error(`Expected key 'help', got '${cmd.key}'`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlogger.success(\"Command alias lookup works correctly\");\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"Find command by key\",\n\t\t\t\t\tfn: async (_runtime: IAgentRuntime) => {\n\t\t\t\t\t\tconst cmd = findCommandByKey(\"status\");\n\t\t\t\t\t\tif (!cmd) {\n\t\t\t\t\t\t\tthrow new Error(\"Should find status command by key\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (cmd.key !== \"status\") {\n\t\t\t\t\t\t\tthrow new Error(`Expected key 'status', got '${cmd.key}'`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlogger.success(\"Command key lookup works correctly\");\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tname: \"command-registry\",\n\t\t\ttests: [\n\t\t\t\t{\n\t\t\t\t\tname: \"Get enabled commands\",\n\t\t\t\t\tfn: async (_runtime: IAgentRuntime) => {\n\t\t\t\t\t\tconst commands = getEnabledCommands();\n\t\t\t\t\t\tif (commands.length === 0) {\n\t\t\t\t\t\t\tthrow new Error(\"Should have enabled commands\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Check some expected commands exist\n\t\t\t\t\t\tconst cmdHelp = commands.some((c) => c.key === \"help\");\n\t\t\t\t\t\tconst cmdStatus = commands.some((c) => c.key === \"status\");\n\t\t\t\t\t\tif (!cmdHelp || !cmdStatus) {\n\t\t\t\t\t\t\tthrow new Error(\"Should have help and status commands\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlogger.success(\"Command registry works correctly\");\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"Register custom command\",\n\t\t\t\t\tfn: async (_runtime: IAgentRuntime) => {\n\t\t\t\t\t\tconst customCmd: CommandDefinition = {\n\t\t\t\t\t\t\tkey: \"test-custom\",\n\t\t\t\t\t\t\tdescription: \"Test custom command\",\n\t\t\t\t\t\t\ttextAliases: [\"/test-custom\", \"/tc\"],\n\t\t\t\t\t\t\tscope: \"text\",\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tregisterCommand(customCmd);\n\t\t\t\t\t\tconst found = findCommandByKey(\"test-custom\");\n\t\t\t\t\t\tif (!found) {\n\t\t\t\t\t\t\tthrow new Error(\"Should find registered custom command\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tunregisterCommand(\"test-custom\");\n\t\t\t\t\t\tconst notFound = findCommandByKey(\"test-custom\");\n\t\t\t\t\t\tif (notFound) {\n\t\t\t\t\t\t\tthrow new Error(\"Should not find unregistered command\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlogger.success(\"Custom command registration works correctly\");\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"Get commands by category\",\n\t\t\t\t\tfn: async (_runtime: IAgentRuntime) => {\n\t\t\t\t\t\tconst statusCommands = getCommandsByCategory(\"status\");\n\t\t\t\t\t\tif (statusCommands.length === 0) {\n\t\t\t\t\t\t\tthrow new Error(\"Should have status category commands\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst allStatus = statusCommands.every(\n\t\t\t\t\t\t\t(c) => c.category === \"status\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!allStatus) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\"All returned commands should be in status category\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlogger.success(\"Command categorization works correctly\");\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n\n\tasync init(config, runtime) {\n\t\tlogger.log(\"[plugin-commands] Initializing command system\");\n\n\t\t// Initialize an isolated command store for this runtime\n\t\t// This prevents cross-agent contamination in multi-agent deployments\n\t\tinitForRuntime(runtime.agentId);\n\n\t\t// Configure command enablement from config\n\t\tconst configEnabled = config.COMMANDS_CONFIG_ENABLED === \"true\";\n\t\tconst debugEnabled = config.COMMANDS_DEBUG_ENABLED === \"true\";\n\t\tconst bashEnabled = config.COMMANDS_BASH_ENABLED === \"true\";\n\t\tconst restartEnabled = config.COMMANDS_RESTART_ENABLED !== \"false\";\n\n\t\t// Update command enabled states (now on the isolated copy)\n\t\tconst configCmd = findCommandByKey(\"config\");\n\t\tif (configCmd) {\n\t\t\tconfigCmd.enabled = configEnabled;\n\t\t}\n\n\t\tconst debugCmd = findCommandByKey(\"debug\");\n\t\tif (debugCmd) {\n\t\t\tdebugCmd.enabled = debugEnabled;\n\t\t}\n\n\t\tconst bashCmd = findCommandByKey(\"bash\");\n\t\tif (bashCmd) {\n\t\t\tbashCmd.enabled = bashEnabled;\n\t\t}\n\n\t\tconst restartCmd = findCommandByKey(\"restart\");\n\t\tif (restartCmd) {\n\t\t\trestartCmd.enabled = restartEnabled;\n\t\t}\n\n\t\tconst enabledCount = getEnabledCommands().length;\n\t\tlogger.log(\n\t\t\t`[plugin-commands] ${enabledCount} commands enabled for agent ${runtime.agentId}`,\n\t\t);\n\t},\n};\n\nexport default commandsPlugin;\n",
6
- "/**\n * Command registry - defines all available chat commands\n *\n * IMPORTANT: The registry uses module-level state for convenience, but\n * provides `cloneCommands()` and `resetCommands()` so that `init()` can\n * work on isolated copies per runtime. The `init()` function in the main\n * plugin file should clone before mutating to avoid cross-agent contamination.\n */\n\nimport type { CommandDefinition } from \"./types\";\n\n// Default command definitions (frozen reference — never mutate these directly)\nconst DEFAULT_COMMANDS: ReadonlyArray<CommandDefinition> = [\n\t// Status commands\n\t{\n\t\tkey: \"help\",\n\t\tnativeName: \"help\",\n\t\tdescription: \"Show available commands\",\n\t\ttextAliases: [\"/help\", \"/h\", \"/?\"],\n\t\tscope: \"both\",\n\t\tcategory: \"status\",\n\t\tacceptsArgs: false,\n\t},\n\t{\n\t\tkey: \"commands\",\n\t\tnativeName: \"commands\",\n\t\tdescription: \"List all commands\",\n\t\ttextAliases: [\"/commands\", \"/cmds\"],\n\t\tscope: \"both\",\n\t\tcategory: \"status\",\n\t\tacceptsArgs: false,\n\t},\n\t{\n\t\tkey: \"status\",\n\t\tnativeName: \"status\",\n\t\tdescription: \"Show current session status\",\n\t\ttextAliases: [\"/status\", \"/s\"],\n\t\tscope: \"both\",\n\t\tcategory: \"status\",\n\t\tacceptsArgs: false,\n\t},\n\t{\n\t\tkey: \"context\",\n\t\tnativeName: \"context\",\n\t\tdescription: \"Show current context information\",\n\t\ttextAliases: [\"/context\", \"/ctx\"],\n\t\tscope: \"both\",\n\t\tcategory: \"status\",\n\t\tacceptsArgs: true,\n\t\targs: [{ name: \"mode\", description: \"Output mode (list, detail, json)\" }],\n\t},\n\t{\n\t\tkey: \"whoami\",\n\t\tnativeName: \"whoami\",\n\t\tdescription: \"Show your identity information\",\n\t\ttextAliases: [\"/whoami\", \"/who\"],\n\t\tscope: \"both\",\n\t\tcategory: \"status\",\n\t\tacceptsArgs: false,\n\t},\n\n\t// Session commands\n\t{\n\t\tkey: \"stop\",\n\t\tnativeName: \"stop\",\n\t\tdescription: \"Stop current operation\",\n\t\ttextAliases: [\"/stop\", \"/abort\", \"/cancel\"],\n\t\tscope: \"both\",\n\t\tcategory: \"session\",\n\t\tacceptsArgs: false,\n\t},\n\t{\n\t\tkey: \"restart\",\n\t\tnativeName: \"restart\",\n\t\tdescription: \"Restart the session\",\n\t\ttextAliases: [\"/restart\"],\n\t\tscope: \"both\",\n\t\tcategory: \"session\",\n\t\tacceptsArgs: false,\n\t\trequiresAuth: true,\n\t},\n\t{\n\t\tkey: \"reset\",\n\t\tnativeName: \"reset\",\n\t\tdescription: \"Reset session state\",\n\t\ttextAliases: [\"/reset\"],\n\t\tscope: \"both\",\n\t\tcategory: \"session\",\n\t\tacceptsArgs: false,\n\t\trequiresAuth: true,\n\t},\n\t{\n\t\tkey: \"new\",\n\t\tnativeName: \"new\",\n\t\tdescription: \"Start a new conversation\",\n\t\ttextAliases: [\"/new\"],\n\t\tscope: \"both\",\n\t\tcategory: \"session\",\n\t\tacceptsArgs: false,\n\t},\n\t{\n\t\tkey: \"compact\",\n\t\tnativeName: \"compact\",\n\t\tdescription: \"Compact conversation history\",\n\t\ttextAliases: [\"/compact\"],\n\t\tscope: \"both\",\n\t\tcategory: \"session\",\n\t\tacceptsArgs: true,\n\t\targs: [\n\t\t\t{ name: \"instructions\", description: \"Optional compaction instructions\" },\n\t\t],\n\t},\n\n\t// Options commands\n\t{\n\t\tkey: \"think\",\n\t\tnativeName: \"think\",\n\t\tdescription: \"Set thinking level\",\n\t\ttextAliases: [\"/think\", \"/thinking\", \"/t\"],\n\t\tscope: \"both\",\n\t\tcategory: \"options\",\n\t\tacceptsArgs: true,\n\t\targs: [\n\t\t\t{ name: \"level\", description: \"off, minimal, low, medium, high, xhigh\" },\n\t\t],\n\t},\n\t{\n\t\tkey: \"verbose\",\n\t\tnativeName: \"verbose\",\n\t\tdescription: \"Set verbose output level\",\n\t\ttextAliases: [\"/verbose\", \"/v\"],\n\t\tscope: \"both\",\n\t\tcategory: \"options\",\n\t\tacceptsArgs: true,\n\t\targs: [{ name: \"level\", description: \"off, on, full\" }],\n\t},\n\t{\n\t\tkey: \"reasoning\",\n\t\tnativeName: \"reasoning\",\n\t\tdescription: \"Set reasoning visibility\",\n\t\ttextAliases: [\"/reasoning\", \"/reason\"],\n\t\tscope: \"both\",\n\t\tcategory: \"options\",\n\t\tacceptsArgs: true,\n\t\targs: [{ name: \"level\", description: \"off, on, stream\" }],\n\t},\n\t{\n\t\tkey: \"elevated\",\n\t\tnativeName: \"elevated\",\n\t\tdescription: \"Set elevated permission mode\",\n\t\ttextAliases: [\"/elevated\", \"/elev\"],\n\t\tscope: \"both\",\n\t\tcategory: \"options\",\n\t\tacceptsArgs: true,\n\t\targs: [{ name: \"level\", description: \"off, on, ask, full\" }],\n\t\trequiresAuth: true,\n\t},\n\t{\n\t\tkey: \"model\",\n\t\tnativeName: \"model\",\n\t\tdescription: \"Set or show current model\",\n\t\ttextAliases: [\"/model\", \"/m\"],\n\t\tscope: \"both\",\n\t\tcategory: \"options\",\n\t\tacceptsArgs: true,\n\t\targs: [{ name: \"model\", description: \"provider/model or alias\" }],\n\t},\n\t{\n\t\tkey: \"models\",\n\t\tnativeName: \"models\",\n\t\tdescription: \"List available models\",\n\t\ttextAliases: [\"/models\"],\n\t\tscope: \"both\",\n\t\tcategory: \"options\",\n\t\tacceptsArgs: false,\n\t},\n\t{\n\t\tkey: \"usage\",\n\t\tnativeName: \"usage\",\n\t\tdescription: \"Show token usage\",\n\t\ttextAliases: [\"/usage\"],\n\t\tscope: \"both\",\n\t\tcategory: \"options\",\n\t\tacceptsArgs: false,\n\t},\n\t{\n\t\tkey: \"queue\",\n\t\tnativeName: \"queue\",\n\t\tdescription: \"Set queue mode\",\n\t\ttextAliases: [\"/queue\", \"/q\"],\n\t\tscope: \"both\",\n\t\tcategory: \"options\",\n\t\tacceptsArgs: true,\n\t\targs: [\n\t\t\t{\n\t\t\t\tname: \"mode\",\n\t\t\t\tdescription: \"steer, followup, collect, interrupt, or options\",\n\t\t\t},\n\t\t],\n\t},\n\n\t// Management commands\n\t{\n\t\tkey: \"allowlist\",\n\t\tnativeName: \"allowlist\",\n\t\tdescription: \"Manage sender allowlist\",\n\t\ttextAliases: [\"/allowlist\", \"/allow\"],\n\t\tscope: \"both\",\n\t\tcategory: \"management\",\n\t\tacceptsArgs: true,\n\t\targs: [\n\t\t\t{ name: \"action\", description: \"list, add, remove\" },\n\t\t\t{ name: \"value\", description: \"sender to add/remove\" },\n\t\t],\n\t\trequiresAuth: true,\n\t},\n\t{\n\t\tkey: \"approve\",\n\t\tnativeName: \"approve\",\n\t\tdescription: \"Approve or deny a pending action\",\n\t\ttextAliases: [\"/approve\"],\n\t\tscope: \"both\",\n\t\tcategory: \"management\",\n\t\tacceptsArgs: true,\n\t\targs: [\n\t\t\t{ name: \"id\", description: \"Approval ID\", required: true },\n\t\t\t{ name: \"action\", description: \"allow-once, allow-always, deny\" },\n\t\t],\n\t\trequiresAuth: true,\n\t},\n\t{\n\t\tkey: \"subagents\",\n\t\tnativeName: \"subagents\",\n\t\tdescription: \"Manage subagents\",\n\t\ttextAliases: [\"/subagents\", \"/sub\"],\n\t\tscope: \"both\",\n\t\tcategory: \"management\",\n\t\tacceptsArgs: true,\n\t\targs: [{ name: \"action\", description: \"list, stop, log, info, send\" }],\n\t\trequiresAuth: true,\n\t},\n\t{\n\t\tkey: \"config\",\n\t\tnativeName: \"config\",\n\t\tdescription: \"View or set configuration\",\n\t\ttextAliases: [\"/config\", \"/cfg\"],\n\t\tscope: \"both\",\n\t\tcategory: \"management\",\n\t\tacceptsArgs: true,\n\t\targs: [\n\t\t\t{ name: \"key\", description: \"Configuration key\" },\n\t\t\t{ name: \"value\", description: \"Value to set\" },\n\t\t],\n\t\trequiresAuth: true,\n\t\tenabled: false, // Disabled by default\n\t},\n\t{\n\t\tkey: \"debug\",\n\t\tnativeName: \"debug\",\n\t\tdescription: \"Debug information\",\n\t\ttextAliases: [\"/debug\"],\n\t\tscope: \"both\",\n\t\tcategory: \"management\",\n\t\tacceptsArgs: true,\n\t\trequiresAuth: true,\n\t\tenabled: false, // Disabled by default\n\t},\n\n\t// Media commands\n\t{\n\t\tkey: \"tts\",\n\t\tnativeName: \"tts\",\n\t\tdescription: \"Text-to-speech settings\",\n\t\ttextAliases: [\"/tts\", \"/voice\"],\n\t\tscope: \"both\",\n\t\tcategory: \"media\",\n\t\tacceptsArgs: true,\n\t\targs: [\n\t\t\t{\n\t\t\t\tname: \"action\",\n\t\t\t\tdescription: \"on, off, status, provider, limit, audio\",\n\t\t\t},\n\t\t],\n\t},\n\n\t// Tools commands\n\t{\n\t\tkey: \"bash\",\n\t\tnativeName: \"bash\",\n\t\tdescription: \"Execute shell command\",\n\t\ttextAliases: [\"/bash\", \"/sh\", \"/!\"],\n\t\tscope: \"text\",\n\t\tcategory: \"tools\",\n\t\tacceptsArgs: true,\n\t\targs: [\n\t\t\t{\n\t\t\t\tname: \"command\",\n\t\t\t\tdescription: \"Shell command to execute\",\n\t\t\t\tcaptureRemaining: true,\n\t\t\t},\n\t\t],\n\t\trequiresAuth: true,\n\t\trequiresElevated: true,\n\t},\n];\n\n// ── Per-runtime command storage ──────────────────────────────────────────\n// Each agent runtime gets its own isolated command set via `initForRuntime()`.\n// The module-level state is used as a fallback for convenience (tests, etc.).\n//\n// Why a WeakMap? Agent runtimes may be created/destroyed; we don't want to\n// leak memory by holding strong references to disposed runtimes.\n\ninterface CommandStore {\n\tcommands: CommandDefinition[];\n\taliasMap: Map<string, CommandDefinition> | null;\n}\n\n/** Per-runtime stores keyed by agentId */\nconst runtimeStores = new Map<string, CommandStore>();\n/** Fallback store for when no runtime context is set */\nconst fallbackStore: CommandStore = {\n\tcommands: DEFAULT_COMMANDS.map((c) => ({ ...c })),\n\taliasMap: null,\n};\n/** Currently active store (set during init, reset on test teardown) */\nlet activeStore: CommandStore = fallbackStore;\n\n/**\n * Initialize an isolated command store for a specific runtime.\n * Called from plugin init() to prevent cross-agent contamination.\n */\nexport function initForRuntime(agentId: string): void {\n\tconst store: CommandStore = {\n\t\tcommands: DEFAULT_COMMANDS.map((c) => ({ ...c })),\n\t\taliasMap: null,\n\t};\n\truntimeStores.set(agentId, store);\n\tactiveStore = store;\n}\n\n/**\n * Set the active command store for a given runtime.\n * Providers and actions should call this before accessing commands.\n */\nexport function useRuntime(agentId: string): void {\n\tconst store = runtimeStores.get(agentId);\n\tif (store) {\n\t\tactiveStore = store;\n\t}\n}\n\n/**\n * Get all registered commands\n */\nexport function getCommands(): CommandDefinition[] {\n\treturn [...activeStore.commands];\n}\n\n/**\n * Get enabled commands\n */\nexport function getEnabledCommands(): CommandDefinition[] {\n\treturn activeStore.commands.filter((cmd) => cmd.enabled !== false);\n}\n\n/**\n * Get commands by category\n */\nexport function getCommandsByCategory(category: string): CommandDefinition[] {\n\treturn activeStore.commands.filter(\n\t\t(cmd) => cmd.category === category && cmd.enabled !== false,\n\t);\n}\n\n/**\n * Register a custom command\n */\nexport function registerCommand(command: CommandDefinition): void {\n\t// Remove existing command with same key\n\tactiveStore.commands = activeStore.commands.filter(\n\t\t(c) => c.key !== command.key,\n\t);\n\tactiveStore.commands.push(command);\n\tactiveStore.aliasMap = null; // Invalidate cache\n}\n\n/**\n * Register multiple commands\n */\nexport function registerCommands(newCommands: CommandDefinition[]): void {\n\tfor (const command of newCommands) {\n\t\tregisterCommand(command);\n\t}\n}\n\n/**\n * Unregister a command\n */\nexport function unregisterCommand(key: string): void {\n\tactiveStore.commands = activeStore.commands.filter((c) => c.key !== key);\n\tactiveStore.aliasMap = null;\n}\n\n/**\n * Reset to default commands (for the active store)\n */\nexport function resetCommands(): void {\n\tactiveStore.commands = DEFAULT_COMMANDS.map((c) => ({ ...c }));\n\tactiveStore.aliasMap = null;\n}\n\n/**\n * Build and cache alias map for the active store\n */\nfunction getAliasMap(): Map<string, CommandDefinition> {\n\tif (activeStore.aliasMap) return activeStore.aliasMap;\n\n\tactiveStore.aliasMap = new Map();\n\tfor (const command of activeStore.commands) {\n\t\tif (command.enabled === false) continue;\n\n\t\tfor (const alias of command.textAliases) {\n\t\t\tconst normalized = alias.toLowerCase().trim();\n\t\t\tif (!activeStore.aliasMap.has(normalized)) {\n\t\t\t\tactiveStore.aliasMap.set(normalized, command);\n\t\t\t}\n\t\t}\n\t}\n\treturn activeStore.aliasMap;\n}\n\n/**\n * Find command by alias\n */\nexport function findCommandByAlias(\n\talias: string,\n): CommandDefinition | undefined {\n\tconst map = getAliasMap();\n\treturn map.get(alias.toLowerCase().trim());\n}\n\n/**\n * Find command by key\n */\nexport function findCommandByKey(key: string): CommandDefinition | undefined {\n\treturn activeStore.commands.find((c) => c.key === key);\n}\n\n/**\n * Check if text starts with any command alias\n */\nexport function startsWithCommand(text: string): CommandDefinition | undefined {\n\tconst map = getAliasMap();\n\tconst normalized = text.toLowerCase().trim();\n\n\t// Check exact match first\n\tfor (const [alias, command] of map) {\n\t\tif (normalized === alias) {\n\t\t\treturn command;\n\t\t}\n\t\tif (\n\t\t\tnormalized.startsWith(`${alias} `) ||\n\t\t\tnormalized.startsWith(`${alias}:`)\n\t\t) {\n\t\t\treturn command;\n\t\t}\n\t}\n\n\treturn undefined;\n}\n",
7
- "/**\n * Command parser - detects and parses commands from message text\n */\n\nimport { startsWithCommand } from \"./registry\";\nimport type {\n\tCommandDefinition,\n\tCommandDetectionResult,\n\tParsedCommand,\n} from \"./types\";\n\nconst escapeRegExp = (value: string) =>\n\tvalue.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n/**\n * Check if text contains a command\n */\nexport function hasCommand(text: string): boolean {\n\tif (!text) return false;\n\tconst trimmed = text.trim();\n\tif (!trimmed.startsWith(\"/\") && !trimmed.startsWith(\"!\")) return false;\n\treturn Boolean(startsWithCommand(trimmed));\n}\n\n/**\n * Detect command in text\n */\nexport function detectCommand(text: string): CommandDetectionResult {\n\tif (!text) {\n\t\treturn { isCommand: false };\n\t}\n\n\tconst trimmed = text.trim();\n\n\t// Quick check for command prefix\n\tif (!trimmed.startsWith(\"/\") && !trimmed.startsWith(\"!\")) {\n\t\treturn { isCommand: false };\n\t}\n\n\tconst command = startsWithCommand(trimmed);\n\tif (!command) {\n\t\treturn { isCommand: false };\n\t}\n\n\tconst parsed = parseCommand(trimmed, command);\n\tif (!parsed) {\n\t\treturn { isCommand: false };\n\t}\n\n\treturn { isCommand: true, command: parsed };\n}\n\n/**\n * Parse a command from text\n */\nexport function parseCommand(\n\ttext: string,\n\tdefinition: CommandDefinition,\n): ParsedCommand | null {\n\tconst trimmed = text.trim();\n\n\t// Find the matching alias\n\tlet matchedAlias: string | null = null;\n\tfor (const alias of definition.textAliases) {\n\t\tconst normalized = alias.toLowerCase();\n\t\tif (trimmed.toLowerCase() === normalized) {\n\t\t\tmatchedAlias = alias;\n\t\t\tbreak;\n\t\t}\n\t\tif (\n\t\t\ttrimmed.toLowerCase().startsWith(`${normalized} `) ||\n\t\t\ttrimmed.toLowerCase().startsWith(`${normalized}:`)\n\t\t) {\n\t\t\tmatchedAlias = alias;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (!matchedAlias) {\n\t\treturn null;\n\t}\n\n\t// Extract arguments\n\tlet rawArgs = trimmed.slice(matchedAlias.length).trim();\n\n\t// Handle colon separator (e.g., /think:high)\n\tif (rawArgs.startsWith(\":\")) {\n\t\trawArgs = rawArgs.slice(1).trim();\n\t}\n\n\t// Parse arguments\n\tconst args = parseArgs(rawArgs, definition);\n\n\treturn {\n\t\tkey: definition.key,\n\t\tcanonical: definition.textAliases[0] ?? `/${definition.key}`,\n\t\targs,\n\t\trawArgs: rawArgs || undefined,\n\t};\n}\n\n/**\n * Parse arguments based on command definition\n */\nfunction parseArgs(rawArgs: string, definition: CommandDefinition): string[] {\n\tif (!rawArgs || !definition.acceptsArgs) {\n\t\treturn [];\n\t}\n\n\tconst parsing = definition.argsParsing ?? \"positional\";\n\n\tif (parsing === \"none\") {\n\t\t// Return entire string as single argument\n\t\treturn rawArgs ? [rawArgs] : [];\n\t}\n\n\t// Positional parsing\n\tconst args: string[] = [];\n\tconst argDefs = definition.args ?? [];\n\n\t// Split by whitespace, respecting quotes\n\tconst tokens = tokenize(rawArgs);\n\n\tfor (let i = 0; i < tokens.length; i++) {\n\t\tconst argDef = argDefs[i];\n\n\t\t// If this arg captures remaining, join all remaining tokens\n\t\tif (argDef?.captureRemaining) {\n\t\t\targs.push(tokens.slice(i).join(\" \"));\n\t\t\tbreak;\n\t\t}\n\n\t\targs.push(tokens[i]);\n\t}\n\n\treturn args;\n}\n\n/**\n * Tokenize argument string, respecting quotes\n */\nfunction tokenize(input: string): string[] {\n\tconst tokens: string[] = [];\n\tlet current = \"\";\n\tlet inQuote = false;\n\tlet quoteChar = \"\";\n\n\tfor (let i = 0; i < input.length; i++) {\n\t\tconst char = input[i];\n\n\t\tif (inQuote) {\n\t\t\tif (char === quoteChar) {\n\t\t\t\tinQuote = false;\n\t\t\t\tif (current) {\n\t\t\t\t\ttokens.push(current);\n\t\t\t\t\tcurrent = \"\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcurrent += char;\n\t\t\t}\n\t\t} else if (char === '\"' || char === \"'\") {\n\t\t\tinQuote = true;\n\t\t\tquoteChar = char;\n\t\t} else if (/\\s/.test(char)) {\n\t\t\tif (current) {\n\t\t\t\ttokens.push(current);\n\t\t\t\tcurrent = \"\";\n\t\t\t}\n\t\t} else {\n\t\t\tcurrent += char;\n\t\t}\n\t}\n\n\tif (current) {\n\t\ttokens.push(current);\n\t}\n\n\treturn tokens;\n}\n\n/**\n * Normalize command body (handle bot mentions, colon syntax, etc.)\n */\nexport function normalizeCommandBody(\n\ttext: string,\n\tbotMention?: string,\n): string {\n\tlet normalized = text.trim();\n\n\t// Remove bot mention prefix (e.g., \"@bot /status\" -> \"/status\")\n\tif (botMention) {\n\t\tconst mentionPattern = new RegExp(`^@${escapeRegExp(botMention)}\\\\s*`, \"i\");\n\t\tnormalized = normalized.replace(mentionPattern, \"\");\n\t}\n\n\t// Handle colon in command (e.g., \"/command: args\" -> \"/command args\")\n\tnormalized = normalized.replace(/^(\\/\\w+):\\s*/, \"$1 \");\n\n\treturn normalized.trim();\n}\n\n/**\n * Check if text is a command-only message (no other content)\n */\nexport function isCommandOnly(text: string): boolean {\n\tconst detection = detectCommand(text);\n\tif (!detection.isCommand || !detection.command) {\n\t\treturn false;\n\t}\n\n\t// If there's no rawArgs, it's command-only\n\tif (!detection.command.rawArgs) {\n\t\treturn true;\n\t}\n\n\t// Check if rawArgs is just whitespace\n\treturn detection.command.rawArgs.trim().length === 0;\n}\n\n/**\n * Get command and remaining text\n */\nexport function extractCommand(\n\ttext: string,\n): { command: ParsedCommand; remainingText: string } | null {\n\tconst detection = detectCommand(text);\n\tif (!detection.isCommand || !detection.command) {\n\t\treturn null;\n\t}\n\n\tconst { command } = detection;\n\n\t// For commands that don't accept args, remaining text is everything after the command\n\tif (!command.rawArgs) {\n\t\treturn { command, remainingText: \"\" };\n\t}\n\n\treturn { command, remainingText: command.rawArgs };\n}\n",
8
- "/**\n * Commands list action\n */\n\nimport type {\n\tAction,\n\tActionExample,\n\tIAgentRuntime,\n\tMemory,\n} from \"@elizaos/core\";\nimport { detectCommand } from \"../parser\";\nimport { getEnabledCommands } from \"../registry\";\n\nexport const commandsListAction: Action = {\n\tname: \"COMMANDS_LIST\",\n\tdescription:\n\t\t\"List all available commands with their aliases. Only activates for /commands or /cmds slash commands.\",\n\t// Only slash-command similes to avoid matching natural language\n\tsimiles: [\"/commands\", \"/cmds\"],\n\tvalidate: async (\n\t\truntime: IAgentRuntime,\n\t\tmessage: Memory,\n\t): Promise<boolean> => {\n\t\tconst textRaw = message.content?.text ?? \"\";\n\t\tconst text = textRaw.toLowerCase();\n\t\tconst hasKeyword =\n\t\t\ttext.includes(\"/commands\") ||\n\t\t\ttext.includes(\"/cmds\") ||\n\t\t\ttext.includes(\"commands\");\n\t\tconst hasRegex = /^(?:\\/|!)\\s*(?:commands|cmds)\\b/i.test(textRaw);\n\t\tconst hasContext = Boolean(\n\t\t\truntime?.agentId || message?.roomId || message?.content,\n\t\t);\n\t\tconst hasInput = textRaw.trim().length > 0;\n\t\tif (!(hasKeyword && hasRegex && hasContext && hasInput)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst detection = detectCommand(textRaw);\n\t\treturn detection.isCommand && detection.command?.key === \"commands\";\n\t},\n\n\tasync handler(\n\t\t_runtime: IAgentRuntime,\n\t\t_message: Memory,\n\t\t_state,\n\t\t_options,\n\t\tcallback,\n\t) {\n\t\tconst commands = getEnabledCommands();\n\t\tconst lines: string[] = [`**Commands (${commands.length}):**\\n`];\n\n\t\tfor (const cmd of commands) {\n\t\t\tconst aliases = cmd.textAliases.join(\", \");\n\t\t\tconst authNote = cmd.requiresAuth ? \" [auth]\" : \"\";\n\t\t\tconst elevatedNote = cmd.requiresElevated ? \" [elevated]\" : \"\";\n\t\t\tlines.push(`• **${cmd.key}**: ${aliases}${authNote}${elevatedNote}`);\n\t\t}\n\n\t\tconst replyText = lines.join(\"\\n\");\n\t\tawait callback?.({ text: replyText });\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\ttext: replyText,\n\t\t\tdata: { commandCount: commands.length },\n\t\t};\n\t},\n\n\texamples: [\n\t\t[\n\t\t\t{ name: \"user\", content: { text: \"/commands\" } },\n\t\t\t{\n\t\t\t\tname: \"assistant\",\n\t\t\t\tcontent: {\n\t\t\t\t\ttext: \"**Commands (15):**\\n\\n• **help**: /help, /h, /?\\n• **status**: /status, /s...\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t] as ActionExample[][],\n};\n",
9
- "/**\n * Help command action\n */\n\nimport type {\n\tAction,\n\tActionExample,\n\tIAgentRuntime,\n\tMemory,\n} from \"@elizaos/core\";\nimport { detectCommand } from \"../parser\";\nimport { getEnabledCommands } from \"../registry\";\n\n/**\n * Format command list for help display\n */\nfunction formatCommandList(\n\tcommands: ReturnType<typeof getEnabledCommands>,\n): string {\n\tconst lines: string[] = [\"**Available Commands:**\\n\"];\n\n\tconst categories = [\n\t\t{ key: \"status\", name: \"Status\" },\n\t\t{ key: \"session\", name: \"Session\" },\n\t\t{ key: \"options\", name: \"Options\" },\n\t\t{ key: \"management\", name: \"Management\" },\n\t\t{ key: \"media\", name: \"Media\" },\n\t\t{ key: \"tools\", name: \"Tools\" },\n\t];\n\n\tfor (const cat of categories) {\n\t\tconst catCommands = commands.filter((c) => c.category === cat.key);\n\t\tif (catCommands.length === 0) continue;\n\n\t\tlines.push(`\\n**${cat.name}:**`);\n\t\tfor (const cmd of catCommands) {\n\t\t\tconst aliases = cmd.textAliases.slice(0, 2).join(\", \");\n\t\t\tlines.push(`• ${aliases} - ${cmd.description}`);\n\t\t}\n\t}\n\n\t// Add uncategorized commands\n\tconst uncategorized = commands.filter((c) => !c.category);\n\tif (uncategorized.length > 0) {\n\t\tlines.push(\"\\n**Other:**\");\n\t\tfor (const cmd of uncategorized) {\n\t\t\tconst aliases = cmd.textAliases.slice(0, 2).join(\", \");\n\t\t\tlines.push(`• ${aliases} - ${cmd.description}`);\n\t\t}\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nexport const helpAction: Action = {\n\tname: \"HELP_COMMAND\",\n\tdescription:\n\t\t\"Show available commands and their descriptions. Only activates for /help, /h, or /? slash commands.\",\n\t// Only slash-command similes — \"help\" or \"show help\" as natural language\n\t// should be handled by the LLM's normal response, not this action\n\tsimiles: [\"/help\", \"/h\", \"/?\"],\n\tvalidate: async (\n\t\truntime: IAgentRuntime,\n\t\tmessage: Memory,\n\t): Promise<boolean> => {\n\t\tconst textRaw = message.content?.text ?? \"\";\n\t\tconst text = textRaw.toLowerCase();\n\t\tconst hasKeyword =\n\t\t\ttext.includes(\"/help\") || text.includes(\"/h\") || text.includes(\"/?\");\n\t\tconst hasRegex = /^(?:\\/|!)\\s*(?:help|h|\\?)(?:\\s|$|:)/i.test(textRaw);\n\t\tconst hasContext = Boolean(\n\t\t\truntime?.agentId || message?.roomId || message?.content,\n\t\t);\n\t\tconst hasInput = textRaw.trim().length > 0;\n\t\tif (!(hasKeyword && hasRegex && hasContext && hasInput)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst detection = detectCommand(textRaw);\n\t\treturn detection.isCommand && detection.command?.key === \"help\";\n\t},\n\n\tasync handler(\n\t\t_runtime: IAgentRuntime,\n\t\tmessage: Memory,\n\t\t_state,\n\t\t_options,\n\t\tcallback,\n\t) {\n\t\t// Guard: only show help when the user actually asked for it.\n\t\t// The runtime doesn't call validate before handler, so the LLM\n\t\t// can select HELP_COMMAND during action retry loops even when the\n\t\t// user never typed /help.\n\t\tconst detection = detectCommand(message?.content?.text ?? \"\");\n\t\tif (!detection.isCommand || detection.command?.key !== \"help\") {\n\t\t\treturn { success: false, text: \"\" };\n\t\t}\n\n\t\tconst commands = getEnabledCommands();\n\t\tconst helpText = formatCommandList(commands);\n\n\t\tawait callback?.({ text: helpText });\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\ttext: helpText,\n\t\t\tdata: { commandCount: commands.length },\n\t\t};\n\t},\n\n\texamples: [\n\t\t[\n\t\t\t{ name: \"user\", content: { text: \"/help\" } },\n\t\t\t{\n\t\t\t\tname: \"assistant\",\n\t\t\t\tcontent: {\n\t\t\t\t\ttext: \"**Available Commands:**\\n\\n**Status:**\\n• /help - Show available commands...\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\t[\n\t\t\t{ name: \"user\", content: { text: \"/?\" } },\n\t\t\t{\n\t\t\t\tname: \"assistant\",\n\t\t\t\tcontent: {\n\t\t\t\t\ttext: \"**Available Commands:**\\n\\n**Status:**\\n• /help - Show available commands...\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t] as ActionExample[][],\n};\n",
10
- "/**\n * Models command action\n *\n * Queries the runtime for actually registered model handlers instead of\n * using a hardcoded list. Falls back to listing registered model types\n * when detailed model info is not available.\n */\n\nimport type {\n\tAction,\n\tActionExample,\n\tIAgentRuntime,\n\tMemory,\n} from \"@elizaos/core\";\nimport { logger, ModelType } from \"@elizaos/core\";\nimport { detectCommand } from \"../parser\";\n\n/**\n * Describe a ModelType value in a user-friendly way\n */\nfunction describeModelType(modelType: string): string {\n\tconst descriptions: Record<string, string> = {\n\t\t[ModelType.TEXT_SMALL]: \"Text (Small)\",\n\t\t[ModelType.TEXT_LARGE]: \"Text (Large)\",\n\t\t[ModelType.TEXT_REASONING_SMALL]: \"Reasoning (Small)\",\n\t\t[ModelType.TEXT_REASONING_LARGE]: \"Reasoning (Large)\",\n\t\t[ModelType.TEXT_COMPLETION]: \"Text Completion\",\n\t\t[ModelType.TEXT_EMBEDDING]: \"Embedding\",\n\t\t[ModelType.IMAGE]: \"Image Generation\",\n\t\t[ModelType.IMAGE_DESCRIPTION]: \"Image Description\",\n\t\t[ModelType.TRANSCRIPTION]: \"Transcription\",\n\t\t[ModelType.TEXT_TO_SPEECH]: \"Text-to-Speech\",\n\t\t[ModelType.AUDIO]: \"Audio\",\n\t\t[ModelType.VIDEO]: \"Video\",\n\t\t[ModelType.OBJECT_SMALL]: \"Object (Small)\",\n\t\t[ModelType.OBJECT_LARGE]: \"Object (Large)\",\n\t\t[ModelType.RESEARCH]: \"Research\",\n\t};\n\treturn descriptions[modelType] ?? modelType;\n}\n\nexport const modelsAction: Action = {\n\tname: \"MODELS_COMMAND\",\n\tdescription:\n\t\t\"List available AI models and providers. Only activates for /models slash command.\",\n\t// Only slash-command similes to avoid matching natural language\n\tsimiles: [\"/models\"],\n\tvalidate: async (\n\t\truntime: IAgentRuntime,\n\t\tmessage: Memory,\n\t): Promise<boolean> => {\n\t\tconst textRaw = message.content?.text ?? \"\";\n\t\tconst text = textRaw.toLowerCase();\n\t\tconst hasKeyword = text.includes(\"/models\") || text.includes(\"models\");\n\t\tconst hasRegex = /^(?:\\/|!)\\s*models\\b/i.test(textRaw);\n\t\tconst hasContext = Boolean(\n\t\t\truntime?.agentId || message?.roomId || message?.content,\n\t\t);\n\t\tconst hasInput = textRaw.trim().length > 0;\n\t\tif (!(hasKeyword && hasRegex && hasContext && hasInput)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst detection = detectCommand(textRaw);\n\t\treturn detection.isCommand && detection.command?.key === \"models\";\n\t},\n\n\tasync handler(\n\t\truntime: IAgentRuntime,\n\t\t_message: Memory,\n\t\t_state,\n\t\t_options,\n\t\tcallback,\n\t) {\n\t\tconst lines: string[] = [\"**Available Models:**\\n\"];\n\n\t\t// Query runtime for registered model handlers\n\t\ttry {\n\t\t\tconst registeredTypes: string[] = [];\n\t\t\tconst seen = new Set<string>();\n\n\t\t\t// Check each ModelType to see if a handler is registered.\n\t\t\t// Deduplicate since ModelType has legacy aliases (SMALL, MEDIUM, LARGE)\n\t\t\t// that map to the same underlying values.\n\t\t\tfor (const modelType of Object.values(ModelType)) {\n\t\t\t\tif (seen.has(modelType)) continue;\n\t\t\t\tseen.add(modelType);\n\t\t\t\ttry {\n\t\t\t\t\t// runtime.getModel() returns the handler or undefined\n\t\t\t\t\tconst handler = runtime.getModel(modelType);\n\t\t\t\t\tif (handler) {\n\t\t\t\t\t\tregisteredTypes.push(modelType);\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Model type not registered\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (registeredTypes.length > 0) {\n\t\t\t\tlines.push(\"**Registered Model Types:**\");\n\t\t\t\tfor (const modelType of registeredTypes) {\n\t\t\t\t\tlines.push(`• ${describeModelType(modelType)} (\\`${modelType}\\`)`);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlines.push(\"No model handlers are currently registered.\");\n\t\t\t}\n\n\t\t\t// Show current model settings if available\n\t\t\tconst modelProvider = runtime.getSetting(\"MODEL_PROVIDER\");\n\t\t\tconst modelName = runtime.getSetting(\"MODEL_NAME\");\n\t\t\tif (modelProvider || modelName) {\n\t\t\t\tlines.push(\"\\n**Current Configuration:**\");\n\t\t\t\tif (modelProvider) lines.push(`• Provider: ${modelProvider}`);\n\t\t\t\tif (modelName) lines.push(`• Model: ${modelName}`);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tlogger.warn(\n\t\t\t\t{ src: \"plugin-commands\", err },\n\t\t\t\t\"Error querying runtime models\",\n\t\t\t);\n\t\t\tlines.push(\"Unable to query available models.\");\n\t\t}\n\n\t\tlines.push(\"\\n\\n_Use /model <provider/model> to switch models._\");\n\n\t\tconst replyText = lines.join(\"\\n\");\n\t\tawait callback?.({ text: replyText });\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\ttext: replyText,\n\t\t};\n\t},\n\n\texamples: [\n\t\t[\n\t\t\t{ name: \"user\", content: { text: \"/models\" } },\n\t\t\t{\n\t\t\t\tname: \"assistant\",\n\t\t\t\tcontent: {\n\t\t\t\t\ttext: \"**Available Models:**\\n\\n**Registered Model Types:**\\n• Text (Large) (`text_large`)\\n• Text (Small) (`text_small`)...\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t] as ActionExample[][],\n};\n",
11
- "/**\n * Status command action\n *\n * This is the SLASH COMMAND version (/status, /s). It is distinct from the\n * bootstrap STATUS action which handles natural language like \"what's your status?\".\n *\n * Key differences:\n * - This action ONLY activates for /status or /s slash commands (validate checks prefix)\n * - Bootstrap STATUS handles conversational requests about agent state\n * - This action shows directive/session settings; bootstrap STATUS shows tasks/room info\n * - No natural language similes to prevent conflict with bootstrap STATUS\n */\n\nimport type {\n\tAction,\n\tActionExample,\n\tIAgentRuntime,\n\tMemory,\n} from \"@elizaos/core\";\nimport { detectCommand } from \"../parser\";\n\ninterface DirectiveModelState {\n\tprovider?: string;\n\tmodel?: string;\n}\n\ninterface DirectiveSessionState {\n\tthinking: string | boolean;\n\tverbose: boolean | string;\n\treasoning: boolean | string;\n\televated: boolean | string;\n\tmodel?: DirectiveModelState;\n}\n\ninterface DirectiveParserService {\n\tgetSessionState?: (roomId: string) => DirectiveSessionState | undefined;\n}\n\n/**\n * Build status report including directive state\n */\nasync function buildStatusReport(\n\truntime: IAgentRuntime,\n\troomId: string,\n): Promise<string> {\n\tconst lines: string[] = [\"**Session Status:**\\n\"];\n\n\t// Agent info\n\tlines.push(`**Agent:** ${runtime.character.name ?? runtime.agentId}`);\n\tlines.push(`**Room:** ${roomId}`);\n\n\t// Try to get directive state from plugin-directives if available\n\ttry {\n\t\tconst directiveService = runtime.getService(\n\t\t\t\"directive-parser\",\n\t\t) as DirectiveParserService | null;\n\t\tif (directiveService) {\n\t\t\tconst state = directiveService.getSessionState?.(roomId);\n\t\t\tif (state) {\n\t\t\t\tlines.push(`\\n**Directives:**`);\n\t\t\t\tlines.push(`• Thinking: ${state.thinking}`);\n\t\t\t\tlines.push(`• Verbose: ${state.verbose}`);\n\t\t\t\tlines.push(`• Reasoning: ${state.reasoning}`);\n\t\t\t\tlines.push(`• Elevated: ${state.elevated}`);\n\t\t\t\tif (state.model?.provider || state.model?.model) {\n\t\t\t\t\tconst modelStr = state.model.provider\n\t\t\t\t\t\t? `${state.model.provider}/${state.model.model}`\n\t\t\t\t\t\t: state.model.model;\n\t\t\t\t\tlines.push(`• Model: ${modelStr}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Directive plugin not available\n\t}\n\n\t// Get pending tasks count for context\n\ttry {\n\t\tconst tasks = await runtime.getTasks({\n\t\t\troomId,\n\t\t\tagentIds: [runtime.agentId],\n\t\t});\n\t\tif (tasks.length > 0) {\n\t\t\tlines.push(`\\n**Tasks:** ${tasks.length} pending`);\n\t\t}\n\t} catch {\n\t\t// Task retrieval may not be available\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nexport const statusAction: Action = {\n\t// Deliberately distinct from bootstrap's \"STATUS\" action name\n\t// Normalized: \"statuscommand\" vs \"status\" — no exact match collision\n\tname: \"STATUS_COMMAND\",\n\tdescription:\n\t\t\"Show session directive settings via /status slash command. Only activates for /status or /s prefix.\",\n\t// Only slash-command similes — no natural language to avoid stealing\n\t// from bootstrap STATUS which handles \"what's your status?\" etc.\n\tsimiles: [\"/status\", \"/s\"],\n\tvalidate: async (\n\t\truntime: IAgentRuntime,\n\t\tmessage: Memory,\n\t): Promise<boolean> => {\n\t\tconst textRaw = message.content?.text ?? \"\";\n\t\tconst text = textRaw.toLowerCase();\n\t\tconst hasKeyword =\n\t\t\ttext.includes(\"/status\") ||\n\t\t\ttext.includes(\"/s\") ||\n\t\t\ttext.includes(\"status\");\n\t\tconst hasRegex = /^(?:\\/|!)\\s*(?:status|s)\\b/i.test(textRaw);\n\t\tconst hasContext = Boolean(\n\t\t\truntime?.agentId || message?.roomId || message?.content,\n\t\t);\n\t\tconst hasInput = textRaw.trim().length > 0;\n\t\tif (!(hasKeyword && hasRegex && hasContext && hasInput)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst detection = detectCommand(textRaw);\n\t\treturn detection.isCommand && detection.command?.key === \"status\";\n\t},\n\n\tasync handler(\n\t\truntime: IAgentRuntime,\n\t\tmessage: Memory,\n\t\t_state,\n\t\t_options,\n\t\tcallback,\n\t) {\n\t\tconst statusText = await buildStatusReport(runtime, message.roomId);\n\n\t\tawait callback?.({ text: statusText });\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\ttext: statusText,\n\t\t};\n\t},\n\n\texamples: [\n\t\t[\n\t\t\t{ name: \"user\", content: { text: \"/status\" } },\n\t\t\t{\n\t\t\t\tname: \"assistant\",\n\t\t\t\tcontent: {\n\t\t\t\t\ttext: \"**Session Status:**\\n\\n**Agent:** Eliza\\n**Room:** room-456\\n\\n**Directives:**\\n• Thinking: low...\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t] as ActionExample[][],\n};\n",
12
- "/**\n * Stop command action\n *\n * Uses EventType.HOOK_COMMAND_STOP from @elizaos/core for proper integration\n * with the messaging pipeline and hook system.\n */\n\nimport type {\n\tAction,\n\tActionExample,\n\tIAgentRuntime,\n\tMemory,\n} from \"@elizaos/core\";\nimport { EventType, logger } from \"@elizaos/core\";\nimport { detectCommand } from \"../parser\";\n\nexport const stopAction: Action = {\n\tname: \"STOP_COMMAND\",\n\tdescription:\n\t\t\"Stop current operation or abort running tasks. Triggered by /stop, /abort, or /cancel slash commands only.\",\n\t// Only use slash-command similes to avoid matching natural language\n\t// like \"stop talking\" or \"cancel that\" which should go to bootstrap IGNORE\n\tsimiles: [\"/stop\", \"/abort\", \"/cancel\"],\n\tvalidate: async (\n\t\truntime: IAgentRuntime,\n\t\tmessage: Memory,\n\t): Promise<boolean> => {\n\t\tconst textRaw = message.content?.text ?? \"\";\n\t\tconst text = textRaw.toLowerCase();\n\t\tconst hasKeyword =\n\t\t\ttext.includes(\"/stop\") ||\n\t\t\ttext.includes(\"/abort\") ||\n\t\t\ttext.includes(\"/cancel\") ||\n\t\t\ttext.includes(\"stop\");\n\t\tconst hasRegex = /^(?:\\/|!)\\s*(?:stop|abort|cancel)\\b/i.test(textRaw);\n\t\tconst hasContext = Boolean(\n\t\t\truntime?.agentId || message?.roomId || message?.content,\n\t\t);\n\t\tconst hasInput = textRaw.trim().length > 0;\n\t\tif (!(hasKeyword && hasRegex && hasContext && hasInput)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst detection = detectCommand(textRaw);\n\t\treturn (\n\t\t\tdetection.isCommand &&\n\t\t\t[\"stop\", \"abort\", \"cancel\"].includes(detection.command?.key ?? \"\")\n\t\t);\n\t},\n\n\tasync handler(\n\t\truntime: IAgentRuntime,\n\t\tmessage: Memory,\n\t\t_state,\n\t\t_options,\n\t\tcallback,\n\t) {\n\t\t// Emit the proper hook event for the stop command.\n\t\t// HookCommandPayload extends HookEventPayload which requires sessionKey,\n\t\t// messages, timestamp, context. The runtime injects itself automatically.\n\t\ttry {\n\t\t\tawait runtime.emitEvent(EventType.HOOK_COMMAND_STOP, {\n\t\t\t\truntime,\n\t\t\t\tsessionKey: message.roomId,\n\t\t\t\tmessages: [],\n\t\t\t\ttimestamp: new Date(),\n\t\t\t\tcontext: {\n\t\t\t\t\tentityId: message.entityId,\n\t\t\t\t\tsource: message.content?.source,\n\t\t\t\t},\n\t\t\t\tcommand: \"stop\" as const,\n\t\t\t\tsenderId: message.entityId,\n\t\t\t\tcommandSource: message.content?.source,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tlogger.warn(\n\t\t\t\t{ src: \"plugin-commands\", err },\n\t\t\t\t\"Failed to emit HOOK_COMMAND_STOP event\",\n\t\t\t);\n\t\t}\n\n\t\tconst replyText = \"✓ Stop requested. Current operations will be cancelled.\";\n\t\tawait callback?.({ text: replyText });\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\ttext: replyText,\n\t\t};\n\t},\n\n\texamples: [\n\t\t[\n\t\t\t{ name: \"user\", content: { text: \"/stop\" } },\n\t\t\t{\n\t\t\t\tname: \"assistant\",\n\t\t\t\tcontent: {\n\t\t\t\t\ttext: \"✓ Stop requested. Current operations will be cancelled.\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t\t[\n\t\t\t{ name: \"user\", content: { text: \"/abort\" } },\n\t\t\t{\n\t\t\t\tname: \"assistant\",\n\t\t\t\tcontent: {\n\t\t\t\t\ttext: \"✓ Stop requested. Current operations will be cancelled.\",\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t] as ActionExample[][],\n};\n"
13
- ],
14
- "mappings": "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",
15
- "debugId": "29584248BB32069264756E2164756E21",
16
- "names": []
17
- }