Building plugins
Plugin рд╣реБрдХреНрд╕
Plugin рд╣реБрдХ OpenClaw Plugin рдХреЗ рд▓рд┐рдП рдЗрди-рдкреНрд░реЛрд╕реЗрд╕ рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБ рд╣реИрдВред рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд░реЗрдВ рдЬрдм рдХрд┐рд╕реА Plugin рдХреЛ рдПрдЬреЗрдВрдЯ рд░рди, рдЯреВрд▓ рдХреЙрд▓, рд╕рдВрджреЗрд╢ рдкреНрд░рд╡рд╛рд╣, рд╕реЗрд╢рди рд▓рд╛рдЗрдлрд╕рд╛рдЗрдХрд▓, рд╕рдмрдПрдЬреЗрдВрдЯ рд░реВрдЯрд┐рдВрдЧ, рдЗрдВрд╕реНрдЯреЙрд▓, рдпрд╛ Gateway рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдмрджрд▓рдирд╛ рд╣реЛред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдВрддрд░рд┐рдХ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрдм рдЖрдкрдХреЛ рдХрдорд╛рдВрдб рдФрд░ Gateway рдЗрд╡реЗрдВрдЯреНрд╕ рдЬреИрд╕реЗ
/new, /reset, /stop, agent:bootstrap, рдпрд╛ gateway:startup рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛
рдСрдкрд░реЗрдЯрд░-рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ HOOK.md рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд╛рд╣рд┐рдПред
рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд
рдЕрдкрдиреЗ Plugin рдПрдВрдЯреНрд░реА рд╕реЗ api.on(...) рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП Plugin рд╣реБрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ:
export default definePluginEntry({ id: "tool-preflight", name: "Tool Preflight", register(api) { api.on( "before_tool_call", async (event) => { if (event.toolName !== "web_search") { return; } return { requireApproval: { title: "Run web search", description: `Allow search query: ${String(event.params.query ?? "")}`, severity: "info", timeoutMs: 60_000, timeoutBehavior: "deny", }, }; }, { priority: 50 }, ); },});рд╣реБрдХ рд╣реИрдВрдбрд▓рд░ рдШрдЯрддреЗ рд╣реБрдП priority рдХреНрд░рдо рдореЗрдВ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВред рд╕рдорд╛рди-рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реЗ рд╣реБрдХ
рд░рдЬрд┐рд╕реНрдЯреНрд░реЗрд╢рди рдХреНрд░рдо рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реИрдВред
api.on(name, handler, opts?) рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ:
priority- рд╣реИрдВрдбрд▓рд░ рдХреНрд░рдо (рдмрдбрд╝рд╛ рдорд╛рди рдкрд╣рд▓реЗ рдЪрд▓рддрд╛ рд╣реИ)редtimeoutMs- рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рддрд┐-рд╣реБрдХ рдмрдЬрдЯред рд╕реЗрдЯ рд╣реЛрдиреЗ рдкрд░, рд╣реБрдХ рд░рдирд░ рдмрдЬрдЯ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЙрд╕ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд░реЛрдХ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЕрдЧрд▓реЗ рдкрд░ рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдзреАрдорд╛ рд╕реЗрдЯрдЕрдк рдпрд╛ рд░рд┐рдХреЙрд▓ рдХрд╛рд░реНрдп рдХреЙрд▓рд░ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рдореЙрдбрд▓ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЛ рдЦрд╛ рдЬрд╛рдПред рдЙрд╕реЗ рдЫреЛрдбрд╝ рджреЗрдВ рддрд╛рдХрд┐ рд╣реБрдХ рд░рдирд░ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрд╡рд▓реЛрдХрди/рдирд┐рд░реНрдгрдп рдЯрд╛рдЗрдордЖрдЙрдЯ рдЙрдкрдпреЛрдЧ рд╣реЛред
рдСрдкрд░реЗрдЯрд░ Plugin рдХреЛрдб рдкреИрдЪ рдХрд┐рдП рдмрд┐рдирд╛ рднреА рд╣реБрдХ рдмрдЬрдЯ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{ "plugins": { "entries": { "my-plugin": { "hooks": { "timeoutMs": 30000, "timeouts": { "before_prompt_build": 90000, "agent_end": 60000 } } } } }}hooks.timeouts.<hookName> hooks.timeoutMs рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИ, рдЬреЛ
Plugin-рд▓рд┐рдЦрд┐рдд api.on(..., { timeoutMs }) рдорд╛рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди
600000 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рди рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдзрдирд╛рддреНрдордХ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬреНрдЮрд╛рдд рдзреАрдореЗ рд╣реБрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐-рд╣реБрдХ
рдУрд╡рд░рд░рд╛рдЗрдб рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ, рддрд╛рдХрд┐ рдХрд┐рд╕реА рдПрдХ Plugin рдХреЛ рд╣рд░ рдЬрдЧрд╣ рд▓рдВрдмрд╛ рдмрдЬрдЯ рди рдорд┐рд▓реЗред
рдкреНрд░рддреНрдпреЗрдХ рд╣реБрдХ рдХреЛ event.context.pluginConfig рдорд┐рд▓рддрд╛ рд╣реИ, рдпрд╛рдиреА рдЙрд╕ Plugin рдХреЗ рд▓рд┐рдП рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧ
рдЬрд┐рд╕рдиреЗ рд╡рд╣ рд╣реИрдВрдбрд▓рд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд┐рдпрд╛ рдерд╛ред рд╡рд░реНрддрдорд╛рди Plugin рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд▓реЗ рд╣реБрдХ рдирд┐рд░реНрдгрдпреЛрдВ рдХреЗ рд▓рд┐рдП
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ; OpenClaw рдЗрд╕реЗ рдкреНрд░рддрд┐ рд╣реИрдВрдбрд▓рд░ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ, рдмрд┐рдирд╛ рдЙрд╕ рд╕рд╛рдЭрд╛ рдЗрд╡реЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрджрд▓реЗ
рдЬрд┐рд╕реЗ рдЕрдиреНрдп Plugin рджреЗрдЦрддреЗ рд╣реИрдВред
рд╣реБрдХ рдХреИрдЯрд▓реЙрдЧ
рд╣реБрдХ рдЙрд╕ рд╕рддрд╣ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдореВрд╣рд┐рдд рд╣реИрдВ рдЬрд┐рд╕реЗ рд╡реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдмреЛрд▓реНрдб рдирд╛рдо рдирд┐рд░реНрдгрдп рдкрд░рд┐рдгрд╛рдо (рдмреНрд▓реЙрдХ, рд░рджреНрдж, рдУрд╡рд░рд░рд╛рдЗрдб, рдпрд╛ рд╕реНрд╡реАрдХреГрддрд┐ рдЖрд╡рд╢реНрдпрдХ) рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ; рдмрд╛рдХреА рд╕рднреА рдХреЗрд╡рд▓-рдЕрд╡рд▓реЛрдХрди рд╣реИрдВред
рдПрдЬреЗрдВрдЯ рдЯрд░реНрди
before_model_resolve- рд╕реЗрд╢рди рд╕рдВрджреЗрд╢ рд▓реЛрдб рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рджрд╛рддрд╛ рдпрд╛ рдореЙрдбрд▓ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВagent_turn_prepare- рдХрддрд╛рд░рдмрджреНрдз Plugin рдЯрд░реНрди рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдкреНрд░реЙрдореНрдкреНрдЯ рд╣реБрдХ рд╕реЗ рдкрд╣рд▓реЗ рдЙрд╕реА рдЯрд░реНрди рдХрд╛ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝реЗрдВbefore_prompt_build- рдореЙрдбрд▓ рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ рдбрд╛рдпрдиреЗрдорд┐рдХ рд╕рдВрджрд░реНрдн рдпрд╛ рд╕рд┐рд╕реНрдЯрдо-рдкреНрд░реЙрдореНрдкреНрдЯ рдЯреЗрдХреНрд╕реНрдЯ рдЬреЛрдбрд╝реЗрдВbefore_agent_start- рдХреЗрд╡рд▓-рд╕рдВрдЧрддрддрд╛ рд╕рдВрдпреБрдХреНрдд рдЪрд░рдг; рдКрдкрд░ рдХреЗ рджреЛ рд╣реБрдХ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВbefore_agent_run- рдореЙрдбрд▓ рд╕рдмрдорд┐рд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдЕрдВрддрд┐рдо рдкреНрд░реЙрдореНрдкреНрдЯ рдФрд░ рд╕реЗрд╢рди рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рд░рди рдмреНрд▓реЙрдХ рдХрд░реЗрдВbefore_agent_reply- рдореЙрдбрд▓ рдЯрд░реНрди рдХреЛ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдЬрд╡рд╛рдм рдпрд╛ рдореМрди рдХреЗ рд╕рд╛рде рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯ рдХрд░реЗрдВbefore_agent_finalize- рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдЕрдВрддрд┐рдо рдЙрддреНрддрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдФрд░ рдореЙрдбрд▓ рдкрд╛рд╕ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВagent_end- рдЕрдВрддрд┐рдо рд╕рдВрджреЗрд╢реЛрдВ, рд╕рдлрд▓рддрд╛ рд╕реНрдерд┐рддрд┐, рдФрд░ рд░рди рдЕрд╡рдзрд┐ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░реЗрдВheartbeat_prompt_contribution- рдкреГрд╖реНрдарднреВрдорд┐ рдореЙрдирд┐рдЯрд░ рдФрд░ рд▓рд╛рдЗрдлрд╕рд╛рдЗрдХрд▓ Plugin рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓-Heartbeat рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝реЗрдВ
рдмрд╛рддрдЪреАрдд рдЕрд╡рд▓реЛрдХрди
model_call_started/model_call_ended- рдкреНрд░реЙрдореНрдкреНрдЯ рдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрд┐рдирд╛ рд╕реНрд╡рдЪреНрдЫ рдХрд┐рдП рдЧрдП рдкреНрд░рджрд╛рддрд╛/рдореЙрдбрд▓ рдХреЙрд▓ рдореЗрдЯрд╛рдбреЗрдЯрд╛, рдЯрд╛рдЗрдорд┐рдВрдЧ, рдкрд░рд┐рдгрд╛рдо, рдФрд░ рд╕реАрдорд┐рдд рдЕрдиреБрд░реЛрдз-id рд╣реИрд╢ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░реЗрдВllm_input- рдкреНрд░рджрд╛рддрд╛ рдЗрдирдкреБрдЯ (рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЙрдореНрдкреНрдЯ, рдкреНрд░реЙрдореНрдкреНрдЯ, рдЗрддрд┐рд╣рд╛рд╕) рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░реЗрдВllm_output- рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рджрд╛рддрд╛ рдЖрдЙрдЯрдкреБрдЯ, рдЙрдкрдпреЛрдЧ, рдФрд░ рд╣рд▓ рдХрд┐рдП рдЧрдПcontextTokenBudgetрдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░реЗрдВ
рдЯреВрд▓
before_tool_call- рдЯреВрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ, рдирд┐рд╖реНрдкрд╛рджрди рдмреНрд▓реЙрдХ рдХрд░реЗрдВ, рдпрд╛ рд╕реНрд╡реАрдХреГрддрд┐ рдЖрд╡рд╢реНрдпрдХ рдХрд░реЗрдВafter_tool_call- рдЯреВрд▓ рдкрд░рд┐рдгрд╛рдореЛрдВ, рддреНрд░реБрдЯрд┐рдпреЛрдВ, рдФрд░ рдЕрд╡рдзрд┐ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░реЗрдВresolve_exec_env-execрдореЗрдВ Plugin-рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реЗрд░рд┐рдПрдмрд▓ рдпреЛрдЧрджрд╛рди рдХрд░реЗрдВtool_result_persist- рдЯреВрд▓ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдмрдиреЗ рд╕рд╣рд╛рдпрдХ рд╕рдВрджреЗрд╢ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВbefore_message_write- рдЬрд╛рд░реА рд╕рдВрджреЗрд╢ рд▓реЗрдЦрди рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдпрд╛ рдЙрд╕реЗ рдмреНрд▓реЙрдХ рдХрд░реЗрдВ (рджреБрд░реНрд▓рдн)
рд╕рдВрджреЗрд╢ рдФрд░ рдбрд┐рд▓реАрд╡рд░реА
inbound_claim- рдПрдЬреЗрдВрдЯ рд░реВрдЯрд┐рдВрдЧ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рдЗрдирдмрд╛рдЙрдВрдб рд╕рдВрджреЗрд╢ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░реЗрдВ (рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдЬрд╡рд╛рдм)message_receivedтАФ рдЗрдирдмрд╛рдЙрдВрдб рд╕рд╛рдордЧреНрд░реА, рдкреНрд░реЗрд╖рдХ, рдереНрд░реЗрдб, рдФрд░ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░реЗрдВmessage_sendingтАФ рдЖрдЙрдЯрдмрд╛рдЙрдВрдб рд╕рд╛рдордЧреНрд░реА рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ рдпрд╛ рдбрд┐рд▓реАрд╡рд░реА рд░рджреНрдж рдХрд░реЗрдВreply_payload_sendingтАФ рдбрд┐рд▓реАрд╡рд░реА рд╕реЗ рдкрд╣рд▓реЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЬрд╡рд╛рдм рдкреЗрд▓реЛрдб рдмрджрд▓реЗрдВ рдпрд╛ рд░рджреНрдж рдХрд░реЗрдВmessage_sentтАФ рдЖрдЙрдЯрдмрд╛рдЙрдВрдб рдбрд┐рд▓реАрд╡рд░реА рдХреА рд╕рдлрд▓рддрд╛ рдпрд╛ рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░реЗрдВbefore_dispatch- рдЪреИрдирд▓ рд╣реИрдВрдбрдСрдлрд╝ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдЙрдЯрдмрд╛рдЙрдВрдб рдбрд┐рд╕реНрдкреИрдЪ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдпрд╛ рдЙрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВreply_dispatch- рдЕрдВрддрд┐рдо рдЬрд╡рд╛рдм-рдбрд┐рд╕реНрдкреИрдЪ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рднрд╛рдЧ рд▓реЗрдВ
рд╕реЗрд╢рди рдФрд░ Compaction
session_start/session_end- рд╕реЗрд╢рди рд▓рд╛рдЗрдлрд╕рд╛рдЗрдХрд▓ рд╕реАрдорд╛рдУрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░реЗрдВред рдЗрд╡реЗрдВрдЯ рдХрд╛reasonnew,reset,idle,daily,compaction,deleted,shutdown,restart, рдпрд╛unknownрдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЬрдм рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд░реБрдХрддреА рдпрд╛ рдкреБрдирд░рд╛рд░рдВрдн рд╣реЛрддреА рд╣реИ рдФрд░ рд╕реЗрд╢рди рдЕрдм рднреА рд╕рдХреНрд░рд┐рдп рд╣реЛрддреЗ рд╣реИрдВ, рддреЛshutdownрдФрд░restartрдорд╛рди Gateway рд╢рдЯрдбрд╛рдЙрди рдлрд╛рдЗрдирд▓рд╛рдЗрдЬрд╝рд░ рд╕реЗ рдлрд╛рдпрд░ рд╣реЛрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо Plugin (рдЬреИрд╕реЗ рдореЗрдореЛрд░реА рдпрд╛ рдЯреНрд░рд╛рдВрд╕рдХреНрд░рд┐рдкреНрдЯ рд╕реНрдЯреЛрд░) рдЙрди рдШреЛрд╕реНрдЯ рд░реЛ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗ рд╕рдХреЗрдВ рдЬреЛ рдЕрдиреНрдпрдерд╛ рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХреЗ рдкрд╛рд░ рдЦреБрд▓реЗ рд╕реНрдЯреЗрдЯ рдореЗрдВ рд░рд╣ рдЬрд╛рддреЗред рдлрд╛рдЗрдирд▓рд╛рдЗрдЬрд╝рд░ рд╕реАрдорд┐рдд рд╣реИ рддрд╛рдХрд┐ рдХреЛрдИ рдзреАрдорд╛ Plugin SIGTERM/SIGINT рдХреЛ рдмреНрд▓реЙрдХ рди рдХрд░ рд╕рдХреЗредbefore_compaction/after_compaction- Compaction рдЪрдХреНрд░реЛрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░реЗрдВ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдПрдиреЛрдЯреЗрдЯ рдХрд░реЗрдВbefore_reset- рд╕реЗрд╢рди-рд░реАрд╕реЗрдЯ рдЗрд╡реЗрдВрдЯреНрд╕ (/reset, рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реАрд╕реЗрдЯ) рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░реЗрдВ
рд╕рдмрдПрдЬреЗрдВрдЯ
subagent_spawned/subagent_ended- рд╕рдмрдПрдЬреЗрдВрдЯ рд▓реЙрдиреНрдЪ рдФрд░ рдкреВрд░реНрдгрддрд╛ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░реЗрдВредsubagent_delivery_target- рдкреВрд░реНрдгрддрд╛ рдбрд┐рд▓реАрд╡рд░реА рдХреЗ рд▓рд┐рдП рд╕рдВрдЧрддрддрд╛ рд╣реБрдХ, рдЬрдм рдХреЛрдИ рдХреЛрд░ рд╕реЗрд╢рди рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд░реВрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреАредsubagent_spawning- рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╕рдВрдЧрддрддрд╛ рд╣реБрдХред рдХреЛрд░ рдЕрдмsubagent_spawnedрдлрд╛рдпрд░ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЪреИрдирд▓ рд╕реЗрд╢рди-рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдЕрдбреИрдкреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗthread: trueрд╕рдмрдПрдЬреЗрдВрдЯ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИредsubagent_spawnedрдореЗрдВresolvedModelрдФрд░resolvedProviderрд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм OpenClaw рдиреЗ рд▓реЙрдиреНрдЪ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд╛рдЗрд▓реНрдб рд╕реЗрд╢рди рдХрд╛ рдиреЗрдЯрд┐рд╡ рдореЙрдбрд▓ рд╣рд▓ рдХрд░ рд▓рд┐рдпрд╛ рд╣реЛредsubagent_endedtargetSessionKey(рдкрд╣рдЪрд╛рди тАФ рдпрд╣subagent_spawned.childSessionKeyрд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ),targetKind("subagent"рдпрд╛"acp"),reason, рд╡реИрдХрд▓реНрдкрд┐рдХoutcome("ok","error","timeout","killed","reset", рдпрд╛"deleted"), рд╡реИрдХрд▓реНрдкрд┐рдХerror,runId,endedAt,accountId, рдФрд░sendFarewellрд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВagentIdрдпрд╛childSessionKeyрд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВ; рд╕рдВрдмрдВрдзрд┐рддsubagent_spawnedрдЗрд╡реЗрдВрдЯ рд╕реЗ рд╕рдВрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПtargetSessionKeyрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рд▓рд╛рдЗрдлрд╕рд╛рдЗрдХрд▓
gateway_start/gateway_stop- Gateway рдХреЗ рд╕рд╛рде Plugin-рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реА рд╕реЗрд╡рд╛рдПрдВ рд╢реБрд░реВ рдпрд╛ рдмрдВрдж рдХрд░реЗрдВdeactivate-gateway_stopрдХреЗ рд▓рд┐рдП рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╕рдВрдЧрддрддрд╛ рдЙрдкрдирд╛рдо; рдирдП Plugin рдореЗрдВgateway_stopрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВcron_changed- Gateway-рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реЗ Cron рд▓рд╛рдЗрдлрд╕рд╛рдЗрдХрд▓ рдмрджрд▓рд╛рд╡реЛрдВ (рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛, рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛, рд╣рдЯрд╛рдпрд╛ рдЧрдпрд╛, рд╢реБрд░реВ рд╣реБрдЖ, рд╕рдорд╛рдкреНрдд рд╣реБрдЖ, рд╢реЗрдбреНрдпреВрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛) рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░реЗрдВbefore_install- рд▓реЛрдб рдХрд┐рдП рдЧрдП Plugin рд░рдирдЯрд╛рдЗрдо рд╕реЗ рд╕реНрдЯреЗрдЬ рдХреА рдЧрдИ skill рдпрд╛ Plugin рдЗрдВрд╕реНрдЯреЙрд▓ рд╕рд╛рдордЧреНрд░реА рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ
рдбреАрдмрдЧ рд░рдирдЯрд╛рдЗрдо рд╣реБрдХ
рдЬрдм рдХрд┐рд╕реА Plugin рдХреЛ рдПрдЬреЗрдВрдЯ рдЯрд░реНрди рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рддрд╛ рдпрд╛ рдореЙрдбрд▓ рдмрджрд▓рдирд╛ рд╣реЛ, рддреЛ before_model_resolve рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдпрд╣ рдореЙрдбрд▓ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рддрд╛ рд╣реИ; llm_output рдХреЗрд╡рд▓ рддрдм рдЪрд▓рддрд╛ рд╣реИ рдЬрдм
рдХрд┐рд╕реА рдореЙрдбрд▓ рдкреНрд░рдпрд╛рд╕ рд╕реЗ рд╕рд╣рд╛рдпрдХ рдЖрдЙрдЯрдкреБрдЯ рдмрдирддрд╛ рд╣реИред
рдкреНрд░рднрд╛рд╡реА рд╕реЗрд╢рди рдореЙрдбрд▓ рдХреЗ рдкреНрд░рдорд╛рдг рдХреЗ рд▓рд┐рдП, рд░рдирдЯрд╛рдЗрдо рд░рдЬрд┐рд╕реНрдЯреНрд░реЗрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ, рдлрд┐рд░
openclaw sessions рдпрд╛ Gateway рд╕реЗрд╢рди/status рд╕рддрд╣реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдкреНрд░рджрд╛рддрд╛ рдкреЗрд▓реЛрдб рдбреАрдмрдЧ рдХрд░рддреЗ рд╕рдордп,
Gateway рдХреЛ --raw-stream рдФрд░
--raw-stream-path <path> рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ; рдпреЗ рдлреНрд▓реИрдЧ рдХрдЪреНрдЪреЗ рдореЙрдбрд▓ рд╕реНрдЯреНрд░реАрдо рдЗрд╡реЗрдВрдЯреНрд╕ рдХреЛ jsonl
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
рдЯреВрд▓ рдХреЙрд▓ рдиреАрддрд┐
before_tool_call рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ:
event.toolNameevent.params- рд╡реИрдХрд▓реНрдкрд┐рдХ
event.toolKindрдФрд░event.toolInputKind, рдРрд╕реЗ рдЯреВрд▓ рдХреЗ рд▓рд┐рдП рд╣реЛрд╕реНрдЯ-рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдбрд┐рд╕реНрдХреНрд░рд┐рдорд┐рдиреЗрдЯрд░ рдЬреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдирд╛рдо рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ; рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╛рд╣рд░реА рдХреЛрдб-рдореЛрдбexecрдХреЙрд▓toolKind: "code_mode_exec"рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрдирдкреБрдЯ рднрд╛рд╖рд╛ рдЬреНрдЮрд╛рдд рд╣реЛрдиреЗ рдкрд░toolInputKind: "javascript" | "typescript"рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ - рд╡реИрдХрд▓реНрдкрд┐рдХ
event.derivedPaths, рдЬрд┐рд╕рдореЗрдВapply_patchрдЬреИрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз рдЯреВрд▓ рдПрдирд╡реЗрд▓рдк рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡реЛрддреНрддрдо-рдкреНрд░рдпрд╛рд╕ рд╣реЛрд╕реНрдЯ-рд╡реНрдпреБрддреНрдкрдиреНрди рд▓рдХреНрд╖реНрдп рдкрде рд╕рдВрдХреЗрдд рд╣реЛрддреЗ рд╣реИрдВ; рдореМрдЬреВрдж рд╣реЛрдиреЗ рдкрд░, рдпреЗ рдкрде рдЕрдзреВрд░реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЯреВрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд┐рди рдЪреАрдЬреЛрдВ рдХреЛ рдЫреБрдПрдЧрд╛ рдЙрдирдХрд╛ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдХреГрдд рдпрд╛ рдЖрдВрд╢рд┐рдХ рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде) - рд╡реИрдХрд▓реНрдкрд┐рдХ
event.runId - рд╡реИрдХрд▓реНрдкрд┐рдХ
event.toolCallId - рд╕рдВрджрд░реНрдн рдлрд╝реАрд▓реНрдб рдЬреИрд╕реЗ
ctx.agentId,ctx.sessionKey,ctx.sessionId,ctx.runId,ctx.jobId(Cron-рдЪрд╛рд▓рд┐рдд рд░рди рдкрд░ рд╕реЗрдЯ),ctx.toolKind,ctx.toolInputKind, рдФрд░ рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХctx.trace
рдпрд╣ рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ:
type BeforeToolCallResult = { params?: Record<string, unknown>; block?: boolean; blockReason?: string; requireApproval?: { title: string; description: string; severity?: "info" | "warning" | "critical"; timeoutMs?: number; timeoutBehavior?: "allow" | "deny"; allowedDecisions?: Array<"allow-once" | "allow-always" | "deny">; pluginId?: string; onResolution?: ( decision: "allow-once" | "allow-always" | "deny" | "timeout" | "cancelled", ) => Promise<void> | void; };};рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рд▓рд╛рдЗрдлрд╕рд╛рдЗрдХрд▓ рд╣реБрдХ рдХреЗ рд▓рд┐рдП рд╣реБрдХ рдЧрд╛рд░реНрдб рд╡реНрдпрд╡рд╣рд╛рд░:
block: trueрдЯрд░реНрдорд┐рдирд▓ рд╣реИ рдФрд░ рдХрдо-рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реЗ рд╣реИрдВрдбрд▓рд░ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИредblock: falseрдХреЛ рдХреЛрдИ рдирд┐рд░реНрдгрдп рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛редparamsрдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЯреВрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реИредrequireApprovalрдПрдЬреЗрдВрдЯ рд░рди рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рдФрд░ Plugin рд╕реНрд╡реАрдХреГрддрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдкреВрдЫрддрд╛ рд╣реИред/approveрдХрдорд╛рдВрдб exec рдФрд░ Plugin рд╕реНрд╡реАрдХреГрддрд┐рдпреЛрдВ, рджреЛрдиреЛрдВ рдХреЛ рд╕реНрд╡реАрдХреГрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред Codex рдРрдк-рд╕рд░реНрд╡рд░ рд░рд┐рдкреЛрд░реНрдЯ-рдореЛрдб рдиреЗрдЯрд┐рд╡PreToolUseрд░рд┐рд▓реЗ рдореЗрдВ, рдЗрд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рдРрдк-рд╕рд░реНрд╡рд░ рд╕реНрд╡реАрдХреГрддрд┐ рдЕрдиреБрд░реЛрдз рддрдХ рд╕реНрдердЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; Codex рд╣рд╛рд░реНрдиреЗрд╕ рд░рдирдЯрд╛рдЗрдо рджреЗрдЦреЗрдВред- рдХрд┐рд╕реА рдЙрдЪреНрдЪ-рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реБрдХ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХреГрддрд┐ рдорд╛рдВрдЧреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдХрдо-рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓рд╛
block: trueрдмреНрд▓реЙрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИред onResolutionрдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕реНрд╡реАрдХреГрддрд┐ рдирд┐рд░реНрдгрдп рдорд┐рд▓рддрд╛ рд╣реИ -allow-once,allow-always,deny,timeout, рдпрд╛cancelledред
рд╕реНрд╡реАрдХреГрддрд┐ рд░реВрдЯрд┐рдВрдЧ, рдирд┐рд░реНрдгрдп рд╡реНрдпрд╡рд╣рд╛рд░, рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЯреВрд▓ рдпрд╛ exec рд╕реНрд╡реАрдХреГрддрд┐рдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп
requireApproval рдХрдм рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП Plugin рдЕрдиреБрдорддрд┐ рдЕрдиреБрд░реЛрдз рджреЗрдЦреЗрдВред
рдЬрд┐рди Plugin рдХреЛ рд╣реЛрд╕реНрдЯ-рд╕реНрддрд░ рдХреА рдиреАрддрд┐ рдЪрд╛рд╣рд┐рдП, рд╡реЗ
api.registerTrustedToolPolicy(...) рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЯреВрд▓ рдиреАрддрд┐рдпрд╛рдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпреЗ рд╕рд╛рдорд╛рдиреНрдп
before_tool_call рд╣реБрдХ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╣реБрдХ рдирд┐рд░реНрдгрдпреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рддреЗ рд╣реИрдВред рдмрдВрдбрд▓ рдХреА рдЧрдИ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп
рдиреАрддрд┐рдпрд╛рдВ рдкрд╣рд▓реЗ рдЪрд▓рддреА рд╣реИрдВ; рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП-Plugin рдХреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдиреАрддрд┐рдпрд╛рдВ Plugin-рд▓реЛрдб
рдХреНрд░рдо рдореЗрдВ рдЖрдЧреЗ рдЪрд▓рддреА рд╣реИрдВ; рд╕рд╛рдорд╛рдиреНрдп before_tool_call рд╣реБрдХ рдЙрдирдХреЗ рдмрд╛рдж рдЪрд▓рддреЗ рд╣реИрдВред рдмрдВрдбрд▓ рдХрд┐рдП рдЧрдП Plugin
рдореМрдЬреВрджрд╛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп-рдиреАрддрд┐ рдкрде рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реИрдВред рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП Plugin рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП
рдФрд░ contracts.trustedToolPolicies рдореЗрдВ рд╣рд░ рдиреАрддрд┐ id рдШреЛрд╖рд┐рдд рдХрд░рдиреА рд╣реЛрдЧреА; рдЕрдШреЛрд╖рд┐рдд ids
рд░рдЬрд┐рд╕реНрдЯреНрд░реЗрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреА рдЬрд╛рддреА рд╣реИрдВред рдиреАрддрд┐ ids рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ
Plugin рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ Plugin рд╡рд╣реА рд╕реНрдерд╛рдиреАрдп id рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓
рд╣реЛрд╕реНрдЯ-рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЧреЗрдЯ рдЬреИрд╕реЗ рд╡рд░реНрдХрд╕реНрдкреЗрд╕ рдиреАрддрд┐, рдмрдЬрдЯ рдкреНрд░рд╡рд░реНрддрди, рдпрд╛
рдЖрд░рдХреНрд╖рд┐рдд рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВред
Exec рдкрд░реНрдпрд╛рд╡рд░рдг рд╣реБрдХ
resolve_exec_env Plugin рдХреЛ рдмреЗрд╕ exec рдкрд░реНрдпрд╛рд╡рд░рдг рдмрдирдиреЗ рдХреЗ рдмрд╛рдж рдФрд░
рдХрдорд╛рдВрдб рдЪрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ exec рдЯреВрд▓ рдЗрдирд╡реЛрдХреЗрд╢рди рдореЗрдВ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реЗрд░рд┐рдПрдмрд▓ рдпреЛрдЧрджрд╛рди рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред
рдпрд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ:
event.sessionKeyevent.toolName, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдореЗрд╢рд╛"exec"event.host,"gateway","sandbox", рдпрд╛"node"рдореЗрдВ рд╕реЗ рдПрдХ- рд╕рдВрджрд░реНрдн рдлрд╝реАрд▓реНрдб рдЬреИрд╕реЗ
ctx.agentId,ctx.sessionKey,ctx.messageProvider, рдФрд░ctx.channelId
exec рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рдорд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП Record<string, string> рд▓реМрдЯрд╛рдПрдВред рд╣реИрдВрдбрд▓рд░
рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреНрд░рдо рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВ, рдФрд░ рдмрд╛рдж рдХреЗ рд╣реБрдХ рдкрд░рд┐рдгрд╛рдо рдЙрд╕реА рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдХреЗ рд╣реБрдХ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВред
Hook рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдорд░реНрдЬ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реЛрд╕реНрдЯ exec environment рдХреБрдВрдЬреА рдиреАрддрд┐ рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдорд╛рдиреНрдп рдХреБрдВрдЬрд┐рдпрд╛рдВ, PATH, рдФрд░ рдЦрддрд░рдирд╛рдХ рд╣реЛрд╕реНрдЯ override рдХреБрдВрдЬрд┐рдпрд╛рдВ рдЬреИрд╕реЗ LD_*, DYLD_*, NODE_OPTIONS, proxy variables, рдФрд░ TLS override variables рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ plugin env gateway approval/audit рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ node-host execution requests рдХреЛ рдЖрдЧреЗ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЯреВрд▓ рдкрд░рд┐рдгрд╛рдо persistence
рдЯреВрд▓ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ UI rendering, diagnostics, media routing, рдпрд╛ plugin-owned рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП structured details рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред details рдХреЛ runtime рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдорд╛рдиреЗрдВ, prompt content рдирд╣реАрдВ:
- OpenClaw provider replay рдФрд░ compaction input рд╕реЗ рдкрд╣рд▓реЗ
toolResult.detailsрд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдореЗрдЯрд╛рдбреЗрдЯрд╛ model context рди рдмрди рдЬрд╛рдПред - Persisted session entries рдХреЗрд╡рд▓ bounded
detailsрд░рдЦрддреА рд╣реИрдВред рдмрд╣реБрдд рдмрдбрд╝реЗ details рдХреЛ compact summary рдФрд░persistedDetailsTruncated: trueрд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред tool_result_persistрдФрд░before_message_writeрдЕрдВрддрд┐рдо persistence cap рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рддреЗ рд╣реИрдВред Hooks рдХреЛ рдлрд┐рд░ рднреА рд▓реМрдЯрд╛рдП рдЧрдПdetailsрдЫреЛрдЯреЗ рд░рдЦрдиреЗ рдЪрд╛рд╣рд┐рдП рдФрд░ prompt-relevant text рдХреЛ рдХреЗрд╡рд▓detailsрдореЗрдВ рд░рдЦрдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП; model-visible tool output рдХреЛcontentрдореЗрдВ рд░рдЦреЗрдВред
Prompt рдФрд░ model hooks
рдирдП plugins рдХреЗ рд▓рд┐рдП phase-specific hooks рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
before_model_resolve: рдХреЗрд╡рд▓ рд╡рд░реНрддрдорд╛рди prompt рдФрд░ attachment рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИредproviderOverrideрдпрд╛modelOverrideрд▓реМрдЯрд╛рдПрдВредagent_turn_prepare: рд╡рд░реНрддрдорд╛рди prompt, prepared session messages, рдФрд░ рдЗрд╕ session рдХреЗ рд▓рд┐рдП drained рдХреА рдЧрдИ any exactly-once queued injections рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИредprependContextрдпрд╛appendContextрд▓реМрдЯрд╛рдПрдВредbefore_prompt_build: рд╡рд░реНрддрдорд╛рди prompt рдФрд░ session messages рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИредprependContext,appendContext,systemPrompt,prependSystemContext, рдпрд╛appendSystemContextрд▓реМрдЯрд╛рдПрдВредheartbeat_prompt_contribution: рдХреЗрд╡рд▓ heartbeat turns рдХреЗ рд▓рд┐рдП рдЪрд▓рддрд╛ рд╣реИ рдФрд░prependContextрдпрд╛appendContextрд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрд╣ рдЙрди background monitors рдХреЗ рд▓рд┐рдП рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ user-initiated turns рдмрджрд▓реЗ рдмрд┐рдирд╛ current state summarize рдХрд░рдиреА рд╣реЛрддреА рд╣реИред
before_agent_start compatibility рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдКрдкрд░ рджрд┐рдП рдЧрдП explicit hooks рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ
рддрд╛рдХрд┐ рдЖрдкрдХрд╛ plugin рдХрд┐рд╕реА legacy combined phase рдкрд░ рдирд┐рд░реНрднрд░ рди рд░рд╣реЗред
before_agent_run prompt construction рдХреЗ рдмрд╛рдж рдФрд░ рдХрд┐рд╕реА рднреА model input рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рддрд╛ рд╣реИ,
рдЬрд┐рд╕рдореЗрдВ prompt-local image loading рдФрд░ llm_input observation рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣
рд╡рд░реНрддрдорд╛рди user input рдХреЛ prompt рдХреЗ рд░реВрдк рдореЗрдВ, loaded session history рдХреЛ messages
рдореЗрдВ, рдФрд░ active system prompt рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред Model рджреНрд╡рд╛рд░рд╛ prompt рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ run рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП
{ outcome: "block", reason, message? } рд▓реМрдЯрд╛рдПрдВред reason internal рд╣реИ;
message user-facing replacement рд╣реИред рдХреЗрд╡рд▓ рд╕рдорд░реНрдерд┐рдд outcomes
pass рдФрд░ block рд╣реИрдВ; unsupported decision shapes fail closed рд╣реЛрддреЗ рд╣реИрдВред
рдЬрдм рдХреЛрдИ run blocked рд╣реЛрддрд╛ рд╣реИ, OpenClaw рдХреЗрд╡рд▓ replacement text рдХреЛ
message.content рдореЗрдВ рдФрд░ non-sensitive block рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдЬреИрд╕реЗ blocking plugin
id рдФрд░ timestamp рдХреЛ store рдХрд░рддрд╛ рд╣реИред рдореВрд▓ user text transcript рдпрд╛ future
context рдореЗрдВ retained рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ред Internal block reasons sensitive рдорд╛рдиреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░
transcript, history, broadcast, log, рдФрд░ diagnostics payloads рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВред Observability
рдХреЛ sanitized fields рдЬреИрд╕реЗ blocker id, outcome, timestamp, рдпрд╛ safe
category рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
before_agent_start рдФрд░ agent_end рдореЗрдВ event.runId рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдЬрдм OpenClaw
active run рдХреА рдкрд╣рдЪрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡рд╣реА value ctx.runId рдкрд░ рднреА рдЙрдкрд▓рдмреНрдз рд╣реЛрддреА рд╣реИред
Cron-driven runs ctx.jobId (originating cron job id) рднреА expose рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐
plugin hooks metrics, side effects, рдпрд╛ state рдХреЛ рдХрд┐рд╕реА specific scheduled
job рддрдХ scope рдХрд░ рд╕рдХреЗрдВред
Channel-originated runs рдХреЗ рд▓рд┐рдП, ctx.channel рдФрд░ ctx.messageProvider
provider surface рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ discord рдпрд╛ telegram, рдЬрдмрдХрд┐ ctx.channelId
conversation target identifier рд╣реЛрддрд╛ рд╣реИ рдЬрдм OpenClaw рдЙрд╕реЗ session
key рдпрд╛ delivery metadata рд╕реЗ derive рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЬрдм sender identity рдЙрдкрд▓рдмреНрдз рд╣реЛ, agent hook contexts рдореЗрдВ рдпреЗ рднреА рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ:
ctx.senderIdтАФ channel-scoped sender ID (рдЬреИрд╕реЗ Feishuopen_id, Discord user ID)ред рддрдм populated рд╣реЛрддрд╛ рд╣реИ рдЬрдм run known sender metadata рд╡рд╛рд▓реЗ user message рд╕реЗ originate рд╣реЛрддрд╛ рд╣реИредctx.chatIdтАФ transport-native conversation identifier (рдЬреИрд╕реЗ Feishuchat_id, Telegramchat_id)ред рддрдм populated рд╣реЛрддрд╛ рд╣реИ рдЬрдм originating channel native conversation ID рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИредctx.channelContext.sender.idтАФctx.senderIdрдЬреИрд╕рд╛ рд╣реА sender ID, рдРрд╕реЗ channel-owned object рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЬрд┐рд╕реЗ plugins channel-specific fields рд╕реЗ extend рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредctx.channelContext.chat.idтАФctx.chatIdрдЬреИрд╕рд╛ рд╣реА conversation ID, рдРрд╕реЗ channel-owned object рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЬрд┐рд╕реЗ plugins channel-specific fields рд╕реЗ extend рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Core рдХреЗрд╡рд▓ nested id fields define рдХрд░рддрд╛ рд╣реИред Channel plugins рдЬреЛ richer
sender рдпрд╛ chat metadata inbound helper рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ pass рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ
openclaw/plugin-sdk/channel-inbound рд╕реЗ
PluginHookChannelSenderContext рдпрд╛ PluginHookChannelChatContext augment рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
declare module "openclaw/plugin-sdk/channel-inbound" { interface PluginHookChannelSenderContext { unionId?: string; userId?: string; }}Channel plugins рдЙрди fields рдХреЛ inbound SDK helper рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ pass рдХрд░рддреЗ рд╣реИрдВ:
buildChannelInboundEventContext({ // ... channelContext: { sender: { id: senderOpenId, unionId, userId }, chat: { id: chatId }, },});рдпреЗ fields optional рд╣реИрдВ рдФрд░ system-originated runs (heartbeat, cron, exec-event) рдХреЗ рд▓рд┐рдП absent рд╣реЛрддреЗ рд╣реИрдВред
ctx.senderExternalId рдкреБрд░рд╛рдиреЗ plugins рдХреЗ рд▓рд┐рдП deprecated source-compatibility field рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛ рд╣реБрдЖ рд╣реИред
Core рдЗрд╕реЗ populate рдирд╣реАрдВ рдХрд░рддрд╛; рдирдИ channel-specific sender identities
module augmentation рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ ctx.channelContext.sender рдХреЗ рдЕрдВрддрд░реНрдЧрдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
agent_end рдПрдХ observation hook рд╣реИред Gateway рдФрд░ persistent harness paths рдЗрд╕реЗ
turn рдХреЗ рдмрд╛рдж fire-and-forget рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ short-lived one-shot CLI paths
process cleanup рд╕реЗ рдкрд╣рд▓реЗ hook promise рдХрд╛ wait рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ trusted plugins terminal
observability flush рдХрд░ рд╕рдХреЗрдВ рдпрд╛ state capture рдХрд░ рд╕рдХреЗрдВред Hook runner 30 second timeout apply рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐
wedged plugin рдпрд╛ embedding endpoint hook promise рдХреЛ рд╣рдореЗрд╢рд╛ pending рди рдЫреЛрдбрд╝ рд╕рдХреЗред
Timeout log рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ OpenClaw рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИ; рдпрд╣
plugin-owned network work рдХреЛ cancel рдирд╣реАрдВ рдХрд░рддрд╛ рдЬрдм рддрдХ plugin рдЕрдкрдирд╛ abort signal рднреА use рди рдХрд░реЗред
Provider-call telemetry рдХреЗ рд▓рд┐рдП model_call_started рдФрд░ model_call_ended рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдЬрд┐рд╕реЗ raw prompts, history, responses, headers, request
bodies, рдпрд╛ provider request IDs рдирд╣реАрдВ рдорд┐рд▓рдиреЗ рдЪрд╛рд╣рд┐рдПред рдЗрди hooks рдореЗрдВ stable metadata рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ рдЬреИрд╕реЗ
runId, callId, provider, model, optional api/transport, terminal
durationMs/outcome, рдФрд░ upstreamRequestIdHash рдЬрдм OpenClaw bounded provider request-id hash derive рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЬрдм runtime рдиреЗ context-window metadata resolve рдХрд░ рд▓рд┐рдпрд╛ рд╣реЛ, hook event рдФрд░ context рдореЗрдВ
contextTokenBudget рднреА рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, model/config/agent caps рдХреЗ рдмрд╛рдж effective token budget,
рд╕рд╛рде рд╣реА contextWindowSource рдФрд░ contextWindowReferenceTokens рдЬрдм рдХреЛрдИ lower cap
apply рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред
before_agent_finalize рдХреЗрд╡рд▓ рддрдм рдЪрд▓рддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ harness natural
final assistant answer accept рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛред рдпрд╣ /stop cancellation path рдирд╣реАрдВ рд╣реИ рдФрд░
user рджреНрд╡рд╛рд░рд╛ turn abort рдХрд░рдиреЗ рдкрд░ рдирд╣реАрдВ рдЪрд▓рддрд╛ред Finalization рд╕реЗ рдкрд╣рд▓реЗ harness рд╕реЗ one more model pass рдорд╛рдВрдЧрдиреЗ рдХреЗ рд▓рд┐рдП
{ action: "revise", reason } рд▓реМрдЯрд╛рдПрдВ, finalization force рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП { action: "finalize", reason? } рд▓реМрдЯрд╛рдПрдВ, рдпрд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП result omit рдХрд░реЗрдВред
Codex native Stop hooks рдЗрд╕ hook рдореЗрдВ OpenClaw
before_agent_finalize decisions рдХреЗ рд░реВрдк рдореЗрдВ relay рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
action: "revise" рд▓реМрдЯрд╛рддреЗ рд╕рдордп, plugins extra model pass рдХреЛ bounded рдФрд░ replay-safe рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП
retry metadata рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
type BeforeAgentFinalizeRetry = { instruction: string; idempotencyKey?: string; maxAttempts?: number;};instruction harness рдХреЛ рднреЗрдЬреЗ рдЧрдП revision reason рдореЗрдВ append рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
idempotencyKey host рдХреЛ equivalent finalize decisions рдореЗрдВ same plugin request рдХреЗ рд▓рд┐рдП retries count рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ,
рдФрд░ maxAttempts рдпрд╣ cap рдХрд░рддрд╛ рд╣реИ рдХрд┐ natural final answer рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рд░рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ host рдХрд┐рддрдиреЗ extra passes allow рдХрд░реЗрдЧрд╛ред
Non-bundled plugins рдЬрд┐рдиреНрд╣реЗрдВ raw conversation hooks (before_model_resolve,
before_agent_reply, llm_input, llm_output, before_agent_finalize,
agent_end, рдпрд╛ before_agent_run) рдЪрд╛рд╣рд┐рдП, рдЙрдиреНрд╣реЗрдВ set рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
{ "plugins": { "entries": { "my-plugin": { "hooks": { "allowConversationAccess": true } } } }}Prompt-mutating hooks рдФрд░ durable next-turn injections рдХреЛ рдкреНрд░рддрд┐ plugin
plugins.entries.<id>.hooks.allowPromptInjection=false рд╕реЗ disable рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
Session extensions рдФрд░ next-turn injections
Workflow plugins api.registerSessionExtension(...) рдХреЗ рд╕рд╛рде рдЫреЛрдЯрд╛ JSON-compatible session state
persist рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ Gateway
sessions.pluginPatch method рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрд╕реЗ update рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Session rows registered extension state рдХреЛ
pluginExtensions рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ project рдХрд░рддреА рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ Control UI рдФрд░ рдЕрдиреНрдп clients
plugin internals рдЬрд╛рдиреЗ рдмрд┐рдирд╛ plugin-owned status render рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЬрдм рдХрд┐рд╕реА plugin рдХреЛ durable context рдХреЛ рдЕрдЧрд▓реЗ model turn рддрдХ exactly once рдкрд╣реБрдВрдЪрд╛рдирд╛ рд╣реЛ, рддреЛ
api.enqueueNextTurnInjection(...) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред OpenClaw prompt hooks рд╕реЗ рдкрд╣рд▓реЗ queued injections drain рдХрд░рддрд╛ рд╣реИ,
expired injections drop рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддрд┐ plugin idempotencyKey рд╕реЗ deduplicate рдХрд░рддрд╛ рд╣реИред
рдпрд╣ approval resumes, policy summaries,
background monitor deltas, рдФрд░ command continuations рдХреЗ рд▓рд┐рдП рд╕рд╣реА seam рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ
рдЕрдЧрд▓реЗ turn рдкрд░ model рдХреЛ visible рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рд▓реЗрдХрд┐рди permanent system prompt text рдирд╣реАрдВ рдмрдирдирд╛ рдЪрд╛рд╣рд┐рдПред
Cleanup semantics contract рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВред Session extension cleanup рдФрд░
runtime lifecycle cleanup callbacks рдХреЛ reset, delete, disable, рдпрд╛
restart рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред Host reset/delete/disable рдХреЗ рд▓рд┐рдП owning plugin рдХреА persistent session extension
state рдФрд░ pending next-turn injections рд╣рдЯрд╛рддрд╛ рд╣реИ; restart durable session state рд░рдЦрддрд╛ рд╣реИ
рдЬрдмрдХрд┐ cleanup callbacks plugins рдХреЛ рдкреБрд░рд╛рдиреЗ runtime generation рдХреЗ рд▓рд┐рдП scheduler
jobs, run context, рдФрд░ рдЕрдиреНрдп out-of-band resources release рдХрд░рдиреЗ рджреЗрддреЗ рд╣реИрдВред
Message hooks
Channel-level routing рдФрд░ delivery policy рдХреЗ рд▓рд┐рдП message hooks рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
message_received: inbound content, sender,threadId,messageId,senderId, optional run/session correlation, рдФрд░ metadata observe рдХрд░реЗрдВредmessage_sending:contentrewrite рдХрд░реЗрдВ рдпрд╛{ cancel: true }рд▓реМрдЯрд╛рдПрдВредreply_payload_sending: normalizedReplyPayloadobjects (рдЬрд┐рд╕рдореЗрдВpresentation,delivery, media refs, рдФрд░ text рд╢рд╛рдорд┐рд▓ рд╣реИрдВ) rewrite рдХрд░реЗрдВ рдпрд╛{ cancel: true }рд▓реМрдЯрд╛рдПрдВредmessage_sent: final success рдпрд╛ failure observe рдХрд░реЗрдВред
Audio-only TTS replies рдХреЗ рд▓рд┐рдП, content рдореЗрдВ hidden spoken transcript рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рднрд▓реЗ рд╣реА channel payload рдореЗрдВ visible text/caption рди рд╣реЛред рдЙрд╕
content рдХреЛ rewrite рдХрд░рдиреЗ рд╕реЗ рдХреЗрд╡рд▓ hook-visible transcript update рд╣реЛрддрд╛ рд╣реИ; рдпрд╣
media caption рдХреЗ рд░реВрдк рдореЗрдВ render рдирд╣реАрдВ рд╣реЛрддрд╛ред
reply_payload_sending events рдореЗрдВ usageState, рдПрдХ best-effort live
per-turn model/usage/context snapshot, рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред Durable delivery, recovered replay, рдФрд░
exact run correlation рдХреЗ рдмрд┐рдирд╛ replies рдЗрд╕реЗ omit рдХрд░рддреЗ рд╣реИрдВред
Message hook contexts рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдкрд░ stable correlation fields expose рдХрд░рддреЗ рд╣реИрдВ:
ctx.sessionKey, ctx.runId, ctx.messageId, ctx.senderId, ctx.trace,
ctx.traceId, ctx.spanId, ctx.parentSpanId, рдФрд░ ctx.callDepthред Inbound
рдФрд░ before_dispatch contexts reply metadata рднреА expose рдХрд░рддреЗ рд╣реИрдВ рдЬрдм channel рдХреЗ рдкрд╛рд╕
visibility-filtered quoted message data рд╣реЛ: replyToId, replyToIdFull,
replyToBody, replyToSender, рдФрд░ replyToIsQuoteред Legacy metadata рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ
рдЗрди first-class fields рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВред
Channel-specific metadata рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ typed threadId рдФрд░ replyToId fields рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВред
Decision rules:
cancel: trueрдХреЗ рд╕рд╛рдеmessage_sendingрдЕрдВрддрд┐рдо рд╣реИ.cancel: falseрдХреЗ рд╕рд╛рдеmessage_sendingрдХреЛ рдХреЛрдИ рдирд┐рд░реНрдгрдп рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛.- рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛
contentрдХрдо-рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реЗ hooks рддрдХ рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХреЛрдИ рдмрд╛рдж рдХрд╛ hook рд╡рд┐рддрд░рдг рд░рджреНрдж рдирд╣реАрдВ рдХрд░ рджреЗрддрд╛. reply_payload_sendingpayload normalization рдХреЗ рдмрд╛рдж рдФрд░ channel delivery рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ originating channel рдкрд░ рд╡рд╛рдкрд╕ route рдХрд┐рдП рдЧрдП replies рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ. Handlers рдХреНрд░рдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ handler рдЙрдЪреНрдЪ-рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реЗ handlers рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдирд╡реАрдирддрдо payload рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ.reply_payload_sendingpayloads runtime trust markers рдЬреИрд╕реЗtrustedLocalMediaрдХреЛ expose рдирд╣реАрдВ рдХрд░рддреЗ; plugins payload shape edit рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди local media trust grant рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ.message_sendingcancellation рдХреЗ рд╕рд╛рдеcancelReasonрдФрд░ рд╕реАрдорд┐рддmetadataрд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ. рдирдП message lifecycle APIs рдЗрд╕реЗ reasoncancelled_by_message_sending_hookрдХреЗ рд╕рд╛рде suppressed delivery outcome рдХреЗ рд░реВрдк рдореЗрдВ expose рдХрд░рддреЗ рд╣реИрдВ; legacy direct delivery compatibility рдХреЗ рд▓рд┐рдП empty result array рд▓реМрдЯрд╛рддрд╛ рд░рд╣рддрд╛ рд╣реИ.message_sentрдХреЗрд╡рд▓ observation рдХреЗ рд▓рд┐рдП рд╣реИ. Handler failures log рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ delivery result рдирд╣реАрдВ рдмрджрд▓рддреЗ.
Install hooks
operator-owned allow/block decisions рдХреЗ рд▓рд┐рдП security.installPolicy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ. рд╡рд╣
policy OpenClaw config рд╕реЗ рдЪрд▓рддреА рд╣реИ, CLI install рдФрд░ update paths рдХреЛ cover рдХрд░рддреА рд╣реИ, рдФрд░ enabled
рд▓реЗрдХрд┐рди unavailable рд╣реЛрдиреЗ рдкрд░ fail closed рдХрд░рддреА рд╣реИ.
before_install рдПрдХ plugin-runtime lifecycle hook рд╣реИ. рдпрд╣
security.installPolicy рдХреЗ рдмрд╛рдж рдХреЗрд╡рд▓ рдЙрд╕ OpenClaw process рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ plugin hooks
рдкрд╣рд▓реЗ рд╕реЗ loaded рд╣реИрдВ, рдЬреИрд╕реЗ Gateway-backed install flows. рдпрд╣
plugin-owned observations, warnings, рдФрд░ compatibility checks рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣
installs рдХреЗ рд▓рд┐рдП primary enterprise рдпрд╛ host security boundary рдирд╣реАрдВ рд╣реИ. builtinScan
field compatibility рдХреЗ рд▓рд┐рдП event payload рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди OpenClaw рдЕрдм
built-in install-time dangerous-code blocking рдирд╣реАрдВ рдЪрд▓рд╛рддрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ empty ok
result рд╣реИ. рдЗрд╕ process рдореЗрдВ install рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП additional findings рдпрд╛ { block: true, blockReason } return рдХрд░реЗрдВ.
block: true terminal рд╣реИ. block: false рдХреЛ no decision рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ.
Handler failures install рдХреЛ fail-closed block рдХрд░рддреЗ рд╣реИрдВ.
Gateway lifecycle
рдЙрди plugin services рдХреЗ рд▓рд┐рдП gateway_start рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ Gateway-owned state рдЪрд╛рд╣рд┐рдП.
context cron inspection рдФрд░ updates рдХреЗ рд▓рд┐рдП ctx.config, ctx.workspaceDir, рдФрд░ ctx.getCron?.() expose рдХрд░рддрд╛ рд╣реИ. long-running
resources clean up рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП gateway_stop рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ.
plugin-owned runtime services рдХреЗ рд▓рд┐рдП internal gateway:startup hook рдкрд░ рдирд┐рд░реНрднрд░ рди рд░рд╣реЗрдВ.
cron_changed gateway-owned cron lifecycle events рдХреЗ рд▓рд┐рдП typed
event payload рдХреЗ рд╕рд╛рде fire рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ added, updated, removed, started, finished,
рдФрд░ scheduled reasons cover рд╣реЛрддреЗ рд╣реИрдВ. event рдореЗрдВ рдПрдХ PluginHookGatewayCronJob
snapshot рд╣реЛрддрд╛ рд╣реИ (рдЬрд┐рд╕рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдкрд░ state.nextRunAtMs, state.lastRunStatus, рдФрд░
state.lastError рд╢рд╛рдорд┐рд▓ рд╣реИрдВ) рд╕рд╛рде рд╣реА PluginHookGatewayCronDeliveryStatus
not-requested | delivered | not-delivered | unknown рд╣реЛрддрд╛ рд╣реИ. Removed
events рдореЗрдВ рдЕрднреА рднреА deleted job snapshot рд╣реЛрддрд╛ рд╣реИ рддрд╛рдХрд┐ external schedulers
state reconcile рдХрд░ рд╕рдХреЗрдВ. external wake schedulers sync рдХрд░рддреЗ рд╕рдордп runtime
context рд╕реЗ ctx.getCron?.() рдФрд░ ctx.config рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдФрд░ due checks рддрдерд╛ execution рдХреЗ рд▓рд┐рдП OpenClaw рдХреЛ
source of truth рдмрдирд╛рдП рд░рдЦреЗрдВ.
рдЖрдЧрд╛рдореА deprecations
рдХреБрдЫ hook-adjacent surfaces deprecated рд╣реИрдВ рд▓реЗрдХрд┐рди рдЕрднреА рднреА supported рд╣реИрдВ. рдЕрдЧрд▓реЗ major release рд╕реЗ рдкрд╣рд▓реЗ migrate рдХрд░реЗрдВ:
- Plaintext channel envelopes
inbound_claimрдФрд░message_receivedhandlers рдореЗрдВ. flat envelope text parse рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдпBodyForAgentрдФрд░ structured user-context blocks рдкрдврд╝реЗрдВ. рджреЗрдЦреЗрдВ Plaintext channel envelopes тЖТ BodyForAgent. before_agent_startcompatibility рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ. рдирдП plugins рдХреЛ combined phase рдХреЗ рдмрдЬрд╛рдпbefore_model_resolveрдФрд░before_prompt_buildрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП.subagent_spawningрдкреБрд░рд╛рдиреЗ plugins рдХреЗ рд╕рд╛рде compatibility рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирдП plugins рдХреЛ рдЗрд╕рд╕реЗ thread routing return рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП. Coresubagent_spawnedfire рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ channel session-binding adapters рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗthread: truesubagent bindings prepare рдХрд░рддрд╛ рд╣реИ.deactivate2026-08-16 рдХреЗ рдмрд╛рдж рддрдХ deprecated cleanup compatibility alias рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ. рдирдП plugins рдХреЛgateway_stopрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП.onResolutioninbefore_tool_callрдЕрдм free-formstringрдХреЗ рдмрдЬрд╛рдп typedPluginApprovalResolutionunion (allow-once/allow-always/deny/timeout/cancelled) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ.
рдкреВрд░реА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП - memory capability registration, provider thinking
profile, external auth providers, provider discovery types, task runtime
accessors, рдФрд░ command-auth тЖТ command-status rename - рджреЗрдЦреЗрдВ
Plugin SDK migration тЖТ Active deprecations.
рд╕рдВрдмрдВрдзрд┐рдд
- Plugin SDK migration - active deprecations рдФрд░ removal timeline
- Building plugins
- Plugin SDK overview
- Plugin entry points
- Internal hooks
- Plugin architecture internals