Skip to content

Commit 12ddc02

Browse files
committed
claw: fix skill dispatch to only execute registered skills
Previously, dispatch_command tried ai_skill_try_command for any unrecognized /command. When the skill didn't exist, it returned CLAW_ERROR and fell through to "Unknown command", but ai_skill_try_command internally called ai_skill_execute which could produce confusing output before failing. Now dispatch_command explicitly checks ai_skill_find() first. If the skill exists, it executes and returns (even on failure). If the skill does not exist, it falls through to "Unknown command" without attempting execution. This ensures only NVS-persisted or built-in skills are treated as commands. Signed-off-by: Chao Liu <chao.liu.zevorn@gmail.com>
1 parent 9683f2d commit 12ddc02

3 files changed

Lines changed: 48 additions & 28 deletions

File tree

platform/common/espressif/esp_shell.c

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -444,17 +444,24 @@ static void dispatch_command(char *line)
444444
#ifdef CONFIG_RTCLAW_SKILL_ENABLE
445445
/* Try dynamic skill as last resort */
446446
{
447-
char *skill_reply = claw_malloc(SKILL_REPLY_SIZE);
448-
if (skill_reply && ai_skill_try_command(argv[0], argc, argv,
449-
skill_reply,
450-
SKILL_REPLY_SIZE)
451-
== CLAW_OK) {
452-
printf("\n" CLR_GREEN "rt-claw> " CLR_RESET "%s\n",
453-
skill_reply);
454-
claw_free(skill_reply);
447+
const char *sname = argv[0];
448+
if (sname[0] == '/') {
449+
sname++;
450+
}
451+
if (ai_skill_find(sname)) {
452+
char *skill_reply = claw_malloc(SKILL_REPLY_SIZE);
453+
if (skill_reply) {
454+
if (ai_skill_try_command(argv[0], argc, argv,
455+
skill_reply,
456+
SKILL_REPLY_SIZE)
457+
== CLAW_OK) {
458+
printf("\n" CLR_GREEN "rt-claw> " CLR_RESET
459+
"%s\n", skill_reply);
460+
}
461+
claw_free(skill_reply);
462+
}
455463
return;
456464
}
457-
claw_free(skill_reply);
458465
}
459466
#endif
460467

platform/linux/shell.c

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -302,17 +302,24 @@ static void dispatch_command(char *line)
302302

303303
#ifdef CONFIG_RTCLAW_SKILL_ENABLE
304304
{
305-
char *skill_reply = claw_malloc(SKILL_REPLY_SIZE);
306-
if (skill_reply &&
307-
ai_skill_try_command(argv[0], argc, argv,
308-
skill_reply,
309-
SKILL_REPLY_SIZE) == CLAW_OK) {
310-
printf("\n" CLR_GREEN "rt-claw> " CLR_RESET
311-
"%s\n", skill_reply);
312-
claw_free(skill_reply);
305+
const char *sname = argv[0];
306+
if (sname[0] == '/') {
307+
sname++;
308+
}
309+
if (ai_skill_find(sname)) {
310+
char *skill_reply = claw_malloc(SKILL_REPLY_SIZE);
311+
if (skill_reply) {
312+
if (ai_skill_try_command(argv[0], argc, argv,
313+
skill_reply,
314+
SKILL_REPLY_SIZE)
315+
== CLAW_OK) {
316+
printf("\n" CLR_GREEN "rt-claw> " CLR_RESET
317+
"%s\n", skill_reply);
318+
}
319+
claw_free(skill_reply);
320+
}
313321
return;
314322
}
315-
claw_free(skill_reply);
316323
}
317324
#endif
318325

platform/zynq-a9/shell.c

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -425,19 +425,25 @@ static void dispatch_command(char *line)
425425
}
426426

427427
#ifdef CONFIG_RTCLAW_SKILL_ENABLE
428-
/* Try dynamic skill as last resort */
429428
{
430-
char *skill_reply = claw_malloc(SKILL_REPLY_SIZE);
431-
if (skill_reply && ai_skill_try_command(argv[0], argc, argv,
432-
skill_reply,
433-
SKILL_REPLY_SIZE)
434-
== CLAW_OK) {
435-
printf("\n" CLR_GREEN "rt-claw> " CLR_RESET "%s\n",
436-
skill_reply);
437-
claw_free(skill_reply);
429+
const char *sname = argv[0];
430+
if (sname[0] == '/') {
431+
sname++;
432+
}
433+
if (ai_skill_find(sname)) {
434+
char *skill_reply = claw_malloc(SKILL_REPLY_SIZE);
435+
if (skill_reply) {
436+
if (ai_skill_try_command(argv[0], argc, argv,
437+
skill_reply,
438+
SKILL_REPLY_SIZE)
439+
== CLAW_OK) {
440+
printf("\n" CLR_GREEN "rt-claw> " CLR_RESET
441+
"%s\n", skill_reply);
442+
}
443+
claw_free(skill_reply);
444+
}
438445
return;
439446
}
440-
claw_free(skill_reply);
441447
}
442448
#endif
443449

0 commit comments

Comments
 (0)