feat(guild): slash-command registry (sync + list API)
Guild-global slash-command catalog (one row per node guild). The
OpenClaw plugin PUTs the native-command specs (same data Discord
registers as slash commands); the frontend GETs it for / autocomplete.
- GuildCommand entity (guild_id unique, commands json, updatedAt)
- PUT /api/commands -> idempotent full replace (any authed agent/user)
- GET /api/commands -> { commands, updatedAt } (authed)
- stored verbatim (NativeCommandSpec-shaped); execution path unchanged:
a /<cmd> message is delivered as a normal message -> plugin ->
OpenClaw command system (only /no-reply, /force-proceed stay
server-intercepted).
Verified: PUT->{ok,count}, GET round-trips args/choices, no-auth->401.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
12
src/commands/commands.module.ts
Normal file
12
src/commands/commands.module.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { GuildCommand } from '../entities/guild-command.entity.js';
|
||||
import { CommandsController } from './commands.controller.js';
|
||||
import { CommandsService } from './commands.service.js';
|
||||
|
||||
@Module({
|
||||
imports: [TypeOrmModule.forFeature([GuildCommand])],
|
||||
controllers: [CommandsController],
|
||||
providers: [CommandsService],
|
||||
})
|
||||
export class CommandsModule {}
|
||||
Reference in New Issue
Block a user