Building plugins

Plugin рд╣реБрдХреНрд╕

Plugin рд╣реБрдХ OpenClaw Plugin рдХреЗ рд▓рд┐рдП рдЗрди-рдкреНрд░реЛрд╕реЗрд╕ рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБ рд╣реИрдВред рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд░реЗрдВ рдЬрдм рдХрд┐рд╕реА Plugin рдХреЛ рдПрдЬреЗрдВрдЯ рд░рди, рдЯреВрд▓ рдХреЙрд▓, рд╕рдВрджреЗрд╢ рдкреНрд░рд╡рд╛рд╣, рд╕реЗрд╢рди рд▓рд╛рдЗрдлрд╕рд╛рдЗрдХрд▓, рд╕рдмрдПрдЬреЗрдВрдЯ рд░реВрдЯрд┐рдВрдЧ, рдЗрдВрд╕реНрдЯреЙрд▓, рдпрд╛ Gateway рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдмрджрд▓рдирд╛ рд╣реЛред

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдВрддрд░рд┐рдХ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрдм рдЖрдкрдХреЛ рдХрдорд╛рдВрдб рдФрд░ Gateway рдЗрд╡реЗрдВрдЯреНрд╕ рдЬреИрд╕реЗ /new, /reset, /stop, agent:bootstrap, рдпрд╛ gateway:startup рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдСрдкрд░реЗрдЯрд░-рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ HOOK.md рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд╛рд╣рд┐рдПред

рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд

рдЕрдкрдиреЗ Plugin рдПрдВрдЯреНрд░реА рд╕реЗ api.on(...) рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП Plugin рд╣реБрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ:

typescript
 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 рдХреЛрдб рдкреИрдЪ рдХрд┐рдП рдмрд┐рдирд╛ рднреА рд╣реБрдХ рдмрдЬрдЯ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

json
{  "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 - рд╕реЗрд╢рди рд▓рд╛рдЗрдлрд╕рд╛рдЗрдХрд▓ рд╕реАрдорд╛рдУрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░реЗрдВред рдЗрд╡реЗрдВрдЯ рдХрд╛ reason new, 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_ended targetSessionKey (рдкрд╣рдЪрд╛рди тАФ рдпрд╣ 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.toolName
  • event.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

рдпрд╣ рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ:

typescript
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.sessionKey
  • event.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 (рдЬреИрд╕реЗ Feishu open_id, Discord user ID)ред рддрдм populated рд╣реЛрддрд╛ рд╣реИ рдЬрдм run known sender metadata рд╡рд╛рд▓реЗ user message рд╕реЗ originate рд╣реЛрддрд╛ рд╣реИред
  • ctx.chatId тАФ transport-native conversation identifier (рдЬреИрд╕реЗ Feishu chat_id, Telegram chat_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 рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

ts
declare module "openclaw/plugin-sdk/channel-inbound" {  interface PluginHookChannelSenderContext {    unionId?: string;    userId?: string;  }}

Channel plugins рдЙрди fields рдХреЛ inbound SDK helper рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ pass рдХрд░рддреЗ рд╣реИрдВ:

ts
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 рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

typescript
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 рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

json
{  "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: content rewrite рдХрд░реЗрдВ рдпрд╛ { cancel: true } рд▓реМрдЯрд╛рдПрдВред
  • reply_payload_sending: normalized ReplyPayload objects (рдЬрд┐рд╕рдореЗрдВ 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_sending payload normalization рдХреЗ рдмрд╛рдж рдФрд░ channel delivery рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ originating channel рдкрд░ рд╡рд╛рдкрд╕ route рдХрд┐рдП рдЧрдП replies рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ. Handlers рдХреНрд░рдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ handler рдЙрдЪреНрдЪ-рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реЗ handlers рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдирд╡реАрдирддрдо payload рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ.
  • reply_payload_sending payloads runtime trust markers рдЬреИрд╕реЗ trustedLocalMedia рдХреЛ expose рдирд╣реАрдВ рдХрд░рддреЗ; plugins payload shape edit рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди local media trust grant рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ.
  • message_sending cancellation рдХреЗ рд╕рд╛рде cancelReason рдФрд░ рд╕реАрдорд┐рдд metadata рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ. рдирдП message lifecycle APIs рдЗрд╕реЗ reason cancelled_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_received handlers рдореЗрдВ. flat envelope text parse рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп BodyForAgent рдФрд░ structured user-context blocks рдкрдврд╝реЗрдВ. рджреЗрдЦреЗрдВ Plaintext channel envelopes тЖТ BodyForAgent.
  • before_agent_start compatibility рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ. рдирдП plugins рдХреЛ combined phase рдХреЗ рдмрдЬрд╛рдп before_model_resolve рдФрд░ before_prompt_build рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП.
  • subagent_spawning рдкреБрд░рд╛рдиреЗ plugins рдХреЗ рд╕рд╛рде compatibility рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирдП plugins рдХреЛ рдЗрд╕рд╕реЗ thread routing return рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП. Core subagent_spawned fire рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ channel session-binding adapters рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ thread: true subagent bindings prepare рдХрд░рддрд╛ рд╣реИ.
  • deactivate 2026-08-16 рдХреЗ рдмрд╛рдж рддрдХ deprecated cleanup compatibility alias рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ. рдирдП plugins рдХреЛ gateway_stop рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП.
  • onResolution in before_tool_call рдЕрдм free-form string рдХреЗ рдмрдЬрд╛рдп typed PluginApprovalResolution union (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.

рд╕рдВрдмрдВрдзрд┐рдд

Was this useful?
On this page

On this page