From b0f72842a136c3c8121b22937ce8599d60fb8a36 Mon Sep 17 00:00:00 2001 From: tt-a1i <53142663+tt-a1i@users.noreply.github.com> Date: Sat, 20 Jun 2026 09:56:12 +0800 Subject: [PATCH] fix(agent-core): allow skill questions in auto mode --- .changeset/skill-auto-questions.md | 5 + .../src/agent/injection/permission-mode.ts | 2 +- .../auto-mode-ask-user-question-deny.ts | 23 ++- .../agent-core/test/agent/permission.test.ts | 170 ++++++++++++++++-- packages/agent-core/test/agent/tool.test.ts | 24 +-- 5 files changed, 193 insertions(+), 31 deletions(-) create mode 100644 .changeset/skill-auto-questions.md diff --git a/.changeset/skill-auto-questions.md b/.changeset/skill-auto-questions.md new file mode 100644 index 000000000..4cd1fb10d --- /dev/null +++ b/.changeset/skill-auto-questions.md @@ -0,0 +1,5 @@ +--- +"@moonshot-ai/kimi-code": patch +--- + +Allow loaded skills to ask clarifying questions while auto permission mode is active. diff --git a/packages/agent-core/src/agent/injection/permission-mode.ts b/packages/agent-core/src/agent/injection/permission-mode.ts index 638ed6760..23920e367 100644 --- a/packages/agent-core/src/agent/injection/permission-mode.ts +++ b/packages/agent-core/src/agent/injection/permission-mode.ts @@ -4,7 +4,7 @@ import { DynamicInjector } from './injector'; const AUTO_MODE_ENTER_REMINDER = [ 'Auto permission mode is active. Tool approvals will be handled automatically while this mode remains enabled.', ' - Continue normally without pausing for approval prompts.', - ' - Do NOT call AskUserQuestion while auto mode is active. Make a reasonable decision and continue without asking the user.', + ' - Do NOT call AskUserQuestion while auto mode is active unless the currently loaded skill explicitly asks you to clarify with the user.', ].join('\n'); const AUTO_MODE_EXIT_REMINDER = [ diff --git a/packages/agent-core/src/agent/permission/policies/auto-mode-ask-user-question-deny.ts b/packages/agent-core/src/agent/permission/policies/auto-mode-ask-user-question-deny.ts index f1f31d3c0..4cf05042b 100644 --- a/packages/agent-core/src/agent/permission/policies/auto-mode-ask-user-question-deny.ts +++ b/packages/agent-core/src/agent/permission/policies/auto-mode-ask-user-question-deny.ts @@ -1,4 +1,5 @@ import type { Agent } from '../..'; +import type { ContextMessage, PromptOrigin } from '../../context'; import type { PermissionPolicy, PermissionPolicyContext, PermissionPolicyResult } from '../types'; export class AutoModeAskUserQuestionDenyPermissionPolicy implements PermissionPolicy { @@ -9,10 +10,30 @@ export class AutoModeAskUserQuestionDenyPermissionPolicy implements PermissionPo evaluate(context: PermissionPolicyContext): PermissionPolicyResult | undefined { if (this.agent.permission.mode !== 'auto') return; if (context.toolCall.name !== 'AskUserQuestion') return; + if (currentRequestIsLoadedSkill(this.agent.context?.history ?? [])) return; return { kind: 'deny', message: - 'AskUserQuestion is disabled while auto permission mode is active. Make a reasonable decision and continue without asking the user.', + 'AskUserQuestion is disabled while auto permission mode is active outside a loaded skill. Make a reasonable decision and continue without asking the user.', }; } } + +function currentRequestIsLoadedSkill(history: readonly ContextMessage[]): boolean { + for (let i = history.length - 1; i >= 0; i -= 1) { + const message = history[i]; + if (message?.role !== 'user') continue; + const origin = message.origin; + if (isInternalContinuationOrigin(origin)) continue; + return origin?.kind === 'skill_activation'; + } + return false; +} + +function isInternalContinuationOrigin(origin: PromptOrigin | undefined): boolean { + return ( + origin?.kind === 'injection' || + origin?.kind === 'compaction_summary' || + origin?.kind === 'retry' + ); +} diff --git a/packages/agent-core/test/agent/permission.test.ts b/packages/agent-core/test/agent/permission.test.ts index 8fdd3d2b1..a540e7ca4 100644 --- a/packages/agent-core/test/agent/permission.test.ts +++ b/packages/agent-core/test/agent/permission.test.ts @@ -61,18 +61,18 @@ describe('Agent permission', () => { [emit] tool.progress { "turnId": 0, "toolCallId": "call_bash", "update": { "kind": "stdout", "text": "auto-output" } } [wire] context.append_loop_event { "event": { "type": "tool.result", "parentUuid": "call_bash", "toolCallId": "call_bash", "result": { "output": "auto-output" } }, "time": "