* fix(hooks): deduplicate after_tool_call hook in embedded runs (cherry picked from commit c129a1a74ba247460c6c061776ceeb995c757ecf) * fix(hooks): propagate sessionKey in after_tool_call context The after_tool_call hook in handleToolExecutionEnd was passing `sessionKey: undefined` in the ToolContext, even though the value is available on ctx.params. This broke plugins that need session context in after_tool_call handlers (e.g., for per-session audit trails or security logging). - Add `sessionKey` to the `ToolHandlerParams` Pick type - Pass `ctx.params.sessionKey` through to the hook context - Add test assertion to prevent regression Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit b7117384fc1a09d60b25db0f80847a3519ddb3c3) * fix(hooks): thread agentId through to after_tool_call hook context Follow-up to #30511 — the after_tool_call hook context was passing `agentId: undefined` because SubscribeEmbeddedPiSessionParams did not carry the agent identity. This threads sessionAgentId (resolved in attempt.ts) through the session params into the tool handler context, giving plugins accurate agent-scoped context for both before_tool_call and after_tool_call hooks. Changes: - Add `agentId?: string` to SubscribeEmbeddedPiSessionParams - Add "agentId" to ToolHandlerParams Pick type - Pass `agentId: sessionAgentId` at the subscribeEmbeddedPiSession() call site in attempt.ts - Wire ctx.params.agentId into the after_tool_call hook context - Update tests to assert agentId propagation Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> (cherry picked from commit aad01edd3e0d367ad0defeb691d5689ddf2ee617) * changelog: credit after_tool_call hook contributors * Update CHANGELOG.md * agents: preserve adjusted params until tool end * agents: emit after_tool_call with adjusted args * tests: cover adjusted after_tool_call params * tests: align adapter after_tool_call expectation --------- Co-authored-by: jbeno <jim@jimbeno.net> Co-authored-by: scoootscooob <zhentongfan@gmail.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
39 lines
1.9 KiB
TypeScript
39 lines
1.9 KiB
TypeScript
import type { AgentSession } from "@mariozechner/pi-coding-agent";
|
|
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";
|
|
|
|
export type SubscribeEmbeddedPiSessionParams = {
|
|
session: AgentSession;
|
|
runId: string;
|
|
hookRunner?: HookRunner;
|
|
verboseLevel?: VerboseLevel;
|
|
reasoningMode?: ReasoningLevel;
|
|
toolResultFormat?: ToolResultFormat;
|
|
shouldEmitToolResult?: () => boolean;
|
|
shouldEmitToolOutput?: () => boolean;
|
|
onToolResult?: (payload: { text?: string; mediaUrls?: string[] }) => void | Promise<void>;
|
|
onReasoningStream?: (payload: { text?: string; mediaUrls?: string[] }) => void | Promise<void>;
|
|
/** Called when a thinking/reasoning block ends (</think> tag processed). */
|
|
onReasoningEnd?: () => void | Promise<void>;
|
|
onBlockReply?: (payload: BlockReplyPayload) => void | Promise<void>;
|
|
/** Flush pending block replies (e.g., before tool execution to preserve message boundaries). */
|
|
onBlockReplyFlush?: () => void | Promise<void>;
|
|
blockReplyBreak?: "text_end" | "message_end";
|
|
blockReplyChunking?: BlockReplyChunking;
|
|
onPartialReply?: (payload: { text?: string; mediaUrls?: string[] }) => void | Promise<void>;
|
|
onAssistantMessageStart?: () => void | Promise<void>;
|
|
onAgentEvent?: (evt: { stream: string; data: Record<string, unknown> }) => void | Promise<void>;
|
|
enforceFinalTag?: boolean;
|
|
config?: OpenClawConfig;
|
|
sessionKey?: string;
|
|
/** Agent identity for hook context — resolved from session config in attempt.ts. */
|
|
agentId?: string;
|
|
};
|
|
|
|
export type { BlockReplyChunking } from "./pi-embedded-block-chunker.js";
|