From 8b17a369e97ede9c4564f86781af349f0569702a Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Thu, 19 Feb 2026 00:06:19 +0000 Subject: [PATCH] refactor(agents): share agent entry and block reply payload types --- src/agents/agent-scope.ts | 8 ++++---- src/agents/pi-embedded-payloads.ts | 8 ++++++++ src/agents/pi-embedded-runner/run/params.ts | 10 ++-------- src/agents/pi-embedded-subscribe.types.ts | 10 ++-------- src/commands/agents.config.ts | 10 ++-------- 5 files changed, 18 insertions(+), 28 deletions(-) create mode 100644 src/agents/pi-embedded-payloads.ts diff --git a/src/agents/agent-scope.ts b/src/agents/agent-scope.ts index 178bd1ec7e4..fee56f9b7f7 100644 --- a/src/agents/agent-scope.ts +++ b/src/agents/agent-scope.ts @@ -32,7 +32,7 @@ type ResolvedAgentConfig = { let defaultAgentWarned = false; -function listAgents(cfg: OpenClawConfig): AgentEntry[] { +export function listAgentEntries(cfg: OpenClawConfig): AgentEntry[] { const list = cfg.agents?.list; if (!Array.isArray(list)) { return []; @@ -41,7 +41,7 @@ function listAgents(cfg: OpenClawConfig): AgentEntry[] { } export function listAgentIds(cfg: OpenClawConfig): string[] { - const agents = listAgents(cfg); + const agents = listAgentEntries(cfg); if (agents.length === 0) { return [DEFAULT_AGENT_ID]; } @@ -59,7 +59,7 @@ export function listAgentIds(cfg: OpenClawConfig): string[] { } export function resolveDefaultAgentId(cfg: OpenClawConfig): string { - const agents = listAgents(cfg); + const agents = listAgentEntries(cfg); if (agents.length === 0) { return DEFAULT_AGENT_ID; } @@ -93,7 +93,7 @@ export function resolveSessionAgentId(params: { function resolveAgentEntry(cfg: OpenClawConfig, agentId: string): AgentEntry | undefined { const id = normalizeAgentId(agentId); - return listAgents(cfg).find((entry) => normalizeAgentId(entry.id) === id); + return listAgentEntries(cfg).find((entry) => normalizeAgentId(entry.id) === id); } export function resolveAgentConfig( diff --git a/src/agents/pi-embedded-payloads.ts b/src/agents/pi-embedded-payloads.ts new file mode 100644 index 00000000000..1be29b5a3af --- /dev/null +++ b/src/agents/pi-embedded-payloads.ts @@ -0,0 +1,8 @@ +export type BlockReplyPayload = { + text?: string; + mediaUrls?: string[]; + audioAsVoice?: boolean; + replyToId?: string; + replyToTag?: boolean; + replyToCurrent?: boolean; +}; diff --git a/src/agents/pi-embedded-runner/run/params.ts b/src/agents/pi-embedded-runner/run/params.ts index cdb8ff6a26d..b5edec514a4 100644 --- a/src/agents/pi-embedded-runner/run/params.ts +++ b/src/agents/pi-embedded-runner/run/params.ts @@ -5,6 +5,7 @@ import type { OpenClawConfig } from "../../../config/config.js"; import type { enqueueCommand } from "../../../process/command-queue.js"; import type { InputProvenance } from "../../../sessions/input-provenance.js"; import type { ExecElevatedDefaults, ExecToolDefaults } from "../../bash-tools.js"; +import type { BlockReplyPayload } from "../../pi-embedded-payloads.js"; import type { BlockReplyChunking, ToolResultFormat } from "../../pi-embedded-subscribe.js"; import type { SkillSnapshot } from "../../skills.js"; @@ -85,14 +86,7 @@ export type RunEmbeddedPiAgentParams = { shouldEmitToolOutput?: () => boolean; onPartialReply?: (payload: { text?: string; mediaUrls?: string[] }) => void | Promise; onAssistantMessageStart?: () => void | Promise; - onBlockReply?: (payload: { - text?: string; - mediaUrls?: string[]; - audioAsVoice?: boolean; - replyToId?: string; - replyToTag?: boolean; - replyToCurrent?: boolean; - }) => void | Promise; + onBlockReply?: (payload: BlockReplyPayload) => void | Promise; onBlockReplyFlush?: () => void | Promise; blockReplyBreak?: "text_end" | "message_end"; blockReplyChunking?: BlockReplyChunking; diff --git a/src/agents/pi-embedded-subscribe.types.ts b/src/agents/pi-embedded-subscribe.types.ts index 135be2627f0..afa635d7307 100644 --- a/src/agents/pi-embedded-subscribe.types.ts +++ b/src/agents/pi-embedded-subscribe.types.ts @@ -3,6 +3,7 @@ import type { ReasoningLevel, VerboseLevel } from "../auto-reply/thinking.js"; import type { OpenClawConfig } from "../config/types.openclaw.js"; import type { HookRunner } from "../plugins/hooks.js"; import type { BlockReplyChunking } from "./pi-embedded-block-chunker.js"; +import type { BlockReplyPayload } from "./pi-embedded-payloads.js"; export type ToolResultFormat = "markdown" | "plain"; @@ -19,14 +20,7 @@ export type SubscribeEmbeddedPiSessionParams = { onReasoningStream?: (payload: { text?: string; mediaUrls?: string[] }) => void | Promise; /** Called when a thinking/reasoning block ends ( tag processed). */ onReasoningEnd?: () => void | Promise; - onBlockReply?: (payload: { - text?: string; - mediaUrls?: string[]; - audioAsVoice?: boolean; - replyToId?: string; - replyToTag?: boolean; - replyToCurrent?: boolean; - }) => void | Promise; + onBlockReply?: (payload: BlockReplyPayload) => void | Promise; /** Flush pending block replies (e.g., before tool execution to preserve message boundaries). */ onBlockReplyFlush?: () => void | Promise; blockReplyBreak?: "text_end" | "message_end"; diff --git a/src/commands/agents.config.ts b/src/commands/agents.config.ts index 5647ea990fa..1a8c39237c8 100644 --- a/src/commands/agents.config.ts +++ b/src/commands/agents.config.ts @@ -1,4 +1,5 @@ import { + listAgentEntries, resolveAgentDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, @@ -31,14 +32,7 @@ export type AgentSummary = { type AgentEntry = NonNullable["list"]>[number]; export type AgentIdentity = AgentIdentityFile; - -export function listAgentEntries(cfg: OpenClawConfig): AgentEntry[] { - const list = cfg.agents?.list; - if (!Array.isArray(list)) { - return []; - } - return list.filter((entry): entry is AgentEntry => Boolean(entry && typeof entry === "object")); -} +export { listAgentEntries }; export function findAgentEntryIndex(list: AgentEntry[], agentId: string): number { const id = normalizeAgentId(agentId);