import type { BlockReplyChunking } from "../../agents/pi-embedded-block-chunker.js"; import type { SkillCommandSpec } from "../../agents/skills.js"; import type { ChannelId } from "../../channels/plugins/types.public.js"; import type { SessionEntry, SessionScope } from "../../config/sessions.js"; import type { OpenClawConfig } from "../../config/types.openclaw.js"; import type { MsgContext } from "../templating.js"; import type { ElevatedLevel, ReasoningLevel, ThinkLevel, VerboseLevel } from "../thinking.js"; import type { GetReplyOptions, ReplyPayload } from "../types.js"; import type { InlineDirectives } from "./directive-handling.parse.js"; import type { TypingController } from "./typing.js"; export type CommandContext = { surface: string; channel: string; channelId?: ChannelId; ownerList: string[]; senderIsOwner: boolean; isAuthorizedSender: boolean; senderId?: string; abortKey?: string; rawBodyNormalized: string; commandBodyNormalized: string; from?: string; to?: string; /** Internal marker to prevent duplicate reset-hook emission across command pipelines. */ resetHookTriggered?: boolean; /** Internal marker for prompt reload without session rollover. */ softResetTriggered?: boolean; /** Optional tail to append after a soft reset startup prompt. */ softResetTail?: string; }; export type HandleCommandsParams = { ctx: MsgContext; rootCtx?: MsgContext; cfg: OpenClawConfig; command: CommandContext; agentId?: string; agentDir?: string; directives: InlineDirectives; elevated: { enabled: boolean; allowed: boolean; failures: Array<{ gate: string; key: string; }>; }; sessionEntry?: SessionEntry; previousSessionEntry?: SessionEntry; sessionStore?: Record; sessionKey: string; storePath?: string; sessionScope?: SessionScope; workspaceDir: string; opts?: GetReplyOptions; defaultGroupActivation: () => "always" | "mention"; resolvedThinkLevel?: ThinkLevel; resolvedFastMode?: boolean; resolvedVerboseLevel: VerboseLevel; resolvedReasoningLevel: ReasoningLevel; resolvedElevatedLevel?: ElevatedLevel; blockReplyChunking?: BlockReplyChunking; resolvedBlockStreamingBreak?: "text_end" | "message_end"; resolveDefaultThinkingLevel: () => Promise; provider: string; model: string; contextTokens: number; isGroup: boolean; skillCommands?: SkillCommandSpec[]; typing?: TypingController; }; export type CommandHandlerResult = { reply?: ReplyPayload; shouldContinue: boolean; }; export type CommandHandler = (params: HandleCommandsParams, allowTextCommands: boolean) => Promise;